вход должен иметь 3 измерения, получено 2 ошибки при создании классификатора LSTM

#python #tensorflow #machine-learning #lstm #relu

Вопрос:

Структура сети должна быть следующей:

(lstm): LSTM(1, 64, batch_first=True)

(fc1): Линейный(in_features=64, out_features=32, смещение=True)

(relu): ReLU()

(fc2): Линейный(in_features=32, out_features=5, смещение=True)

Я написал этот код:

 class LSTMClassifier(nn.Module):

    def __init__(self):
        super(LSTMClassifier, self).__init__() 
        self.lstm = nn.LSTM(1, 64, batch_first=True)
        self.fc1 = nn.Linear(in_features=64, out_features=32, bias=True)
        self.relu = nn.ReLU()
        self.fc2 = nn.Linear(in_features=32, out_features=5, bias=True)
         

    def forward(self, x):
       x = torch.tanh(self.lstm(x)[0])
       x = self.fc1(x)
       x = F.relu(x)
       x = self.fc2(x)
 

Это для проверки:

     (batch_data, batch_label) = next (iter (train_loader))
    model = LSTMClassifier().to(device)
    output = model (batch_data.to(device)).cpu()
    assert output.shape == (batch_size, 5)
    print ("passed")
 

Ошибка в том, что:

—-> 3 вывода = модель (batch_data.to(устройство)).процессор()

5 кадров /usr/local/lib/python3.7/dist-packages/torch/nn/modules/rnn.py в check_input(self, input, batch_sizes) 201 поднимите ошибку времени выполнения( 202 ‘входные данные должны иметь {} размеры, получили {}’.формат( —> 203 ожидаемый _input_dim, input.dim ())) 204, если self.input_size != input.size(-1): 205 поднимите ошибку времени выполнения(

Ошибка времени выполнения: входные данные должны иметь 3 измерения, получено 2

В чем моя проблема?

Комментарии:

1. Вставьте полный журнал ошибок. Таким образом, мы сможем увидеть, где он терпит неудачу.

2. @Sr. S Я сделал это.

3. Проблема в том, что LSTMs требуют 3D-ввода (и вы не указали, какой ввод вы вводите), в то время как ваш ввод только 2D. LSTMs обрабатывает последовательности, а последовательности, по крайней мере, 3D.

Ответ №1:

LSTMs поддерживает 3-мерный ввод (образец, временной шаг, функции). Вам нужно преобразовать входные данные из 2D в 3D. Для этого вы можете :

Используйте функцию изменения формы

Во-первых, вам нужна форма вашего 2D-ввода с помощью batch_data.shape . Давайте предположим, что форма вашего 2D — ввода такова (15, 4) . Теперь, чтобы изменить формат ввода с 2D на 3D, вы используете функцию изменения формы np.reshape(data, new_shape)

     (batch_data, batch_label) = next (iter (train_loader))
    batch_data = np.reshape(batch_data, (15, 4, 1)) # line to add
    model = LSTMClassifier().to(device)
    output = model (batch_data.to(device)).cpu()
    assert output.shape == (batch_size, 5)
    print ("passed")
 

Позже вам также потребуется изменить формат тестовых данных с 2D на 3D.

Добавить слой повторителя

Этот слой реализован в Keras, я не уверен, доступен ли он в PyTorch, как в вашем случае. Этот слой добавляет дополнительное измерение к вашим данным (повторяет ввод n раз). Например, вы можете преобразовать 2D — вход (batch size, input size) в 3D-вход (batch_size, sequence_length, input size) .