Pytorch LSTM与交叉熵

tv6aics1  于 2022-12-04  发布在  其他
关注(0)|答案(1)|浏览(172)

我正在进行情感分析,我想把输出分成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
3xiyfsfu

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调用中处理它。更多细节请参见the pack_padded_sequence() function docs中的注解。

相关问题