nn.CrossEntropyLoss()
用于多分类,直接写标签序号就可以:0,1,2. 预测需要维度与标签长度一致。 import torch import torch.nn as nn import math criterion = nn.CrossEntropyLoss() output = torch.randn(3, 5, requires_grad=True) label = torch.empty(3, dtype=torch.long).random_(5) loss = criterion(output, label) print(网络输出为3个5类:) print(output) print(要计算loss `nn.CrossEntropyLoss()`是PyTorch库中的一个损失函数,专门用于多分类问题的训练。这个函数结合了LogSoftmax操作和负面 log-likelihood loss(NLLLoss),简化了多分类任务的损失计算过程。 理解多分类问题:在这样的问题中,模型需要从多个类别中预测出一个正确的类别。例如,对于一个有5类别的问题,标签可以是0到4之间的整数。`nn.CrossEntropyLoss()`函数接受两个输入:`output`和`label`。`output`是模型的预测输出,通常是一个包含每个类别的概率的张量,其形状应该是 `(batch_size, num_classes)`。`label`是对应的正确类别标签,是一个整数张量,形状与`output`的第一维相同,即`(batch_size,)`。 在提供的代码示例中: ```python output = torch.randn(3, 5, requires_grad=True) # 3个样本,每个样本有5个类别的预测 label = torch.empty(3, dtype=torch.long).random_(5) # 3个随机标签,范围在0到4之间 loss = criterion(output, label) ``` 这里,`criterion`是`nn.CrossEntropyLoss()`实例,`output`是模型的预测,`label`是对应的正确类别。计算`loss`后,可以通过反向传播优化模型的权重。 `nn.CrossEntropyLoss()`的工作原理如下: 1. 对模型的输出执行LogSoftmax操作。这会将每个类别的概率转换为对数概率,同时保持每个样本的概率总和为1。 2. 计算每个样本的负对数似然损失(NLLLoss)。对于每个样本,NLLLoss是其正确类别概率的对数的负数。 3. 如果`reduce`参数(默认为True)为真,损失函数会对整个批次进行平均或求和,这取决于`size_average`参数(在PyTorch 1.1及以后版本中被`reduction`参数取代,默认也是True,表示平均)。 代码中还展示了如何手动实现LogSoftmax和NLLLoss的过程,然后将其结果与`nn.CrossEntropyLoss()`的输出进行比较,证明两者的计算结果是相同的。这是为了验证`nn.CrossEntropyLoss()`内部确实执行了这两个操作。 总结一下,`nn.CrossEntropyLoss()`在多分类问题中扮演着关键角色,它简化了训练过程,将模型的预测转换为对数概率,并计算每个样本的负对数似然损失。通过自动求和或平均,它提供了一个可以直接优化的损失值,用于更新模型的权重。在使用时,确保模型的输出维度与标签的长度匹配,并正确设置标签值。