pytorch_神经网络模型搭建系列(4):自定义损失函数

本文详细介绍了PyTorch中nn.Module和nn.Functional的区别与联系,强调在不涉及学习参数时推荐使用nn.Module。此外,文章还探讨了如何自定义损失函数,提供了三种实现方法,并通过代码示例展示了它们的使用。nn.Module适合维护状态和存储参数,而nn.Functional更适合简单的函数操作。最后,文章给出了自定义损失函数的实战应用,展示了一个简单的神经网络训练过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、自定义损失函数

前言:

首先,回顾一下上一次的核心内容:使用nn.Mudule来自定义激活函数,以及为激活函数设置可进行训练的参数,也就是参数化的激活函数

  • 在深度学习框架PyTorch中已经内置了很多激活函数,如ReLU等

  • 但是有时根据个人需要,需要自定义激活函数,甚至需要为激活函数添加可学习的参数,如PReLU,具体参见PyTorch官方github激活函数源码实现

  • 对于不需要可学习参数的激活函数的实现,比较简单,具体见PyTorch官网教程的一个例子

之前已经说过了pytorch自定义神经网络模型、自定义神经网络层、自定义激活函数,整个神经网络正向传播的搭建过程已经逐渐完整了,下面再说一说反向传播和训练的过程。

这次主要内容:

  • nn.Module 和 nn.Functional 区别和联系

  • 自定义损失函数

import warnings
from typing import Tuple, Optional

import torch
from torch import Tensor
from .linear import _LinearWithBias
from torch.nn.init import xavier_uniform_
from torch.nn.init import constant_
from torch.nn.init import xavier_normal_
from torch.nn.parameter import Parameter
from .module import Module
from .. import functional as F
  • 在深度学习框架PyTorch中已经内置了很多激活函数,如ReLU等

  • 但是有时根据个人需要,需要自定义激活函数,甚至需要为激活函数添加可学习的参数,如PReLU,具体参见PyTorch官方github激活函数源码实现

  • 对于不需要可学习参数的激活函数的实现,比较简单,具体见PyTorch官网教程的一个例子

1.1 nn.Module和nn.Functional的区别与联系

主要参考资料为:

知乎解答

pytorch论坛

1.1.1 二者的相似之处

  • nn.Xxx和nn.functional.xxx的实际功能是相同的,即nn.Conv2d和nn.functional.conv2d 都是进行卷积,nn.Dropout 和nn.functional.dropout都是进行dropout,等等;

  • 运行效率也是近乎相同

但是,在不涉及可学习的参数情况下,推荐使用nn.Xxx,因为:

  • nn.functional.xxx只是函数接口,只涉及一些运算操作,但无法保留参数的信息

  • nn.Xxx是nn.functional.xxx的类封装,并且nn.Xxx都继承于一个共同祖先nn.Module

  • nn.Xxx除了具有nn.functional.xxx功能之外,内部附带了nn.Module相关的属性和方法,例如train(), eval(),load_state_dict, state_dict等

1.1.2 二者的差别之处

1.1.2.1 调用方式

nn.Xxx

  • 需要先实例化并传入参数,然后以函数调用的方式调用实例化的对象并传入输入数据
inputs = torch.rand(64, 3, 244, 244)
conv = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, padding=1)
out = conv(inputs)
`nn.functional.xxx`
- 需要同时传入输入数据和weight, bias等其他参数
1.1.2.2 与nn.Sequential的结合运用
  • nn.Xxx继承于nn.Module, 能够很好的与nn.Sequential结合使用,

  • nn.functional.xxx无法与nn.Sequential结合使用

fm_layer = nn.Sequential(
            nn.Conv2d(3, 64, kernel_size=3, padding=1),
            nn.BatchNorm2d(num_features=64),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2),
            nn.Dropout(0.2)
  )

1.1.2.3 参数的管理
  • nn.Xxx不需要你自己定义和管理weight;

  • nn.functional.xxx需要你自己定义weight,每次调用的时候都需要手动传入weight, 不利于代码复用

(1)使用nn.Xxx定义一个CNN

class CNN(nn.Module):
        
    def __init__(self):
        super(CNN, self).__init__()
        
        self.cnn1 = nn.Conv2d(in_channels=1,  out_channels=16, kernel_size=5,padding=0)
        self.relu1 = nn.ReLU()
        self.maxpool1 = nn.MaxPool2d(kernel_size=2)
        
        self.cnn2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=5,  padding=
神经网络可以使用自定义损失函数来解决复杂的问题。自定义损失函数可以根据具体的业务需求来定义,以更好地衡量模型的性能。在定义自定义损失函数时,可以考虑多个因素,如成本和利润之间的差异。 一个常见的例子是预测商品销量的问题。在这种情况下,预测多了会导致成本增加,预测少了会导致利润减少。如果利润和成本不相等,使用均方误差(MSE)作为损失函数可能无法最大化利益。 为了解决这个问题,可以自定义损失函数来衡量成本和利润之间的差异。一种可能的方法是使用条件语句来计算损失。例如,可以使用tf.where函数来比较预测值和标准答案,并根据差异选择不同的损失函数。具体而言,可以使用tf.greater函数来比较预测值和标准答案,然后根据结果选择不同的损失函数(如COSE和PROFIT)。最后,将所有损失求和得到最终的损失值。 总之,神经网络可以使用自定义损失函数来解决复杂的问题,如预测商品销量。自定义损失函数可以根据具体的业务需求来定义,以更好地衡量模型的性能。 #### 引用[.reference_title] - *1* *3* [神经网络优化(损失函数自定义损失函数、交叉熵、softmax())](https://blog.youkuaiyun.com/weixin_36670529/article/details/108401445)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [pytorch_神经网络模型搭建系列4):自定义损失函数](https://blog.youkuaiyun.com/xgxg1314/article/details/111304860)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值