赞
踩
CrossEntropyLoss用于计算多分类问题的交叉熵损失。因为torch.nn.CrossEntropyLoss内置了Softmax运算,所以在使用torch.nn.CrossEntropyLoss作为损失函数时,不要在网络的最后添加Softmax层!!!label应为一个整数,而不是one-hot编码形式。
- import torch
-
- '''
- 每一个样本都有一个标签,表示它的真实类别。在深度学习中,通常是分批进行训练。
- 对于一个N分类问题,样本的标签只可能是0、1、2 ... N-1
- 则对于一个3分类问题,样本的标签只可能是0或1或2。
- 当batch_size为5时,这一个batch的标签是一个形状为[batch_size]的tensor,即shape为[5]
- '''
-
- # 一个batch(batch_size=5)的标签
- label = torch.tensor([1, 2, 0, 1, 0])
-
- print(label.shape) # [5]
-
- '''
- 对于一个3分类问题,当训练时batch_size为5,
- 则深度网络对每一个batch的预测值是一个形状为[batch_size, classes]的tensor,即shape为[5, 3]
- 以深度网络对第一个样本的预测值[0.5, 0.8, -1.2]为例,
- 经过Softmax层后,得到[0.3949, 0.5330, 0.0721],表示深度网络认为第一个样本属于0,1,2这三类的概率分别是0.3949,0.5330, 0.0721
- '''
- predict = torch.tensor([[ 0.5, 0.8, -1.2],
- [-0.2, 1.8, 0.5],
- [ 0.3, 0.2, 0.7],
- [ 0.6, -0.8, -0.4],
- [-0.4, 0.2, 0.8]])
-
- print(predict.shape) # [5, 3]
-
- # 当reduction='none'时,输出是对每一个样本预测的损失
- loss_func = torch.nn.CrossEntropyLoss(reduction='none')
- loss = loss_func(predict, label)
- print(loss) # tensor([0.6292, 1.6421, 1.2228, 1.8790, 1.8152])
-
- # 当reduction='sum'时,输出是对这一个batch预测的损失之和
- loss_func = torch.nn.CrossEntropyLoss(reduction='sum')
- loss = loss_func(predict, label)
- print(loss) # tensor(7.1883)
-
- # 当reduction='mean'时,输出是对这一个batch预测的平均损失
- loss_func = torch.nn.CrossEntropyLoss(reduction='mean')
- loss = loss_func(predict, label)
- print(loss) # tensor(1.4377)

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。