pytorch下可训练分段函数的写法

pytorch下可训练分段函数的写法


这篇博客主要讲如何写一个可训练求导的分段函数,并通过代码验证其可行性


假设我们要实现这样一个分段函数:

F ( a ) = { + 1 a > 2.5 0.25 ∗ a + 0.375 0.5 < a ≤ 2.5 a − 0.5 < a ≤ 0.5 0.25 ∗ a − 0.375 − 2.5 < a ≤ − 0.5 − 1 a ≤ − 2.5 F(a)=\left\{ \begin{array}{rcl} +1 & & {a > 2.5}\\ 0.25*a + 0.375 & & {0.5 < a \leq 2.5}\\ a & & {-0.5 < a \leq 0.5}\\ 0.25*a - 0.375 & & {-2.5 < a \leq -0.5}\\ -1 & & {a \leq -2.5} \end{array} \right. Fa=+10.25a+0.375a0.25a0.3751a>2.50.5<a2.50.5<a0.52.5<a0.5a2.5

首先我们生成一个分布涵盖这5个区间的张量:

import torch
a = torch.tensor([-3, -1.5, 0.1, 2.3, 5])
a.requires_grad = True

第二步,分别求出他们的区间:

b1 = a <= -2.5
b2 = (a <= -0.5)  & (a > -2.5)
b3 = (a <= 0.5) & (a > - 0.5)
b4 = (a <= 2.5) & (a >  0.5)
b5 = a > 2.5

运行结果如图所示
在这里插入图片描述
符合区间的条件的位置为TRUE,不符合的为FALSE

第三步,五种分段函数的计算:

a1 = -1
a2 = 0.25 * a - 0.375
a3 = a
a4 = 0.25 * a + 0.375
a5 = 1

a1 = a1 * b1  #和对应区间相乘
a2 = a2 * b2
a3 = a3 * b3
a4 = a4 * b4
a5 = a5 * b5

运行结果如图所示
在这里插入图片描述
这样,函数计算的值只在自己的区间内有效,其余地方为0;最后我们再将这五个加起来就完成了分段函数的计算:

c = a1 + a2 + a3 + a4 + a5

运行结果如图所示
在这里插入图片描述
接下来我们通过反向求导验算一下:

c.backward(torch.tensor([1.,1.,1.,1.,1.]))

backward()中参数的含义,可以参考这篇博客:Pytorch中loss.backward(),loss为矢量时,对参数的理解

ok,我们输出a的梯度试试

在这里插入图片描述
验算正确,这样就实现了pytorch下分段函数的可训练

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮皮宽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值