Пользовательская модель LSTM в Pytorch, показывающая несоответствие размера ввода - PullRequest
0 голосов
/ 25 октября 2019

У меня есть пользовательская модель двунаправленного LSTM, где пользовательская часть имеет вид

- extract the forward and backward last hidden state
- concat those states
- create a fully connected layer and pass it through softmax layer.

Код выглядит следующим образом:

class customModel(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, num_classes):
        super(customModel, self).__init__()
        self.hidden_size = hidden_size
        self.num_layers = num_layers
        self.bilstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=False, bidirectional=True)
        self.fcl = nn.Linear(hidden_size, num_classes)

    def forward(self, x):
        # Set initial hidden and cell states 
        h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(device)
        c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(device)

        # Forward propagate LSTM
        out, hidden = self.bilstm(x, (h0, c0))  # out: tensor of shape (batch_size, seq_length, hidden_size)
        #concat hidden state of forward and backword
        fw_bilstm = out[-1, :, :self.hidden_size]
        bk_bilstm = out[0, :, :self.hidden_size]
        concat_fw_bw = torch.cat((fw_bilstm, bk_bilstm), dim = 1)
        fc = nn.Linear(concat_fw_bw, num_classes)
        x = F.relu(fc(x))
        return F.softmax(x)

Я использую параметры ниже и введите

input_size = 2
hidden_size = 32  
num_layers = 1
num_classes = 2

input_embedding = [
    torch.FloatTensor([[-0.8264],  [0.2524]]),
    torch.FloatTensor([[-0.3259],  [0.3564]])
]

Затем я создаю объект модели

model = customModel(input_size, hidden_size, num_layers, num_classes)

Который затем я использую, как показано ниже:

for item in input_embedding:
    print(item.size())
    for epoch in range(1):  
        pred = model(item)  
        print (pred)

Когда я запускаю его, я вижу для этой строки out, hidden = self.bilstm(x, (h0, c0)), этопоказывает ошибку

RuntimeError: input must have 3 dimensions, got 2

Я не уверен, почему модель думает, что вход должен иметь 3 измерения, когда я явно указал input_size=2

Чего мне не хватает?

1 Ответ

1 голос
/ 25 октября 2019

В вашем входе отсутствует размер ( партия или последовательность ).

Существует разница между nn.LSTM и nn.LSTMCell. Первый - который вы используете - принимает целые последовательности в качестве входных данных. Поэтому ему нужны трехмерные входные данные формы (seq_len, batch, input_size).

Допустим, вы хотите дать эти 4 последовательности букв (которые вы кодируете как горячие векторы) в качестве входных данных в виде пакета:

x0 = [a,b,c]
x1 = [c,d,e]
x2 = [e,f,g]
x3 = [h,i,j]

### input.size() should give you the following:
(3,4,8)
  • seq_len параметр - это размер последовательностей: здесь 3,
  • Параметр input_size - это размер каждого входного вектора: здесь, ввод будет представлять собой горячий вектор размером 8,
  • batch - это количество последовательностей, которые вы собрали: здесь есть 4 последовательности.

Примечание: это может быть легче понять, поставив сначала последовательность пакетов и установив batch_firstкак True

Также: если (h_0, c_0) не предоставлено, h_0 и c_0 по умолчанию обнуляются, поэтому создавать их бесполезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...