Нейронная сеть не узнает, изменил ли я свой обучающий ввод или количество узлов на скрытый слой. - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь предсказать данные об осадках для одной станции по входу 5 соседних станций, используя искусственную нейронную сеть в API Keras (тензорный поток). В качестве исходных данных я использовал данные за последние 3, 5, 10, 20 и 30 лет. Я пытаюсь найти архитектуру, которая хорошо работает все эти годы в качестве обучающего материала, поэтому я начал пробовать разные параметры и другую архитектуру.

Я масштабировал свои данные с помощью MinMaxScaler из sklearn. В целом моя сеть работает хорошо, но по какой-то причине, если я пробую разные годы в качестве входных данных для обучения, иногда сеть предсказывает все нули, и потери не уменьшаются. Также для некоторых комбинаций узлов в моих скрытых слоях сеть, похоже, не обучается.

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

Моя модель выглядит как это:

a_h = 'tanh'
loss = 'mean_squared_error'

node_1 = 5  # number of nodes for 1. hidden layer

NN_model = Sequential([
        Dense(node_1, activation=a_h, input_shape=(X_train.shape[1], )),
        Dense(1, activation='relu')])

opt = keras.optimizers.Adam(learning_rate=0.001)
NN_model.compile(optimizer=opt,
                 loss=loss, metrics=['accuracy'])

early_stop = EarlyStopping(monitor='loss', patience=2, verbose=1)

history = NN_model.fit(X_train_scaled, y_train_scaled, epochs=150, batch_size=1, verbose=2,
                       callbacks=[early_stop], shuffle=True)

y_train_pred_nn = NN_model.predict(X_train_scaled)
y_train_pred_nn = y_scaler.inverse_transform(y_train_pred_nn.reshape(-1, 1))  # rescale data to original raw data format

y_pred_nn = NN_model.predict(X_pred_scaled, verbose=1)
y_pred_nn = y_scaler.inverse_transform(y_pred_nn.reshape(-1, 1))

если я использую 5 лет в качестве входных данных для обучения, модель работает нормально:

Epoch 1/150
180/180 - 0s - loss: 0.0446 - accuracy: 0.5167
Epoch 2/150
180/180 - 0s - loss: 0.0283 - accuracy: 0.5167
Epoch 3/150
180/180 - 0s - loss: 0.0173 - accuracy: 0.5167
Epoch 4/150
180/180 - 0s - loss: 0.0143 - accuracy: 0.5222
Epoch 5/150
180/180 - 0s - loss: 0.0135 - accuracy: 0.5222
Epoch 6/150
180/180 - 0s - loss: 0.0128 - accuracy: 0.5222
Epoch 7/150
180/180 - 0s - loss: 0.0125 - accuracy: 0.5222
Epoch 8/150
180/180 - 0s - loss: 0.0122 - accuracy: 0.5222
Epoch 9/150
180/180 - 0s - loss: 0.0115 - accuracy: 0.5222
Epoch 10/150
180/180 - 0s - loss: 0.0115 - accuracy: 0.5222
Epoch 11/150
180/180 - 0s - loss: 0.0108 - accuracy: 0.5222
Epoch 12/150
180/180 - 0s - loss: 0.0110 - accuracy: 0.5222
Epoch 13/150
180/180 - 0s - loss: 0.0103 - accuracy: 0.5222
Epoch 14/150
180/180 - 0s - loss: 0.0103 - accuracy: 0.5222
Epoch 15/150
180/180 - 0s - loss: 0.0098 - accuracy: 0.5222
Epoch 16/150
180/180 - 0s - loss: 0.0096 - accuracy: 0.5222
Epoch 17/150
180/180 - 0s - loss: 0.0094 - accuracy: 0.5222
Epoch 18/150
180/180 - 0s - loss: 0.0094 - accuracy: 0.5222
Epoch 19/150
180/180 - 0s - loss: 0.0090 - accuracy: 0.5222
Epoch 20/150
180/180 - 0s - loss: 0.0086 - accuracy: 0.5222
Epoch 21/150
180/180 - 0s - loss: 0.0084 - accuracy: 0.5222
Epoch 22/150
180/180 - 0s - loss: 0.0086 - accuracy: 0.5222
Epoch 23/150
180/180 - 0s - loss: 0.0082 - accuracy: 0.5222
Epoch 24/150
180/180 - 0s - loss: 0.0081 - accuracy: 0.5222
Epoch 25/150
180/180 - 0s - loss: 0.0080 - accuracy: 0.5222
Epoch 26/150
180/180 - 0s - loss: 0.0078 - accuracy: 0.5222
Epoch 27/150
180/180 - 0s - loss: 0.0076 - accuracy: 0.5222
Epoch 28/150
180/180 - 0s - loss: 0.0077 - accuracy: 0.5222
Epoch 29/150
180/180 - 0s - loss: 0.0072 - accuracy: 0.5222
Epoch 30/150
180/180 - 0s - loss: 0.0076 - accuracy: 0.5222
Epoch 31/150
180/180 - 0s - loss: 0.0074 - accuracy: 0.5222
Epoch 00031: early stopping
1/1 [==============================] - 0s 0s/step
Mean Squared Error: 0.43
Mean Absolute Error: 0.31
Root Mean Squared Error: 0.65
The R2 score on the Train set is:   0.812
The R2 score on the Test set is:    0.793

Но как только я использую 10 или 20 лет в качестве входных данных для обучения, я получите это:

Epoch 1/150
630/630 - 0s - loss: 0.0165 - accuracy: 0.5095
Epoch 2/150
630/630 - 0s - loss: 0.0165 - accuracy: 0.5095
Epoch 3/150
630/630 - 0s - loss: 0.0165 - accuracy: 0.5095
Epoch 00003: early stopping
1/1 [==============================] - 0s 0s/step
Mean Squared Error: 2.41
Mean Absolute Error: 0.59
Root Mean Squared Error: 1.55
The R2 score on the Train set is:   -0.267
The R2 score on the Test set is:    -0.169

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

Использование 30 лет в качестве ввода снова работает нормально. И то же самое произойдет, если я потрачу 5 лет на обучение с разными комбинациями скрытых слоев и количества узлов.

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

...