【损失函数:2】Charbonnier Loss、SSIM Loss(附Pytorch实现)

损失函数

写在前面

下面介绍各个函数时,涉及到一下2变量,其含义如下:假设网络输入为x,输出为y ‾ \overline{\text{y}}y ​=f(x),x的真实标签为y,其中:

【损失函数:2】Charbonnier Loss、SSIM Loss(附Pytorch实现)
上述定义中的N通常表示一个批次中所包含的样本数量,因为在网络训练时我们通常是逐批次送入网络训练,每个批次计算一次损失,然后进行参数更新。

; 一、Charbonnier损失

参考文章链接:http://xxx.itp.ac.cn/pdf/1710.01992

【损失函数:2】Charbonnier Loss、SSIM Loss(附Pytorch实现)
参考文章适用于图像超分辨任务,对于普通的有监督任务,Charbonnier Loss可定义为如下形式:
【损失函数:2】Charbonnier Loss、SSIM Loss(附Pytorch实现)

其中,

【损失函数:2】Charbonnier Loss、SSIM Loss(附Pytorch实现)

主要看一下(-1,1)这个区间内Charbonnier Loss的曲线,我们知道L1损失存在不可导点y-y_=0(见https://blog.csdn.net/qq_43665602/article/details/127037761),而Charbonnier Loss通过引入常量epslion解决了L1的缺陷,曲线在y-y_接近0的地方也可导。在此区间之外,该函数曲线近似L1损失,相比L2损失而言,对异常值不敏感,避免过分放大误差。

【损失函数:2】Charbonnier Loss、SSIM Loss(附Pytorch实现)

1)代码实现


class CharbonnierLoss(nn.Module):
    def __init__(self,epsilon=1e-3):
        super(CharbonnierLoss, self).__init__()
        self.epsilon2=epsilon*epsilon

    def forward(self,x):
        value=torch.sqrt(torch.pow(x,2)+self.epsilon2)
        return torch.mean(value)
creation=CharbonnierLoss()
loss=creation(y_-y)
print(loss)

`python
tensor([[6., 6., 6., 8., 3., 6., 6., 7., 0., 5.],
[6., 9., 7., 1., 5., 5., 6., 2., 7., 0.],
[0., 4., 4., 6., 9., 1., 1., 4., 6., 0.],
[8., 5., 8., 1., 7., 5., 9., 1., 4., 7.]])
tensor([[9., 4., 9., 7., 5., 5., 5., 4., 9., 6.],
[5., 4., 8., 8., 3., 2., 7., 4., 2., 8.],
[2., 1., 5., 3., 1., 1., 3., 9., 5., 9.],
[8., 8., 1., 0., 1., 5., 9., 8., 9., 0.]])

Original: https://blog.csdn.net/qq_43665602/article/details/127041832
Author: NorthSmile
Title: 【损失函数:2】Charbonnier Loss、SSIM Loss(附Pytorch实现)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/708868/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球