Deep learning 带torchtext的Pytorch LSTM的输入尺寸有问题 问题

Deep learning 带torchtext的Pytorch LSTM的输入尺寸有问题 问题,deep-learning,pytorch,lstm,recurrent-neural-network,torchtext,Deep Learning,Pytorch,Lstm,Recurrent Neural Network,Torchtext,我正在尝试使用LSTM构建一个文本分类器网络。我得到的错误是: RuntimeError: Expected hidden[0] size (4, 600, 256), got (4, 64, 256) 细节 数据是json,如下所示: {"cat": "music", "desc": "I'm in love with the song's intro!", "sent": "h"} 我正在使用torchtext加载数据 from torchtext import data from to

我正在尝试使用LSTM构建一个文本分类器网络。我得到的错误是:

RuntimeError: Expected hidden[0] size (4, 600, 256), got (4, 64, 256)
细节 数据是json,如下所示:

{"cat": "music", "desc": "I'm in love with the song's intro!", "sent": "h"}
我正在使用
torchtext
加载数据

from torchtext import data
from torchtext import datasets

TEXT = data.Field(fix_length = 600)
LABEL = data.Field(fix_length = 10)

BATCH_SIZE = 64

fields = {
    'cat': ('c', LABEL),
    'desc': ('d', TEXT),
    'sent': ('s', LABEL),
}
我的LSTM看起来像这样

EMBEDDING_DIM = 64
HIDDEN_DIM = 256
N_LAYERS = 4

MyLSTM(
  (embedding): Embedding(11967, 64)
  (lstm): LSTM(64, 256, num_layers=4, batch_first=True, dropout=0.5)
  (dropout): Dropout(p=0.3, inplace=False)
  (fc): Linear(in_features=256, out_features=8, bias=True)
  (sig): Sigmoid()
)
最后,我为
输入
标签

batch = list(train_iterator)[0]
inputs, labels = batch
print(inputs.shape) # torch.Size([600, 64])
print(labels.shape) # torch.Size([100, 2, 64])
我初始化的隐藏张量如下所示:

hidden # [torch.Size([4, 64, 256]), torch.Size([4, 64, 256])]
问题: 我试图理解每一步的维度应该是什么。 是否应将隐藏的维度初始化为(4600256)或(464256)?

的文档说明了维度是什么:

  • h_0形状(num_layers*num_directions,batch,hidden_size):包含批次中每个元素的初始隐藏状态的张量。如果LSTM是双向的,num_directions应该是2,否则应该是1
因此,您的隐藏状态应该有大小(4,64,256),所以您正确地做到了这一点。另一方面,您没有为输入提供正确的大小

  • 输入形状(顺序、批次、输入大小):包含输入序列特征的张量。输入也可以是压缩可变长度序列。有关详细信息,请参见
    torch.nn.utils.rnn.pack\u padded\u sequence()
    torch.nn.utils.rnn.pack\u sequence()
虽然它说输入的大小需要是(seq_len,batch,input_size),但您已经在LSTM中设置了
batch_first=True
,它交换了批和seq_len。因此,您的输入应该有大小(batch_size、seq_len、input_size),但情况并非如此,因为您的输入有seq_len first(600)和batch second(64),这是torchtext中的默认值,因为这是更常见的表示,也与LSTM的默认行为相匹配

您需要在LSTM中设置
batch_first=False

或者。如果您通常喜欢将批次作为第一个维度,还可以使用
batch\u first
选项。

的文档说明了维度是什么:

  • h_0形状(num_layers*num_directions,batch,hidden_size):包含批次中每个元素的初始隐藏状态的张量。如果LSTM是双向的,num_directions应该是2,否则应该是1
因此,您的隐藏状态应该有大小(4,64,256),所以您正确地做到了这一点。另一方面,您没有为输入提供正确的大小

  • 输入形状(顺序、批次、输入大小):包含输入序列特征的张量。输入也可以是压缩可变长度序列。有关详细信息,请参见
    torch.nn.utils.rnn.pack\u padded\u sequence()
    torch.nn.utils.rnn.pack\u sequence()
虽然它说输入的大小需要是(seq_len,batch,input_size),但您已经在LSTM中设置了
batch_first=True
,它交换了批和seq_len。因此,您的输入应该有大小(batch_size、seq_len、input_size),但情况并非如此,因为您的输入有seq_len first(600)和batch second(64),这是torchtext中的默认值,因为这是更常见的表示,也与LSTM的默认行为相匹配

您需要在LSTM中设置
batch_first=False

或者。如果您通常更喜欢将批处理作为第一个维度,还可以使用
batch\u first
选项