Nic*_*ick 3 machine-learning deep-learning cross-entropy pytorch
我正在阅读多类分类问题的 Pytorch 教程。我发现 Pytorch 中 Loss 计算的行为让我很困惑。你能帮我解决这个问题吗?
用于分类的模型如下:
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 6, 5)
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1, 16 * 5 * 5)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
Run Code Online (Sandbox Code Playgroud)
训练过程如下:
optimizer.zero_grad()
outputs = net(inputs)
loss = nn.CrossEntropyLoss(outputs, labels)
loss.backward()
optimizer.step()
Run Code Online (Sandbox Code Playgroud)
我的问题是:Pytorch 中损失计算的确切行为是什么?在每次迭代期间,nn.CrossEntropyLoss()的输入有两部分:
据我所知,交叉熵的计算通常用于两个张量之间,例如:
所以基于这个假设,这里的nn.CrossEntropyLoss()需要实现:
请问这是 nn.CrossEntropyLoss() 的作用吗?或者我们是否需要在输入模型之前对真实标签进行 one-hot 编码?
非常感谢您提前抽出时间!
nn.CrossEntropyLoss首先应用 log-softmax ( log(Softmax(x)) 来获取对数概率,然后计算负对数似然,如文档中所述:
\n\n\n该标准将
\nnn.LogSoftmax()和组合nn.NLLLoss()在一个类别中。
当使用one-hot编码目标时,交叉熵可以计算如下:
\n\n\n\n其中y是 one-hot 编码的目标向量,\xc5\xb7是每个类别的概率向量。要获得概率,您可以将 softmax 应用于模型的输出。使用概率的对数,PyTorch 只是将对数和 softmax 合并为一个运算nn.LogSoftmax(),以实现数值稳定性。
由于 one-hot 向量中除一个之外的所有值均为零,因此总和中只有一项为非零。因此,考虑到实际的类,它可以简化为:
\n\n\n\n只要知道类别索引,就可以直接计算损失,这比使用 one-hot 编码目标更有效,因此nn.CrossEntropyLoss需要类别索引。
完整的计算在以下文档中给出nn.CrossEntropyLoss:
\n \n\n
| 归档时间: |
|
| 查看次数: |
3083 次 |
| 最近记录: |