#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)
.