Neural network 无交叉熵张量

Neural network 无交叉熵张量,neural-network,deep-learning,pytorch,tensor,Neural Network,Deep Learning,Pytorch,Tensor,在代码段中: criterion = nn.CrossEntropyLoss() raw_loss = criterion(output.view(-1, ntokens), targets) 输出大小为torch.size([5,58967]),目标大小为torch.size([25]),ntokens为8967 修改代码后,我的 输出大小为torch.size([58967]),目标大小为torch.size([25]) 在计算损失时,这会引起维数问题 将产生输出的线性激活的大小增加5,以

在代码段中:

criterion = nn.CrossEntropyLoss()
raw_loss = criterion(output.view(-1, ntokens), targets)
输出大小为torch.size([5,58967]),目标大小为torch.size([25]),ntokens为8967

修改代码后,我的

输出大小为torch.size([58967]),目标大小为torch.size([25])

在计算损失时,这会引起维数问题

将产生输出的线性激活的大小增加5,以便以后可以将输出调整为torch.size([5,5,8967])的大小,这是否明智


增加张量的问题是,ntokens可能变得相当大,因此我很容易耗尽内存。有其他方法吗?

您应该这样做:

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


请注意,期望输入包含每个类的分数。因此,输入必须是一个大小为
(minibatch,C)
2D
张量,目标必须是一个类索引(0到C-1),该索引对应于一个大小为minibatch的1D张量的每个值。

您应该这样做:

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


请注意,期望输入包含每个类的分数。因此,输入必须是一个大小为
(minibatch,C)
2D
张量,目标必须是一个类索引(0到C-1),该索引对应于一个大小为minibatch的1D张量的每个值。

有一个ntokens的上限。。。例如,只考虑最常见的10000个代币,其他所有代币均替换为代币。为ntokens设定上限。。。例如,只考虑最常见的10000个标记,其他所有标记都替换为标记。在您的情况下,输出为5x5xntokens,而目标为25。在我的例子中,输出是5xntokens和targets25@MocialovBoris你能解释一下你的实际产出是什么,目标是什么吗?为什么输出形状是5xntokens,目标是25?请简要解释,以便我们能够帮助您。输入是一个单词序列,例如,从位置i:i+seq_length开始。目标将是i+1:i+seq_length+1。我认为问题在于你假设目标只是一个词,而我没有具体说明这一点是我的错。在输入损失之前,目标也会变平(aka.view(-1))“转发”功能的输出是batch_sizexvocab_大小,请按照您的回答进行操作。您是否介意加入聊天室以提高效率?在您的情况下,输出是5x5xntokens,而目标是25。在我的例子中,输出是5xntokens和targets25@MocialovBoris你能解释一下你的实际产出是什么,目标是什么吗?为什么输出形状是5xntokens,目标是25?请简要解释,以便我们能够帮助您。输入是一个单词序列,例如,从位置i:i+seq_length开始。目标将是i+1:i+seq_length+1。我认为问题在于你假设目标只是一个词,而我没有具体说明这一点是我的错。Target在进入loss(aka.view(-1))之前也是平坦的。我从forward函数输出的是batch_sizexvocab_大小,根据您的回答,您介意加入聊天室以提高效率吗