我想建立一个模型,根据先前的字符预测下一个字符。
我已经将文本割成了长度为100的整数序列(使用数据集和数据加载器)。
我的输入和目标变量的维度是:
前向传递后,我得到了我的预测维度:(batch_size, sequence_length, vocabulary_size),在这种情况下是(128,100,44)。
但是当我使用nn.CrossEntropyLoss()函数计算损失时:
我遇到了一个错误:
问题是:如何处理多对多LSTM预测的损失函数计算?特别是序列维度?根据nn.CrossEntropyLoss,维度必须为(N,C,d1,d2...dN),其中N是batch_size,C是类别数。但是D是什么?它与序列长度有关吗?
我的输入和目标变量的维度是:
inputs dimension: (batch_size,sequence length). In my case (128,100)
targets dimension: (batch_size,sequence length). In my case (128,100)
前向传递后,我得到了我的预测维度:(batch_size, sequence_length, vocabulary_size),在这种情况下是(128,100,44)。
但是当我使用nn.CrossEntropyLoss()函数计算损失时:
batch_size = 128
sequence_length = 100
number_of_classes = 44
# creates random tensor of your output shape
output = torch.rand(batch_size,sequence_length, number_of_classes)
# creates tensor with random targets
target = torch.randint(number_of_classes, (batch_size,sequence_length)).long()
# define loss function and calculate loss
criterion = nn.CrossEntropyLoss()
loss = criterion(output, target)
print(loss)
我遇到了一个错误:
ValueError: Expected target size (128, 44), got torch.Size([128, 100])
问题是:如何处理多对多LSTM预测的损失函数计算?特别是序列维度?根据nn.CrossEntropyLoss,维度必须为(N,C,d1,d2...dN),其中N是batch_size,C是类别数。但是D是什么?它与序列长度有关吗?
(128,100,44)
,而你正在尝试预测下一个字符(基本上是第“101”个字符)。为什么你的预测具有100的seq_length
?就我个人而言,我会输出(128, 44)
(因为我猜测dim=1是长度为44的OHE),并使用该字符预测计算CrossEntropyLoss。编辑:也许我读错了,你是要在每个时间步长(即在输入序列的每个字符预测之后)计算CEL吗? - Ivan