6

我有一个被多次调用的 Theano 函数,每次都使用不同的共享变量。现在实现的方式是,Theano 函数在每次运行时都会重新定义。我假设这会使整个程序变慢,因为每次定义 Theano 函数时,都会重建图形。

def sumprod_shared(T_shared_array1, T_shared_array2):
    f = theano.function([], (T_shared_array1 * T_shared_array2).sum(axis=0))
    return f()

for factor in range(10):
    m1 = theano.shared(factor * array([[1, 2, 4], [5, 6, 7]]))
    m2 = theano.shared(factor * array([[1, 2, 4], [5, 6, 7]]))
    print sumprod_shared(m1, m2)

对于非共享(正常)变量,我可以定义一次函数,然后用不同的变量调用它而不重新定义。

def sumprod_init():
    T_matrix1 = T.lmatrix('T_matrix1')
    T_matrix2 = T.lmatrix('T_matrix2')
    return theano.function([T_matrix1, T_matrix2], (T_matrix1 * T_matrix2).sum(axis=0))    

sumprod = sumprod_init()
for factor in range(10):
    np_array1 = factor * array([[1, 2, 4], [5, 6, 7]])
    np_array2 = factor * array([[1, 2, 4], [5, 6, 7]])
    print sumprod(np_array1, np_array2)

这对于共享变量也可能吗?

4

2 回答 2

3

为此,您可以在 theano.function 中使用 givens 关键字。基本上,您执行以下操作。

m1 = theano.shared(name='m1', value = np.zeros((3,2)) )
m2 = theano.shared(name='m2', value = np.zeros((3,2)) )

x1 = theano.tensor.dmatrix('x1')
x2 = theano.tensor.dmatrix('x2')

y = (x1*x2).sum(axis=0)
f = theano.function([],y,givens=[(x1,m1),(x2,m2)],on_unused_input='ignore')

然后循环遍历值,您只需将共享变量的值设置为您想要的值。顺便说一句,您必须将 on_unused_input 设置为“忽略”才能在 theano 中使用没有参数的函数。像这样:

array1 = array([[1,2,3],[4,5,6]])
array2 = array([[2,4,6],[8,10,12]])

for i in range(10):
    m1.set_value(i*array1)
    m2.set_value(i*array2)
    print f()

它应该可以工作,至少我是这样解决它的。

于 2013-06-25T11:49:33.330 回答
1

目前,使用不同的共享变量重用 Theano 函数并不容易。

但是你有其他选择:

  1. 真的是瓶颈吗?在示例中,它是,但我认为这是一个简化的案例。唯一知道的方法是对其进行分析。
  2. 您使用第一个共享变量编译 1 个 Theano 函数。然后,您可以在调用 Theano 函数之前对这些共享变量调用 get_value/set_value。这样,您就不需要重新编译 Theano 函数。
于 2013-06-11T13:54:41.687 回答