Попытка предсказать числа в LSTM и иметь чрезвычайно высокие потери (даже с MinMax Scaler и Dropout) - PullRequest
0 голосов
/ 18 июня 2020
from numpy import array
from keras.models import Sequential
from keras.layers import LSTM, Dropout
from keras.layers import Dense

def split_univariate_sequence(sequence, n_steps_in, n_steps_out):
    X, y = list(), list()
    for i in range(len(sequence)):
        # find the end of this pattern
        end_ix = i + n_steps_in
        out_end_ix = end_ix + n_steps_out
        # check if we are beyond the sequence
        if out_end_ix > len(sequence):
            break
        # gather input and output parts of the pattern
        seq_x, seq_y = sequence[i:end_ix], sequence[end_ix:out_end_ix]
        X.append(seq_x)
        y.append(seq_y)
    return array(X), array(y)

n_steps_in, n_steps_out = 30, 30

X1, y1 = split_univariate_sequence(sumpred, n_steps_in, n_steps_out)

transformer = MinMaxScaler()
X1_transformed = transformer.fit_transform(X1)

n_features = 1
X1_transformed = X1_transformed.reshape((X1_transformed.shape[0], X1_transformed.shape[1], n_features))

model = Sequential()
model.add(LSTM(150, activation='relu', return_sequences=True, input_shape=(n_steps_in, n_features)))
model.add(Dropout(0.3))
model.add(LSTM(50, activation='relu'))
model.add(Dropout(0.3))
model.add(Dense(n_steps_out))
model.compile(optimizer='adam', loss='mse')

model.fit(X1_transformed, y1, epochs=1000, verbose=1)

# demonstrate prediction
x_input = sumpred[-30:].reshape(1, -1)
x_input = transformer.transform(x_input)
x_input = x_input.reshape((1, n_steps_in, n_features))
yhat = model.predict(x_input, verbose=1)

yhat_inverse = transformer.inverse_transform(yhat)

sumpred - это массив чисел с плавающей запятой-32 (144,) со значениями от 390,624 до 347471. Я пытаюсь предсказать следующие 30 чисел на основе последних 30 sumpred значений.

Когда я тренирую модель, я получаю такие результаты:

Epoch 990/1000
85/85 [==============================] - 0s 2ms/step - loss: 1031220211.9529
Epoch 991/1000
85/85 [==============================] - 0s 2ms/step - loss: 1087168440.4706
Epoch 992/1000
85/85 [==============================] - 0s 2ms/step - loss: 1011368153.6000
Epoch 993/1000
85/85 [==============================] - 0s 2ms/step - loss: 1104842800.1882
Epoch 994/1000
85/85 [==============================] - 0s 2ms/step - loss: 1086514331.1059
Epoch 995/1000
85/85 [==============================] - 0s 2ms/step - loss: 1050088100.8941
Epoch 996/1000
85/85 [==============================] - 0s 2ms/step - loss: 1003426751.2471
Epoch 997/1000
85/85 [==============================] - 0s 2ms/step - loss: 1139417025.5059
Epoch 998/1000
85/85 [==============================] - 0s 2ms/step - loss: 1129283814.4000
Epoch 999/1000
85/85 [==============================] - 0s 2ms/step - loss: 1107968009.0353
Epoch 1000/1000
85/85 [==============================] - 0s 2ms/step - loss: 1651960831.6235

Значения в yhat_inverse намного превосходят ожидаемые. Не лучше было с другими потерями, такими как среднеквадратичная ошибка логарифма c. Даже с преобразованием данных (MinMaxScaler) и Dropout у меня все еще есть эта проблема.

Кто-то знает, как улучшить производительность моей модели?

1 Ответ

0 голосов
/ 18 июня 2020

Ваша модель не может обучаться, поэтому сначала увеличьте размер сети. Учитывая, насколько велики потери, размер входных данных довольно велик, и вы не обеспечиваете достаточную мощность нейронной сети для изучения данных.

Сначала удалите выпадения и просто увеличьте слои и оставьте их все на 150 или больше.

Отбрасывание обычно используется ближе к концу, когда вы видите переоснащение, но ваша модель даже не началась обучение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...