Как конвертировать keras LSTM в pytorch LSTM? - PullRequest
1 голос
/ 10 мая 2019

У меня есть очень простой пример LSTM, написанный на Keras, который я пытаюсь перенести на pytorch. Но, похоже, он не способен учиться вообще. Я абсолютное начало, поэтому любые советы приветствуются.

KERAS

X_train_lmse имеет форму (1691, 1, 1), я, по сути, выполняю X(t) с X(t-1) в качестве отдельной функции

lstm_model = Sequential()
lstm_model.add(LSTM(7, input_shape=(1, X_train_lmse.shape[1]), activation='relu', kernel_initializer='lecun_uniform', return_sequences=False))
lstm_model.add(Dense(1))
lstm_model.compile(loss='mean_squared_error', optimizer='adam')
early_stop = EarlyStopping(monitor='loss', patience=2, verbose=1)
history_lstm_model = lstm_model.fit(X_train_lmse, y_train, epochs=100, batch_size=1, verbose=1, shuffle=False, callbacks=[early_stop])

Выход:

Epoch 1/100
1691/1691 [==============================] - 10s 6ms/step - loss: 0.0236
Epoch 2/100
1691/1691 [==============================] - 9s 5ms/step - loss: 0.0076
Epoch 3/100
...

PYTORCH

X_train_tensor имеет ту же форму, что и в керасе (1691, 1, 1). Я указываю, что batch_first будет истинным ниже, поэтому я думаю, что все должно быть в порядке.

class LSTM_model(nn.Module):

    def __init__(self):
        super(LSTM_model, self).__init__()
        self.lstm = nn.LSTM(input_size=1, hidden_size=7, num_layers=1, batch_first=True)
        self.dense = nn.Linear(7, 1)

    def forward(self, x):
        out, states = self.lstm(x)
        out = self.dense(out)
        return out

lstm_model = LSTM_model()
loss_function = nn.MSELoss()
optimizer = optim.Adam(lstm_model.parameters())

for t in range(100):
    y_pred = lstm_model(X_train_tensor)
    loss = loss_function(y_pred, Y_train_tensor)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    print('Train Epoch ', t, ' Loss = ', loss)

Выход:

Train Epoch  0  Loss =  tensor(0.2834, grad_fn=<MseLossBackward>)
Train Epoch  1  Loss =  tensor(0.2812, grad_fn=<MseLossBackward>)
Train Epoch  2  Loss =  tensor(0.2790, grad_fn=<MseLossBackward>)
Train Epoch  3  Loss =  tensor(0.2768, grad_fn=<MseLossBackward>)
Train Epoch  4  Loss =  tensor(0.2746, grad_fn=<MseLossBackward>)
Train Epoch  5  Loss =  tensor(0.2725, grad_fn=<MseLossBackward>)
Train Epoch  6  Loss =  tensor(0.2704, grad_fn=<MseLossBackward>)
Train Epoch  7  Loss =  tensor(0.2683, grad_fn=<MseLossBackward>)
...

Как вы можете видеть, ошибка в Pytorch практически отсутствует. Также каждая эпоха проходит намного быстрее, чем кера.

Я должен делать что-то глупое. Я проверил входные данные, и они выглядят одинаково в обеих реализациях. Спасибо!

1 Ответ

2 голосов
/ 11 мая 2019

Вам не хватает функции активации relu в модели PyTorch ( См. Слой Relu в PyTorch ) .Кроме того, вы, кажется, используете настроенный kernel_initalizer для весов.Вы можете передать веса инициализации в вызове модели:

...
y_pred = lstm_model(X_train_tensor, (hn, cn))
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...