这是终篇,记录一些坑吧以及易错点之类的吧,以前也记录了一点儿。
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的对应位置的值被置成自定义数字.