Pyotorch自定义损失函数

Posted GoAI

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pyotorch自定义损失函数相关的知识,希望对你有一定的参考价值。

pytorch教程之nn.Module类详解——使用Module类来自定义模型

pytorch教程之nn.Module类详解——使用Module类来自定义网络层

1.损失函数知识总结参考:

深度学习笔记总结_GoAI的博客-CSDN博客

PyTorch 笔记.常见的PyTorch损失函数 - 知乎

2.自定义损失函数学习参考:

  1. Loss Function Library - Keras & PyTorch | Kaggle
  2. Pytorch如何自定义损失函数(Loss Function)? - 知乎
  3. pytorch系列12 --pytorch自定义损失函数custom loss function_墨流觞的博客-
  4. 自定义损失函数 - image processing
  5. pytorch教程之损失函数详解——多种定义损失函数的方法

3.定义原始模版:

使用torch.Tensor提供的接口实现:

  1. 继承nn.Module类
  2. 在__init__函数中定义所需要的超参数,在foward函数中定义loss的计算方法。

例子:

    1 	class myLoss(nn.Module):
    2 	    def __init__(self,parameters)
    3 	        self.params = self.parameters
    4 	
    5 	    def forward(self)
    6 	        loss = cal_loss(self.params)
    7 	        return loss

使用:

    1 	criterion=myLoss()
    2 	loss=criterion(……)

4.自定义函数方法

方法一:新建一个类

方案1:只定义loss函数的前向计算公式

在pytorch中定义了前向计算的公式,在训练时它会自动帮你计算反向传播。

class My_loss(nn.Module):

    def __init__(self):

        super().__init__()

    def forward(self, x, y):

        return torch.mean(torch.pow((x - y), 2))

使用:

criterion = My_loss()

loss = criterion(outputs, targets)

方案2:自定义loss函数的forward和backward

from numpy.fft import rfft2, irfft2

class BadFFTFunction(Function):

    def forward(self, input):

        numpy_input = input.numpy()

        result = abs(rfft2(numpy_input))

        return input.new(result)

    def backward(self, grad_output):

        numpy_go = grad_output.numpy()

        result = irfft2(numpy_go)

        return grad_output.new(result)

方法二: 自定义函数

看一自定义类中,其实最终调用还是forward实现,同时nn.Module还要维护一些其他变量和状态。不如直接自定义loss函数实现:

# 直接定义函数 , 不需要维护参数,梯度等信息

# 注意所有的数学操作需要使用tensor完成。

def my_mse_loss(x, y):

    return torch.mean(torch.pow((x - y), 2))

以上是关于Pyotorch自定义损失函数的主要内容,如果未能解决你的问题,请参考以下文章

在具有条件的 keras 中实现自定义损失函数

LogCosh 自定义损失函数返回 nan

在 Keras 中构建自定义损失函数

tensorflow 自定义损失函数示例

Keras 上的自定义损失函数

Keras 自定义损失函数