重写函数
我们使用torch实现我们自己的ReQU模块。在实现一个新的layer之前,我们必须了解,我们并非重写forward和backward方法,而是重写里面调用的其他方法。
1)重新updataOutput方法,从而实现forward方法。
2)重写updataGradInput方法实现部分backward,计算loss函数相对于layer输入的导数,dloss/dx, 根据loss函数相对于layer输出的导数dloss:
3)重写accGradParameters方法实现backward其余部分,计算loss函数相对于权重的导数。
ReQU模块
Rectified Quadratic Unit(ReQU)与sigmoid和ReLU很相似,这个模块作用于每一个元素上:
用矩阵的方式来表达就是:
括号里如果是trues就返回1s,如果是falses就返回0s,中间的符号代表元素级别的乘积
重写updateOutput和updateGradInput模块
在重写模块之前,我们先推导公式,dloss/dx=dloss/dz.*dz/dx=dloss/dz.*2*(x>0).*x
我们首先重写updateOutput函数,这个函数主要计算输入为input时的输出:
function ReQU:updateOutput(input)
self.output:resizeAs(input):copy(input)
self.output:gt(input,0):cmul(input):cmul(input)
return self.output
end
其中self.output:gt(input,0):cmul(input):cmul(input)这一步比较重要,self.output:gt(input,0)目的把input里面值与0比较,大于0设为1,否则设为0,然后通过两次cmul(input),计算得到正确的输出。
我们然后重写updateGradInput函数,这个函数的目的是计算loss函数相对于输入的导数:
function