Torch7入门续集(八)---终结篇----不再写Torch博客了,反正就是难受

这是终篇,记录一些坑吧以及易错点之类的吧,以前也记录了一点儿。
Torch代码书写时可能碰到的一些问题
有些重要的值得注意的地方,会慢慢加到这里,作为参考。

  • 第一次更新:2017-4-20
  • 第二次更新:2017-4-21
  • 第三次更新:2017-4-24 :增加mask操作的三维示例
  • 第四次更新: 2017-10-31: 增加“attempt to index field ‘THNN’ (a nil value)”解决。

1. 自定义层必须return self.output或是self.gradInput形式。

function CustomizedLayer:updateOutput(input)
    print('updateGradInput'..self.cls)
    -- other code and get tmp
    self.output = tmp
    return self.output
end

function CustomizedLayer:updateGradInput(input, gradOutput)
    print('updateGradInput'..self.cls)
    self.gradInput = gradOutput
    return self.gradInput
end

输出

updateOutput..output 208554.015625
#然而在net:forward(input)后,得到的
..latent after customizedLayer: 0

因此不能直接return tmp 或是return gradOutput。否则网络的输出实际上是0!即使是在updateGradInput直接返回gradOutput,或是updateOutput直接输出input, 都必须要转换为self.gradInput 和 self.output。值得注意的是,返回值也可以是多个的。比如

...
function cLayer:updateOutput(input)
   ...
   return self.ouput, self.k
end

2. lua的三元运算符

lua默认参数当然很简单

function myFun(a)
    p = a or 1 -- 用or来
end

但是有时候你看见

k = a and b or c

这就是三元运算符,类似C中的 k = a ? b : c

a = 1
b = a == 1 and 2 or 0  --输出2

a = 3
b = a == 1 and 2 or 0  --输出0

[]进行Tensor取值补充

a = torch.Tensor(6,3,4,5)
--下面4种写法等价
b = a[{
  {
  1},{
  1,3},{
  1,4},{
  1,5}] -- 1*3*4*5
b = a[{
  {
  1},{},{},{}] -- 1*3*4*5
b = a[1] -- 取第一行 3*4*5 会减维

[ByteTensor]进行mask操作

有时候我们希望在tensor的某些位置提取出来,这些位置不要求是矩形,可以是任意形状。一般是用让一个mask。要求这个mask必须只能是填充0或1的ByteTensor类型。mask的某个位置为1,那么被mask的tensor的对应位置的值被置成自定义数字.

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值