在摘录中:
criterion = nn.CrossEntropyLoss()
raw_loss = criterion(output.view(-1, ntokens), targets)
输出大小为torch.Size([5,5,8967]),目标大小为torch.Size([25])和 ntokens 是8967
修改代码后,我的
输出大小为torch.Size([5,8967])和目标大小为torch.Size([25])
在计算损失时会增加维度问题。
将生成输出的线性激活的大小增加5是否合理,以便我可以稍后将输出的大小调整为大小。大小([5,5,8967])?
增加张量大小的问题是 ntokens 会变得非常大,因此我很容易耗尽内存。有替代方法吗?
答案 0 :(得分:0)
你应该这样做:
ntokens = 8000
output = Variable(torch.randn(5, 5, ntokens))
targets = Variable(torch.from_numpy(np.random.randint(0, ntokens, size=25)))
criterion = nn.CrossEntropyLoss()
loss = criterion(output.view(-1, ntokens), targets)
print(loss)
打印:
Variable containing:
9.4613
[torch.FloatTensor of size 1]
在这里,我假设output
包含5个句子的下一个词的预测(小批量大小为5),每个句子的长度为5(序列长度为5)。 8000是词汇量大小,因此您的模型预测整个词汇表的概率分布。
现在,您可以根据需要计算预测每个单词的丢失,因为目标形状为25
。
请注意,CrossEntropyLoss期望输入包含每个班级的分数。因此,输入必须是大小为2D
的{{1}}张量,并且对于1D张量大小的小批量的每个值,目标必须是类索引(0到C-1)。