#python #pytorch #recurrent-neural-network
#python #пыторч #рекуррентная нейронная сеть
Вопрос:
привет, у меня есть следующий код
class GRU(nn.Module):
def __init__(self, input_size, hidden_size, num_layers, num_classes ):
super(GRU, self).__init__()
#WE STORE THE LAYERS AND HIDDENSIZE
self.num_layers = num_layers
self.hidden_size = hidden_size
self.gru = nn.GRU(input_size, hidden_size, num_layers, batch_first=True)
self.fc = nn.Linear(hidden_size* sequence_length, num_classes)
def forward(self, x):
# Set initial hidden states (and cell states for LSTM)
h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(device)
# Forward propagate RNN
out, _ = self.gru(x, h0)
out=out.reshape(out.shape[0], -1)
out = self.fc(out)
return out
и следующие гиперпараметры
# Hyper-parameters
num_classes = 6
batch_size = 32
learning_rate = 0.0025
dropout=0.2
epochs = 10
input_size = len(X_train[0][0])
sequence_length = len(X_train[0])
hidden_size = 64
num_layers = 2
print (input_size)
print (sequence_length)
6
100
мои данные имеют три измерения
X_train.shape
torch.Size([4078, 100, 6])
X_test.shape
torch.Size([1020, 100, 6])
однако, когда я пытаюсь запустить код, я возвращаю ошибку описания. Я проверяю официальный сайт PyTorch и другие такие же проблемы, но не могу найти решение.
я был бы признателен, если кто-нибудь может помочь с кодом.
это полное сообщение об ошибке
RuntimeError Traceback (most recent call last)
<ipython-input-47-21beb733af1e> in <module>
1 test_accs, confusion_mtxes = [], []
2 for epoch in range(1, epochs 1):
----> 3 train(X_train, y_train)
4 test_acc, confusion_mtx = test(X_test, y_test)
5 test_accs.append(test_acc)
<ipython-input-45-d10728615dab> in train(X_train, y_train)
4 data, target = data, target
5 optimizer.zero_grad()
----> 6 output = model(data)
7 loss = criterion(output, target)
8 loss.backward()
~AppDataRoamingPythonPython37site-packagestorchnnmodulesmodule.py in __call__(self, *input, **kwargs)
530 result = self._slow_forward(*input, **kwargs)
531 else:
--> 532 result = self.forward(*input, **kwargs)
533 for hook in self._forward_hooks.values():
534 hook_result = hook(self, input, result)
<ipython-input-42-afe206da09cb> in forward(self, x)
14 h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(device)
15 # Forward propagate RNN
---> 16 out, _ = self.gru(x, h0)
17 out=out.reshape(out.shape[0], -1)
18 out = self.fc(out)
~AppDataRoamingPythonPython37site-packagestorchnnmodulesmodule.py in __call__(self, *input, **kwargs)
530 result = self._slow_forward(*input, **kwargs)
531 else:
--> 532 result = self.forward(*input, **kwargs)
533 for hook in self._forward_hooks.values():
534 hook_result = hook(self, input, result)
~AppDataRoamingPythonPython37site-packagestorchnnmodulesrnn.py in forward(self, input, hx)
711 hx = self.permute_hidden(hx, sorted_indices)
712
--> 713 self.check_forward_args(input, hx, batch_sizes)
714 if batch_sizes is None:
715 result = _VF.gru(input, hx, self._flat_weights, self.bias, self.num_layers,
~AppDataRoamingPythonPython37site-packagestorchnnmodulesrnn.py in check_forward_args(self, input, hidden, batch_sizes)
178 def check_forward_args(self, input, hidden, batch_sizes):
179 # type: (Tensor, Tensor, Optional[Tensor]) -> None
--> 180 self.check_input(input, batch_sizes)
181 expected_hidden_size = self.get_expected_hidden_size(input, batch_sizes)
182
~AppDataRoamingPythonPython37site-packagestorchnnmodulesrnn.py in check_input(self, input, batch_sizes)
153 raise RuntimeError(
154 'input must have {} dimensions, got {}'.format(
--> 155 expected_input_dim, input.dim()))
156 if self.input_size != input.size(-1):
157 raise RuntimeError(
RuntimeError: input must have 3 dimensions, got 2
я также попытался построить свою модель с использованием keras и работает нормально
model = Sequential()
model.add(GRU(units=64, return_sequences=True,recurrent_regularizer=l2(0.0015), input_shape=(timesteps, input_dim), activation="tanh"))
model.add(GRU(units=64, recurrent_regularizer=l2(0.0015), input_shape=(timesteps, input_dim), activation="tanh"))
model.add(Dropout(0.5))
model.add(Dense(64, activation='tanh'))
model.add(Dense(64, activation='tanh'))
model.add(Dense(n_classes, activation='softmax'))
model.summary()
model.compile(optimizer=Adam(learning_rate = 0.0025), loss = 'sparse_categorical_crossentropy', metrics = ['accuracy'])
history =model.fit(X_train, y_train, batch_size=32, epochs=100)
Я попытался использовать ту же логику здесь, что означает, что я умножаю sequence_length на input_size, но все еще не могу решить проблему
Комментарии:
1. Я думаю, что одна из проблем заключается в том, что вы неправильно установили batch_first=True в nn.GRU. Это должно быть batch_first=False с вашими входными данными. Здесь ваши обучающие и тестовые наборы данных (X_train и X_test) уже имеют форму (seq_len, batch_size, features), и вам не нужно устанавливать batch_first=True для nn.GRU. Это даст вывод формы (seq_len, batch_size, hidden_size). Используйте batch_first=True только тогда, когда ваши данные имеют форму (batch_size, seq_len, features). Надеюсь, это поможет.
2. @HVD нет, это не сработало. я также публикую полное сообщение об ошибке. спасибо за вашу попытку