1

问题

我正在尝试使用 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()
)

我最终得到了以下尺寸inputslabels

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])]

问题

我试图了解每个步骤的尺寸应该是多少。隐藏维度应该初始化为 (4, 600, 256) 还是 (4, 64, 256)?

4

1 回答 1

3

nn.LSTM- Inputs的文档解释了维度是什么:

  • h_0 of shape (num_layers * num_directions, batch, hidden_​​size):包含批次中每个元素的初始隐藏状态的张量。如果 LSTM 是双向的,num_directions 应该是 2,否则应该是 1。

因此,您的隐藏状态应该有大小(4, 64, 256),所以您正确地做到了。另一方面,您没有为输入提供正确的大小。

  • input of shape (seq_len, batch, input_size):包含输入序列特征的张量。输入也可以是打包的可变长度序列。有关详细信息,请参阅torch.nn.utils.rnn.pack_padded_sequence()torch.nn.utils.rnn.pack_sequence()

虽然它说输入的大小需要是(seq_len, batch, input_size),但您已经batch_first=True在 LSTM 中进行了设置,它交换了batchseq_len。因此,您的输入应该具有大小(batch_size, seq_len, input_size),但情况并非如此,因为您的输入首先具有seq_len (600) 和第二(64),这是 torchtext 中的默认值,因为这是更常见的表示形式,也匹配 LSTM 的默认行为。

你需要batch_first=False在你的 LSTM 中设置。

或者。如果您通常更喜欢将批次作为第一个维度,torch.data.Field也可以batch_first选择。

于 2020-05-15T01:54:29.847 回答