PyTorch自定义梯度

本文介绍了如何在PyTorch中定义一个自定义的激活函数——Htanh,该函数结合了sign函数的正向特性与tanh的平滑导数。Htanh在x接近0时导数为1,其他情况下导数为0,适用于某些特定的神经网络结构。代码示例展示了Htanh函数的前向传播和反向传播实现,并给出了使用示例。此外,还提到了Binarized Neural Networks的相关内容。
部署运行你感兴趣的模型镜像

[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} xy={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)

References

  1. PyTorch: Defining New autograd Functions
  2. tensorflow自定义梯度
  3. Binarized Neural Networks

您可能感兴趣的与本文相关的镜像

PyTorch 2.6

PyTorch 2.6

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

PyTorch自定义梯度可以通过重载 PyTorchautograd.Function 类来实现。具体来说,我们需要定义一个新的类来继承自 autograd.Function,然后实现它的 forward 和 backward 方法。 在 forward 方法中,我们需要定义如何计算前向传播结果。在 backward 方法中,我们需要定义如何计算梯度,并将梯度传递回去。在 backward 方法中,我们可以通过输入的 grad_output 参数获取到反向传播的梯度,然后通过计算得到输入的梯度,并将其返回。 下面是一个简单的例子,演示如何定义一个自定义的 sigmoid 函数,并计算它的梯度: ```python import torch class SigmoidFunction(torch.autograd.Function): @staticmethod def forward(ctx, input): ctx.save_for_backward(input) return 1 / (1 + torch.exp(-input)) @staticmethod def backward(ctx, grad_output): input, = ctx.saved_tensors sigmoid = 1 / (1 + torch.exp(-input)) return grad_output * sigmoid * (1 - sigmoid) x = torch.randn(3, requires_grad=True) sigmoid = SigmoidFunction.apply(x) sigmoid.sum().backward() print(x.grad) ``` 在这个例子中,我们定义了一个 SigmoidFunction 类,并实现了它的 forward 和 backward 方法。在 forward 方法中,我们计算了 sigmoid 函数的值,并将输入保存在 ctx 对象中,以便在反向传播时使用。在 backward 方法中,我们通过计算 sigmoid 的导数,来计算输入的梯度,并将其返回。 最后,我们使用 SigmoidFunction.apply 方法来调用自定义的 sigmoid 函数,并计算它的梯度。我们可以使用 x.grad 来获取 x 的梯度值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值