Torch实现ReQU,和梯度验证

重写函数

我们使用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 
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值