torch.nn损失函数总结

如果reduction='sum',即对所有元素求和,例如shape=(2,2,3,3),就是在mean下求得的值 * 36.

class torch.nn.L1Loss(size_average=None, reduce=None, reduction='mean')

\left |x_{i,j}-y_{i,j} \right |

class torch.nn.MSELoss(size_average=None, reduce=None, reduction='mean')

\left ( x_{i,j}-y_{i,j} \right )^{2}

class torch.nn.SmoothL1Loss(size_average=None, reduce=None, reduction='mean')

0.5\left ( x_{i,j}-y_{i,j} \right )^{2}   , if \left |x_{i,j}-y_{i,j} \right | < 1

 \left |x_{i,j}-y_{i,j} \right | - 0.5  ,otherwise

----------------------------------------------------分割线

class torch.nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean')

weight应该是一维张量,为每个类分配权重。 当您的训练集不平衡时,此功能特别有用。

 这里假设一共有[0,1,2...j,...n-1] n 个类,class即是标签 y 所属的类别

手动计算过程如下(3个类,标签y1,y2,y3分别为类0,1,1):

​
x = torch.rand((3,3))
y = torch.tensor([0,1,1])

softmax = nn.Softmax(dim=1)
x_softmax = softmax(x)
x_log = torch.log(x_softmax)

>>>tensor([[-0.9632, -1.1211, -1.2297],
        [-1.0468, -1.2794, -0.9923],
        [-1.0947, -0.9512, -1.2762]])

​loss_func = nn.CrossEntropyLoss()
loss_func(x,y)

>>>tensor(1.0646)

然后再按 y 从 x_log 中取值,去掉负号,再求和取平均值,结果就是1.0646

class torch.nn.NLLLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean')

nn.NLLLoss输入是一个对数概率向量和一个目标标签,它与nn.CrossEntropyLoss的关系可以描述为:softmax(x)+log(x)+nn.NLLLoss====>nn.CrossEntropyLoss

class torch.nn.BCELoss(weight=None, size_average=None, reduce=None, reduction='mean')
input = torch.randn(3)
target = torch.tensor([0.,1.,0.])

m = nn.Sigmoid()
loss = nn.BCELoss()

output = loss(m(input), target)

 

Sigmoid函数可以用来解决多标签问题,Softmax函数用来解决单标签问题。也就是说,这里的input,是一个二分类多标签数据,也就是含有3个标签。

class torch.nn.BCEWithLogitsLoss(weight=None, size_average=None, reduce=None, reduction='mean', pos_weight=None)

本质上和nn.BCELoss()没有区别,只是在BCELoss上加了个logits函数(也就是sigmoid函数)

### PyTorch `torch.nn` 模块下损失函数的使用方法及示例 #### 什么是损失函数? 在深度学习中,损失函数是用来衡量模型预测值与真实值之间差异的一种度量工具。通过优化算法最小化损失函数,可以提高模型性能。 #### 常见的 `torch.nn` 损失函数及其用途 以下是几种常见的损失函数以及它们的应用场景: 1. **均方误差损失 (`MSELoss`)** - 应用:回归问题。 - 描述:计算输入张量和目标张量之间的平均平方差。 - 公式:\[ L = \frac{1}{N} \sum_{i=1}^{N}(y_i - \hat{y}_i)^2 \] 这里 \( y_i \) 是目标值,\( \hat{y}_i \) 是预测值[^4]。 ```python import torch import torch.nn as nn criterion = nn.MSELoss() input_tensor = torch.randn(3, requires_grad=True) target_tensor = torch.randn(3) loss = criterion(input_tensor, target_tensor) ``` 2. **交叉熵损失 (`CrossEntropyLoss`)** - 应用:多类分类问题。 - 描述:结合了 softmax 和负对数似然损失(Negative Log Likelihood Loss),通常用于多类别的分类任务。 - 特点:自动应用 softmax 层,因此不需要手动添加 softmax 层到网络结构中[^5]。 ```python import torch import torch.nn as nn criterion = nn.CrossEntropyLoss() # 需要原始分数作为输入 input_tensor = torch.randn(3, 5, requires_grad=True) # batch_size=3, 类别数量=5 target_tensor = torch.empty(3, dtype=torch.long).random_(5) # 正确类别索引 loss = criterion(input_tensor, target_tensor) ``` 3. **二元交叉熵损失 (`BCELoss`)** - 应用:二分类问题。 - 描述:适用于每个样本只有一个输出的情况,且输出经过 sigmoid 函数激活。 - 注意事项:如果未加 sigmoid,则应使用 `BCEWithLogitsLoss` 来替代[^6]。 ```python import torch import torch.nn as nn criterion = nn.BCELoss() sigmoid = nn.Sigmoid() input_tensor = torch.randn(3, requires_grad=True) target_tensor = torch.tensor([0., 1., 1.]) output = sigmoid(input_tensor) loss = criterion(output, target_tensor) ``` 4. **平滑L1损失 (`SmoothL1Loss`)** - 应用:回归问题,尤其是当数据存在异常值时。 - 描述:一种鲁棒性强于 MSE 的损失函数,在较小范围内表现得像 L1 损失,而在较大范围则更接近于 L2 损失[^7]。 ```python import torch import torch.nn as nn criterion = nn.SmoothL1Loss() input_tensor = torch.randn(3, requires_grad=True) target_tensor = torch.randn(3) loss = criterion(input_tensor, target_tensor) ``` --- #### 总结 上述列举了几种常用损失函数的功能、适用场景及简单代码实现。每种损失函数都有其特定的应用领域,选择合适的损失函数对于训练效果至关重要。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值