如何在 Theano 中对共享变量执行条件更新?
How to perform conditional updates on shared variables in Theano?
有没有办法根据当前函数的结果有条件地更新共享变量。
例如
g_W = T.grad(cost=classifier.cost,wrt=classifier.W)
updates=[(W,W-learning_rate*g_W)]
model = theano.function([index],outputs=cost,updates=updates)
在此模型中,仅当成本大于 0 时,我才需要更新权重参数。函数中有一个 no_default_updates 参数,但不适用于 'updates' 参数.
您可以使用符号条件运算。 Theano 有两个:switch
和 ifelse
。 switch
是按元素执行的,而 ifelse
更像是传统的条件语句。有关更多信息,请参阅 documentation。
这是一个仅在成本为正时才更新参数的示例。
import numpy
import theano
import theano.tensor as tt
def compile(input_size, hidden_size, output_size, learning_rate):
w_h = theano.shared(numpy.random.standard_normal((input_size, hidden_size))
.astype(theano.config.floatX), name='w_h')
b_h = theano.shared(numpy.random.standard_normal((hidden_size,))
.astype(theano.config.floatX), name='b_h')
w_y = theano.shared(numpy.random.standard_normal((hidden_size, output_size))
.astype(theano.config.floatX), name='w_y')
b_y = theano.shared(numpy.random.standard_normal((output_size,))
.astype(theano.config.floatX), name='b_y')
x = tt.matrix()
z = tt.vector()
h = tt.tanh(theano.dot(x, w_h) + b_h)
y = theano.dot(h, w_y) + b_y
c = tt.sum(y - z)
updates = [(p, p - tt.switch(tt.gt(c, 0), learning_rate * tt.grad(cost=c, wrt=p), 0))
for p in (w_h, b_h, w_y, b_y)]
return theano.function([x, z], outputs=c, updates=updates)
def main():
f = compile(input_size=3, hidden_size=2, output_size=4, learning_rate=0.01)
main()
在这种情况下,可以使用 switch
或 ifelse
,但在这种情况下 switch
通常更可取,因为 ifelse
似乎没有得到很好的支持Theano 框架,需要特殊导入。
有没有办法根据当前函数的结果有条件地更新共享变量。 例如
g_W = T.grad(cost=classifier.cost,wrt=classifier.W)
updates=[(W,W-learning_rate*g_W)]
model = theano.function([index],outputs=cost,updates=updates)
在此模型中,仅当成本大于 0 时,我才需要更新权重参数。函数中有一个 no_default_updates 参数,但不适用于 'updates' 参数.
您可以使用符号条件运算。 Theano 有两个:switch
和 ifelse
。 switch
是按元素执行的,而 ifelse
更像是传统的条件语句。有关更多信息,请参阅 documentation。
这是一个仅在成本为正时才更新参数的示例。
import numpy
import theano
import theano.tensor as tt
def compile(input_size, hidden_size, output_size, learning_rate):
w_h = theano.shared(numpy.random.standard_normal((input_size, hidden_size))
.astype(theano.config.floatX), name='w_h')
b_h = theano.shared(numpy.random.standard_normal((hidden_size,))
.astype(theano.config.floatX), name='b_h')
w_y = theano.shared(numpy.random.standard_normal((hidden_size, output_size))
.astype(theano.config.floatX), name='w_y')
b_y = theano.shared(numpy.random.standard_normal((output_size,))
.astype(theano.config.floatX), name='b_y')
x = tt.matrix()
z = tt.vector()
h = tt.tanh(theano.dot(x, w_h) + b_h)
y = theano.dot(h, w_y) + b_y
c = tt.sum(y - z)
updates = [(p, p - tt.switch(tt.gt(c, 0), learning_rate * tt.grad(cost=c, wrt=p), 0))
for p in (w_h, b_h, w_y, b_y)]
return theano.function([x, z], outputs=c, updates=updates)
def main():
f = compile(input_size=3, hidden_size=2, output_size=4, learning_rate=0.01)
main()
在这种情况下,可以使用 switch
或 ifelse
,但在这种情况下 switch
通常更可取,因为 ifelse
似乎没有得到很好的支持Theano 框架,需要特殊导入。