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

#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 нет, это не сработало. я также публикую полное сообщение об ошибке. спасибо за вашу попытку