在 Theano 中更新共享变量的一部分
Updating part of a shared variable in Theano
如何在 Theano 中更新部分共享变量?
例如而不是做:
gradient_W = T.grad(cost,W)
updates.append((W, W-learning_rate*gradient_W))
train = th.function(inputs=[index], outputs=[cost], updates=updates,
givens={x:self.X[index:index+mini_batch_size,:]})
我只想更新 W
的一部分,例如仅第一列:
updates.append((W[:, 0], W[:, 0]-learning_rate*gradient_W))
但是这样做会报错TypeError: ('update target must be a SharedVariable', Subtensor{::, int64}.0)
:
Traceback (most recent call last):
File "ae.py", line 330, in <module>
main()
File "ae.py", line 305, in main
ae.train(n_epochs=n_epochs, mini_batch_size=100, learning_rate=0.002, train_data= train_sentence_embeddings, test_data= test_sentence_embeddings)
File "ae.py", line 87, in train
givens={x:self.X[index:index+mini_batch_size,:]})
File "/usr/local/lib/python2.7/dist-packages/theano/compile/function.py", line 266, in function
profile=profile)
File "/usr/local/lib/python2.7/dist-packages/theano/compile/pfunc.py", line 489, in pfunc
no_default_updates=no_default_updates)
File "/usr/local/lib/python2.7/dist-packages/theano/compile/pfunc.py", line 194, in rebuild_collect_shared
store_into)
TypeError: ('update target must be a SharedVariable', Subtensor{::, int64}.0)
在 Theano 中这样做的典型方法是什么?
W
是典型的权重矩阵:
initial_W = np.asarray(rng.uniform(
low=-4 * np.sqrt(6. / (self.hidden_size + self.n)),
high=4 * np.sqrt(6. / (self.hidden_size + self.n)),
size=(self.n, self.hidden_size)), dtype=th.config.floatX)
W = th.shared(value=initial_W, name='W', borrow=True)
您可以使用例如theano.tensor.set_subtensor
.
采用您上面提到的更新行,这变成:
updates.append((W, T.set_subtensor(W[:, 0], W[:, 0]-learning_rate*gradient_W)))
其中 T = theano.tensor
.
另一种可能性,在你的情况下更简洁一点,是 T.inc_subtensor
,你只指定增量而不是新值:
updates.append((W, T.inc_subtensor(W[:, 0], -learning_rate*gradient_W)))
如何在 Theano 中更新部分共享变量?
例如而不是做:
gradient_W = T.grad(cost,W)
updates.append((W, W-learning_rate*gradient_W))
train = th.function(inputs=[index], outputs=[cost], updates=updates,
givens={x:self.X[index:index+mini_batch_size,:]})
我只想更新 W
的一部分,例如仅第一列:
updates.append((W[:, 0], W[:, 0]-learning_rate*gradient_W))
但是这样做会报错TypeError: ('update target must be a SharedVariable', Subtensor{::, int64}.0)
:
Traceback (most recent call last):
File "ae.py", line 330, in <module>
main()
File "ae.py", line 305, in main
ae.train(n_epochs=n_epochs, mini_batch_size=100, learning_rate=0.002, train_data= train_sentence_embeddings, test_data= test_sentence_embeddings)
File "ae.py", line 87, in train
givens={x:self.X[index:index+mini_batch_size,:]})
File "/usr/local/lib/python2.7/dist-packages/theano/compile/function.py", line 266, in function
profile=profile)
File "/usr/local/lib/python2.7/dist-packages/theano/compile/pfunc.py", line 489, in pfunc
no_default_updates=no_default_updates)
File "/usr/local/lib/python2.7/dist-packages/theano/compile/pfunc.py", line 194, in rebuild_collect_shared
store_into)
TypeError: ('update target must be a SharedVariable', Subtensor{::, int64}.0)
在 Theano 中这样做的典型方法是什么?
W
是典型的权重矩阵:
initial_W = np.asarray(rng.uniform(
low=-4 * np.sqrt(6. / (self.hidden_size + self.n)),
high=4 * np.sqrt(6. / (self.hidden_size + self.n)),
size=(self.n, self.hidden_size)), dtype=th.config.floatX)
W = th.shared(value=initial_W, name='W', borrow=True)
您可以使用例如theano.tensor.set_subtensor
.
采用您上面提到的更新行,这变成:
updates.append((W, T.set_subtensor(W[:, 0], W[:, 0]-learning_rate*gradient_W)))
其中 T = theano.tensor
.
另一种可能性,在你的情况下更简洁一点,是 T.inc_subtensor
,你只指定增量而不是新值:
updates.append((W, T.inc_subtensor(W[:, 0], -learning_rate*gradient_W)))