我有我的主要计算流程,我可以使用
进行训练train = theano.function(inputs=[x], outputs=[cost], updates=updates)
同样,我有预测功能
predict = theano.function(inputs=[x], outputs=[output])
这两个函数都接受输入x
并通过相同的计算图发送它。
我现在想修改一些东西,以便在训练时,我可以使用嘈杂的输入进行训练,所以我有类似的东西
input = get_corrupted_input(self.theano_rng, x, 0.5)
在计算开始时。
但这也会影响我的predict
函数,因为它的输入也会被破坏。如何为train
和predict
重复使用相同的代码,但只为前者提供嘈杂的输入?
答案 0 :(得分:1)
您可以像这样组织代码:
import numpy
import theano
import theano.tensor as tt
import theano.tensor.shared_randomstreams
def get_cost(x, y):
return tt.mean(tt.sum(tt.sqr(x - y), axis=1))
def get_output(x, w, b_h, b_y):
h = tt.tanh(tt.dot(x, w) + b_h)
y = tt.dot(h, w.T) + b_y
return y
def corrupt_input(x, corruption_level):
rng = tt.shared_randomstreams.RandomStreams()
return rng.binomial(size=x.shape, n=1, p=1 - corruption_level,
dtype=theano.config.floatX) * x
def compile(input_size, hidden_size, corruption_level, learning_rate):
x = tt.matrix()
w = theano.shared(numpy.random.randn(input_size,
hidden_size).astype(theano.config.floatX))
b_h = theano.shared(numpy.zeros(hidden_size, dtype=theano.config.floatX))
b_y = theano.shared(numpy.zeros(input_size, dtype=theano.config.floatX))
cost = get_cost(x, get_output(corrupt_input(x, corruption_level), w, b_h, b_y))
updates = [(p, p - learning_rate * tt.grad(cost, p)) for p in (w, b_h, b_y)]
train = theano.function(inputs=[x], outputs=cost, updates=updates)
predict = theano.function(inputs=[x], outputs=get_output(x, w, b_h, b_y))
return train, predict
def main():
train, predict = compile(input_size=3, hidden_size=2,
corruption_level=0.2, learning_rate=0.01)
main()
请注意get_output
被调用两次。对于train
函数,它提供了损坏的输入,但对于predict
函数,它提供了干净的输入。 get_output
需要包含"相同的计算图表"你谈到的。我只是在那里放了一个小型自动编码器,但你可以放任意的东西。
假设损坏的输入与输入具有相同的形状,get_output
函数不会关心其输入是x
还是x
的损坏版本。因此get_output
可以共享,但不需要包含损坏代码。