张量大小CrossEntropyLoss

时间:2018-03-14 14:46:39

标签: neural-network deep-learning pytorch tensor

在摘录中:

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 会变得非常大,因此我很容易耗尽内存。有替代方法吗?

1 个答案:

答案 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)。