python – 相对于Theano中的subtensor定义渐变
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 相对于Theano中的subtensor定义渐变,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2788字,纯文字阅读大概需要4分钟。
内容图文
![python – 相对于Theano中的subtensor定义渐变](/upload/InfoBanner/zyjiaocheng/698/60021a26a82b420fbd36f7c0366c78a1.jpg)
我在概念上有一个关于Theano的简单问题,但是我还没有找到答案(我会先前承认并没有真正理解共享变量在Theano中是如何工作的,尽管有很多小时的教程).
我正在尝试实施“反卷积网络”;具体来说,我有一个3张输入(每个输入是一个2D图像)和一个4张量的代码;对于第i个输入代码[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]) ]])
(这里代码和dicts是共享的张量变量). Theano对此不满意,尤其是定义
del_codes = T.grad(loss, codes[idx])
我得到的错误信息是:theano.gradient.DisconnectedInputError:要求grad方法计算相对于不是成本计算图的一部分的变量的梯度,或者仅由不可微运算符使用:Subtensor {int64} .0
我猜它想要一个符号变量而不是代码[idx];但后来我不知道如何让一切都连接起来以获得预期的效果.我猜我需要将最后一行更改为类似的内容
learning_rate*del_codes) ]])
有人可以给我一些关于如何正确定义这个功能的指示吗?我想我可能错过了与Theano合作的基本知识,但我不确定是什么.
提前致谢!
-Justin
更新:凯尔的建议非常好.这是我使用的具体代码
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)
解决方法:
总结一下这些发现:
分配grad_var =代码[idx],然后创建一个新变量,例如:
subgrad = T.set_subtensor(代码[input_index],代码[input_index] – learning_rate * del_codes [input_index])
然后打电话
train_codes = function([input_index],loss,updates = [[codes,subgrad]])
似乎做了伎俩.一般来说,我尝试为尽可能多的事情制作变量.有时在单个语句中尝试做太多会产生棘手的问题,而且以后很难调试和理解!此外,在这种情况下,我认为theano需要一个共享变量,但如果在需要它的函数内创建共享变量,则会出现问题.
很高兴这对你有用!
内容总结
以上是互联网集市为您收集整理的python – 相对于Theano中的subtensor定义渐变全部内容,希望文章能够帮你解决python – 相对于Theano中的subtensor定义渐变所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。