我有一个关于 Theano 的概念上很简单的问题,但我一直无法找到答案(我会提前承认,我并没有真正理解共享变量在 Theano 中是如何工作的,尽管教程花了很多时间)。
我正在尝试实现“反卷积网络”;具体来说,我有一个 3 张量的输入(每个输入都是一个 2D 图像)和一个 4 张量的代码;对于第 i 个输入,codes[i] 表示一组码字,它们一起为输入 i 编码。
我在弄清楚如何对代码字进行梯度下降时遇到了很多麻烦。以下是我的代码的相关部分:
idx = T.lscalar()
pre_loss_conv = conv2d(input = codes[idx].dimshuffle('x', 0, 1,2),
filters = dicts.dimshuffle('x', 0,1, 2),
border_mode = 'valid')
loss_conv = pre_loss_conv.reshape((pre_loss_conv.shape[2], pre_loss_conv.shape[3]))
loss_in = inputs[idx]
loss = T.sum(1./2.*(loss_in - loss_conv)**2)
del_codes = T.grad(loss, codes[idx])
delc_fn = function([idx], del_codes)
train_codes = function([input_index], loss, updates = [
[codes, T.set_subtensor(codes[input_index], codes[input_index] -
learning_rate*del_codes[input_index]) ]])
(这里的代码和字典是共享的张量变量)。Theano 对此不满意,特别是定义
del_codes = T.grad(loss, codes[idx])
我得到的错误消息是: theano.gradient.DisconnectedInputError: grad 方法被要求计算一个变量的梯度,该变量不是成本计算图的一部分,或者仅由不可微分运算符使用: 子张量{int64}.0
我猜它想要一个符号变量而不是代码[idx]; 但后来我不确定如何将所有东西连接起来以获得预期的效果。我猜我需要将最后一行更改为
learning_rate*del_codes) ]])
有人可以给我一些关于如何正确定义这个函数的指示吗?我想我可能缺少与 Theano 合作的一些基本知识,但我不确定是什么。
提前致谢!
-贾斯汀
更新:凯尔的建议非常有效。这是我使用的具体代码
current_codes = T.tensor3('current_codes')
current_codes = codes[input_index]
pre_loss_conv = conv2d(input = current_codes.dimshuffle('x', 0, 1,2),
filters = dicts.dimshuffle('x', 0,1, 2),
border_mode = 'valid')
loss_conv = pre_loss_conv.reshape((pre_loss_conv.shape[2], pre_loss_conv.shape[3]))
loss_in = inputs[input_index]
loss = T.sum(1./2.*(loss_in - loss_conv)**2)
del_codes = T.grad(loss, current_codes)
train_codes = function([input_index], loss)
train_dicts = theano.function([input_index], loss, updates = [[dicts, dicts - learning_rate*del_dicts]])
codes_update = ( codes, T.set_subtensor(codes[input_index], codes[input_index] - learning_rate*del_codes) )
codes_update_fn = function([input_index], updates = [codes_update])
for i in xrange(num_inputs):
current_loss = train_codes(i)
codes_update_fn(i)