Deep learning 带torchtext的Pytorch LSTM的输入尺寸有问题 问题
我正在尝试使用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
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
- 输入形状(顺序、批次、输入大小):包含输入序列特征的张量。输入也可以是压缩可变长度序列。有关详细信息,请参见
或torch.nn.utils.rnn.pack\u padded\u sequence()
torch.nn.utils.rnn.pack\u sequence()
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
- 输入形状(顺序、批次、输入大小):包含输入序列特征的张量。输入也可以是压缩可变长度序列。有关详细信息,请参见
或torch.nn.utils.rnn.pack\u padded\u sequence()
torch.nn.utils.rnn.pack\u sequence()
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
选项