我正在进行情感分析,我想把输出分成4类。对于损失,我使用交叉熵。
问题是PyTorch交叉熵需要输入**(batch_size,output),这是我遇到的麻烦。
我正在处理批大小为12**,序列大小为32
import torch.nn as nn
class RNN(nn.Module):
def __init__(self, hidden_dim = 256, input_size = 32 , num_layers = 1, num_classes=4, vocab_size = len(vocab_to_int)+1, embedding_dim=100):
super().__init__()
self.input_size = input_size
self.hidden_dim = hidden_dim
self.num_layers = num_layers
self.num_classes = num_classes
self.embedding = nn.Embedding(vocab_size, embedding_dim)
self.lstm = nn.LSTM(embedding_dim, hidden_dim, num_layers)
self.fc1 = nn.Linear(hidden_dim, 50)
self.fc2 = nn.Linear(50, 4)
def forward(self, x, hidden):
x = self.embedding(x)
x = x.view(32, 12, 100)
x, hidden = self.lstm(x, hidden)
x = x.contiguous().view(-1, 256)
x = self.fc1(x) # output shape ([384, 50])
x = self.fc2(x) # output shape [384, 4]
return x, hidden
def init_hidden(self, batch_size=12):
weight = next(self.parameters()).data
hidden = (weight.new(self.num_layers, 12, self.hidden_dim).zero_().cuda(), weight.new(self.num_layers, 12, self.hidden_dim).zero_().cuda())
return hidden
1条答案
按热度按时间3xiyfsfu1#
根据the CrossEntropyLoss docs:
输入必须是大小为
(C)
的Tensor(对于未批处理的输入),(minibatch,C)
[对于批处理的输入] [...]你提供的代码只是RNN类,而不是数据处理和对
CrossEntropyLoss
的实际调用,但你在评论中指出的错误让我认为你没有重新塑造标签Tensor,使其与神经网络的输出具有相同的大小。因此,你会计算一个大小为(384, 4)
的Tensor,相对于另一个大小为(12, 32)
的Tensor的损失。标签Tensor的大小应为(384)
,以匹配神经网络输出的第一维。另外,你不需要手动调整Tensor的大小,你可以在
forward()
调用之后通过torch.nn.utils.rnn.pack_padded_sequence()
函数调整它们的大小。如果你将这个函数同时应用于神经网络的输出和标签,你将得到一个大小为(384, 4)
的Tensor,PyTorch可以在CrossEntropyLoss
调用中处理它。更多细节请参见thepack_padded_sequence()
function docs中的注解。