Получение одинаковых метрик проверки в нейронной сети Keras каждую эпоху, но только иногда - PullRequest
0 голосов
/ 23 апреля 2019

Итак, у меня есть простая проблема регрессии, которую я пытаюсь решить с помощью нейронной сети Keras. Модель довольно проста, но работает относительно хорошо иногда . Пример проблемы: я запускаю код создания и обучения модели в первый раз, и все работает нормально. Затем я перезапускаю все это, и внезапно потери проверки становятся одинаковыми в каждую эпоху и не становятся ниже. (также в подобных случаях обычная потеря слишком велика). Если я запусту ее снова после этого, все будет нормально и снова.

Кажется, проблема возникает только при использовании оптимизатора Adam. С оптимизатором Adadelta я еще не сталкивался с этой проблемой.

Это не постоянная проблема, которая затрудняет отладку. Я предполагаю, что это либо какая-то случайная инициализация переменной в модели, либо неправильная функция активации вывода.

Я пытался поиграть с настройками в оптимизаторе Адама, такими как скорость обучения, затухание и т. Д. Также я играл с размером партии во время тренировки, но, похоже, ничто не решает эту проблему на 100%.

Вот простой код, который я использую для создания и обучения модели.

model = tf.keras.Sequential([
    layers.Dense(80, input_dim=X.shape[1], kernel_initializer='normal', activation='relu'),
    layers.Dense(80, kernel_initializer='normal', activation='relu'),
    layers.Dense(1, kernel_initializer='normal', activation='relu')
])
opt = optimizers.Adam(lr=0.001)
model.compile(optimizer=opt, loss=['mean_absolute_error'], metrics=[rmse])

history = model.fit(X, y, epochs=50, batch_size=20, validation_data=[X_test, y_test], shuffle=True)

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

vendor_id   passenger_count pickup_longitude    pickup_latitude dropoff_longitude   dropoff_latitude    distance_haversine  distance_dummy_manhattan    direction   pickup_cluster  dropoff_cluster Month   DayofMonth  Hour    dayofweek
2   1   -74.003440  40.743584   -73.98218   40.737580   1.911775    2.458974    110.433360  55  25  1   29  0   4
2   3   -74.002650  40.733400   -73.96405   40.773510   5.519362    7.712331    36.076637   22  5   5   5   14  3
1   1   -73.980380  40.732445   -73.97107   40.754932   2.620580    3.284788    17.408050   88  24  3   8   7   1

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

Epoch 1/50
72816/72816 [==============================] - 17s 240us/sample - loss: 274.6910 - rmse: 370.7113 - val_loss: 248.2299 - val_rmse: 351.9400
Epoch 2/50
72816/72816 [==============================] - 17s 227us/sample - loss: 241.0651 - rmse: 334.2888 - val_loss: 235.2585 - val_rmse: 327.8128
Epoch 3/50
72816/72816 [==============================] - 15s 204us/sample - loss: 232.9749 - rmse: 321.4998 - val_loss: 230.2952 - val_rmse: 319.8226

Иногда вывод, который я получаю, выглядит так:

Epoch 1/50
72816/72816 [==============================] - 16s 220us/sample - loss: 759.9131 - rmse: 894.2183 - val_loss: 759.6450 - val_rmse: 895.1505
Epoch 2/50
72816/72816 [==============================] - 15s 206us/sample - loss: 759.9131 - rmse: 894.3421 - val_loss: 759.6450 - val_rmse: 894.2359
Epoch 3/50
72816/72816 [==============================] - 14s 195us/sample - loss: 759.9131 - rmse: 894.6163 - val_loss: 759.6450 - val_rmse: 894.1488

Есть ли какое-то объяснение этому, или я здесь делаю что-то ужасно неправильное? Спасибо.

1 Ответ

0 голосов
/ 23 апреля 2019

Насколько я знаю, ваша модель может ничего не изучать. Действительно, ваша функция потерь дает слишком высокие выходные значения (это может быть около 1 или меньше, но у вас есть 240).

Есть ли у вас шаг предварительной обработки данных перед тренировкой?

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