文档说明如下:
负对数似然损失。它对于训练具有C个类别的分类问题非常有用。
基本上,在那之后的一切都取决于您知道什么是C类,我认为我知道什么是C类,但文档对我来说没有多大意义。特别是当它描述
(N, C) where C = number of classes
的预期输入时,我感到困惑,因为我认为C类仅指输出。我的理解是,C类是一个独热向量,用于分类。我经常在教程中发现NLLLoss
通常与LogSoftmax
配对以解决分类问题。我希望在以下示例中使用
NLLLoss
:# Some random training data
input = torch.randn(5, requires_grad=True)
print(input) # tensor([-1.3533, -1.3074, -1.7906, 0.3113, 0.7982], requires_grad=True)
# Build my NN (here it's just a LogSoftmax)
m = nn.LogSoftmax(dim=0)
# Train my NN with the data
output = m(input)
print(output) # tensor([-2.8079, -2.7619, -3.2451, -1.1432, -0.6564], grad_fn=<LogSoftmaxBackward>)
loss = nn.NLLLoss()
print(loss(output, torch.tensor([1, 0, 0])))
上述代码最后一行会产生以下错误:
ValueError: 预期有 2 个或更多维度 (实际只有 1 个)
我们可以忽略这个错误,因为显然我不理解自己在做什么。下面我将解释一下我写上述源代码的意图。
input = torch.randn(5, requires_grad=True)
我需要将一个随机的一维数组与一个独热向量 [1, 0, 0]
进行配对,用于训练。 我正在尝试将二进制位转换为十进制数的独热向量。
m = nn.LogSoftmax(dim=0)
< p > LogSoftmax
的文档中说输出的形状将与输入相同,但我只看到过使用 LogSoftmax(dim=1)
的示例,因此我一直在尝试使其运行,但找不到相关的示例。< /p >
print(loss(output, torch.tensor([1, 0, 0])))
现在我已经得到了神经网络的输出,我想知道从我的分类
[1, 0, 0]
中得到的损失。在这个例子中,任何数据都不是很重要。我只是想得到一个代表分类的one-hot向量的损失。此时,我遇到了无法解决与期望输出和输入结构相关的损失函数错误。我尝试对输出和输入使用
view(...)
来修复形状,但这只会引起其他错误。因此,这又回到了我的最初的问题,我将展示文档中的示例来解释我的困惑:
m = nn.LogSoftmax(dim=1)
loss = nn.NLLLoss()
input = torch.randn(3, 5, requires_grad=True)
train = torch.tensor([1, 0, 4])
print('input', input) # input tensor([[...],[...],[...]], requires_grad=True)
output = m(input)
print('train', output, train) # tensor([[...],[...],[...]],grad_fn=<LogSoftmaxBackward>) tensor([1, 0, 4])
x = loss(output, train)
再次提到,我们在LogSoftmax
上有一个dim=1
,这让我感到困惑,因为看一下输入数据。它是一个3x5
的张量,我被搞糊涂了。
这是NLLLoss
函数第一个输入的文档:
输入:(N, C),其中 C = 类别数量
这些输入是按类别数量进行分组的?
所以输入张量的每一行与训练张量的每个元素相关联?
如果我更改输入张量的第二个维度,那么没有任何错误发生,我不明白发生了什么。
input = torch.randn(3, 100, requires_grad=True)
# 3 x 100 still works?
所以我不明白这里的C类是什么意思,我认为C类是一个分类(就像一个标签),只有在NN的输出上才有意义。
希望你能理解我的困惑,因为NN的输入形状不应该与用于分类的one hot向量的形状无关吗?
代码示例和文档都表明,输入的形状由分类数量定义,我真的不太理解为什么会这样。
我已经尝试学习文档和教程来理解我所缺少的内容,但几天过去了,我还是无法跨越这一点,所以我决定问这个问题。这让我感到谦卑,因为我原以为这将是比较容易学习的东西之一。