我有一个多次调用的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)
这对共享变量也有可能吗?
答案 0 :(得分: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设置为'ignore'才能使用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()
它应该有效,至少我是如何解决它的。
答案 1 :(得分:1)
目前,使用不同的共享变量重用Theano函数并不容易。
但你有其他选择: