pytorch方法测试——损失函数(CrossEntropyLoss)

博客通过Python代码展示了使用PyTorch的nn.CrossEntropyLoss计算损失的过程,包括单维度和多维度的情况,并手动实现计算进行验证。最后得出CrossEntropyLoss的计算公式,多维度计算时loss为所有维度loss的平均。
部署运行你感兴趣的模型镜像

import torch
import torch.nn as nn
import math
loss = nn.CrossEntropyLoss()
input = torch.randn(1, 5, requires_grad=True)
target = torch.empty(1, dtype=torch.long).random_(5)
output = loss(input, target)

print("输入为5类:")
print(input)
print("要计算loss的类别:")
print(target)
print("计算loss的结果:")
print(output)

first = 0
for i in range(1):
    first -= input[i][target[i]]
second = 0
for i in range(1):
    for j in range(5):
        second += math.exp(input[i][j])
res = 0
res += first +math.log(second)
print("自己的计算结果:")
print(res)
输出为:
输入为5类:
tensor([[ 1.1157,  1.3396,  0.6192,  0.3732,  0.8985]])
要计算loss的类别:
tensor([ 4])
计算loss的结果:
tensor(1.6380)
自己的计算结果:
tensor(1.6380)

多维度测试:


import torch
import torch.nn as nn
import math
loss = nn.CrossEntropyLoss()
input = torch.randn(3, 5, requires_grad=True)
target = torch.empty(3, dtype=torch.long).random_(5)
output = loss(input, target)

print("输入为3个5类:")
print(input)
print("要计算loss的类别:")
print(target)
print("计算loss的结果:")
print(output)

first = [0,0,0]
for i in range(3):
    first[i] -= input[i][target[i]]
second = [0,0,0]
for i in range(3):
    for j in range(5):
        second[i] += math.exp(input[i][j])
res = 0
for i in range(3):
    res += first[i] +math.log(second[i])
print("自己的计算结果:")
print(res/3)
输出为:
输入为3个5类:
tensor([[ 0.0606, -1.1610, -1.2990,  0.2101,  1.5104],
        [-0.6388, -0.4053, -0.4196,  0.7060,  2.2793],
        [ 0.3973,  0.6114, -0.1127, -0.7732, -0.0592]])
要计算loss的类别:
tensor([ 4,  1,  4])
计算loss的结果:
tensor(1.7661)
自己的计算结果:
tensor(1.7661)
结论:
    CrossEntropyLoss计算公式为

    CrossEntropyLoss带权重的计算公式为(默认weight=None)

多维度计算时:loss为所有维度loss的平均。
--------------------- 
作者:tmk_01 
来源:优快云 
原文:https://blog.youkuaiyun.com/tmk_01/article/details/80839810 
版权声明:本文为博主原创文章,转载请附上博文链接!

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

### CrossEntropyLoss(交叉熵损失)的概念及用法 #### 1. 概念解释 交叉熵损失函数是一种常用的多类分类问题中的目标函数,用于衡量预测概率分布与真实标签之间的差异。它通过最大化模型对正确类别的置信度来优化神经网络性能。 在数学上,对于单个样本 \(i\) 的交叉熵定义如下: \[ H(y_i, \hat{y}_i) = -\sum_{c=1}^{C}{y_{ic}\log(\hat{y}_{ic})} \] 其中, - \(y_{ic}\) 是第 \(i\) 个样本的真实标签向量中类别 \(c\) 的值(通常为 one-hot 编码形式),即如果该样本属于类别 \(c\) 则取值为 1,否则为 0; - \(\hat{y}_{ic}\) 表示模型对该样本属于类别 \(c\) 的预测概率[^1]。 当扩展到整个数据集时,则可以表示为所有样本平均后的总误差: \[ L = \frac{1}{N}\sum_{i=1}^{N}-\sum_{c=1}^{C}{y_{ic}\log(\hat{y}_{ic})}. \] #### 2. PyTorch 中的实现方式 PyTorch 提供了一个内置模块 `torch.nn.CrossEntropyLoss()` 来简化这一操作流程。此模块内部自动完成了 softmax 和负对数似然 (Negative Log Likelihood Loss, NLLLoss) 计算两步工作: ```python import torch import torch.nn as nn # 假设输入张量 shape=(batch_size, num_classes),以及 target 张量 shape=(batch_size,) input_tensor = torch.randn(3, 5, requires_grad=True) # batch_size=3, num_classes=5 target_tensor = torch.empty(3, dtype=torch.long).random_(5) loss_function = nn.CrossEntropyLoss() output_loss = loss_function(input_tensor, target_tensor) print(output_loss.item()) ``` 上述代码片段展示了如何创建并应用 `CrossEntropyLoss` 实例化对象于给定的数据之上[^2]。 #### 3. TensorFlow/Keras 中的应用实例 同样地,在 TensorFlow 或 Keras 库里也有相应的 API 支持此类功能——比如 `tf.keras.losses.CategoricalCrossentropy` 方法适用于已经过 one-hot 处理过的标签情况;而针对整型索引作为标签的情况则推荐使用 `SparseCategoricalCrossentropy`: ```python from tensorflow import keras import numpy as np model_output = tf.random.uniform((3, 5)) # 随机生成形状为 (3, 5) 的浮点数组模拟模型输出 true_labels_one_hot = [[1., 0., 0., 0., 0.], [0., 1., 0., 0., 0.], [0., 0., 1., 0., 0.]] cce = keras.losses.CategoricalCrossentropy(from_logits=False) result = cce(true_labels_one_hot, model_output) print('Result:', result.numpy()) # 如果 true labels 不是一维one-hot编码而是简单整数值的话 scc = keras.losses.SparseCategoricalCrossentropy(from_logits=False) integer_true_labels = [0, 1, 2] another_result = scc(integer_true_labels, model_output) print('Another Result:', another_result.numpy()) ``` 这里需要注意的是,默认情况下这些API假定传入的 logits 并未经过激活层转换成最终的概率分布形式(`from_logits=False`) ,因此需要显式指定参数或者提前完成相应变换。 #### 4. 总结说明 无论是采用 PyTorch 还是 Tensorflow 构建深度学习项目过程中遇到涉及多分类场景下的评估指标设计需求时,都可以考虑选用合适的版本组合起来构建高效的解决方案。具体而言,前者提供了简洁明了且灵活易用接口封装好的工具链路;后者凭借其强大的生态系统支持使得开发者能够更加专注于业务逻辑本身而非底层细节管理事务之中[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值