[3] 的一个简例。正向 sign: y = sign ( x ) = { − 1 x < 0 0 x = 0 1 x > 0 y=\text{sign}(x)=\begin{cases} & -1 & x < 0 \\ & 0 & x = 0 \\ & 1 & x > 0 \end{cases} y=sign(x)=⎩⎪⎨⎪⎧−101x<0x=0x>0 反向 Htanh: ∂ y ∂ x = { 1 − ϵ ≤ x ≤ ϵ 0 e l s e \frac{\partial y}{\partial x}=\begin{cases} & 1 & -\epsilon\le x\le \epsilon \\ & 0 & else \end{cases} ∂x∂y={10−ϵ≤x≤ϵelse
Code
import torch
class Htanh(torch.autograd.Function):
@staticmethod
def forward(ctx, x, epsilon=1):
ctx.save_for_backward(x.data, torch.tensor(epsilon))
return x.sign()
@staticmethod
def backward(ctx, dy):
x, epsilon = ctx.saved_tensors
dx = torch.where((x < - epsilon) | (x > epsilon), torch.zeros_like(dy), dy)
return dx, None
- 用例
htanh = Htanh()
x = torch.tensor([-2.5, -1.6, 0, 3.6, 4.7])
y = htanh.apply(x)
本文介绍了如何在PyTorch中定义一个自定义的激活函数——Htanh,该函数结合了sign函数的正向特性与tanh的平滑导数。Htanh在x接近0时导数为1,其他情况下导数为0,适用于某些特定的神经网络结构。代码示例展示了Htanh函数的前向传播和反向传播实现,并给出了使用示例。此外,还提到了Binarized Neural Networks的相关内容。
3084

被折叠的 条评论
为什么被折叠?



