Почему CuDNNLSTM против LSTM имеют разные прогнозы в Керасе? - PullRequest
0 голосов
/ 12 февраля 2019

Вот мой RNN:

def make_cpu_regressor():

    regressor = Sequential()

    regressor.add(LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], 1)))
    regressor.add(Dropout(0.2))

    regressor.add(LSTM(units=50, return_sequences=True))
    regressor.add(Dropout(0.2))

    regressor.add(LSTM(units=50, return_sequences=True))
    regressor.add(Dropout(0.2))

    regressor.add(LSTM(units=50))
    regressor.add(Dropout(0.2))

    regressor.add(Dense(units=1))

    regressor.compile(optimizer='adam', loss='mean_squared_error')

    regressor.fit(X_train, y_train, epochs=100, batch_size=32)
    regressor.save('model-cpu.h5')
    return regressor

Я создал второй с одним отличием, я использовал CuDNNLSTM вместо LSTM, все остальное было таким же.NN с использованием CuDNNLSTM обучался намного быстрее, но существуют значительные различия в прогнозах:

CuDNNLSTM vs LSTM differences in predictions

Почему существует такая разница в прогнозах?

Когда я модифицировал CuDNNLSTM для единиц 150 и 200 эпох (синяя линия), результаты были намного лучше:

CuDNNLSTM vs CuDNNLSTM vs LSTM differences in predictions

Редактировать: вот код дляCuDNNLSTM версия:

def make_gpu_regressor():

    regressor = Sequential()
    regressor.add(CuDNNLSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], 1)))
    regressor.add(Dropout(0.2))

    regressor.add(CuDNNLSTM(units=50, return_sequences=True))
    regressor.add(Dropout(0.2))

    regressor.add(CuDNNLSTM(units=50, return_sequences=True))
    regressor.add(Dropout(0.2))

    regressor.add(CuDNNLSTM(units=50))
    regressor.add(Dropout(0.2))

    regressor.add(Dense(units=1))

    regressor.compile(optimizer='adam', loss='mean_squared_error')
    regressor.fit(x=X_train, y=y_train, epochs=100, batch_size=32)
    regressor.save('model_gpu.h5')
    return regressor

regressor_gpu = make_gpu_regressor()
regressor_cpu = make_cpu_regressor()

predicted_stock_price_gpu = regressor_gpu.predict(X_test)
predicted_stock_price_gpu = sc.inverse_transform(predicted_stock_price_gpu)
predicted_stock_price_cpu = regressor_cpu.predict(X_test)
predicted_stock_price_cpu = sc.inverse_transform(predicted_stock_price_cpu)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...