тонкая настройка с нормализацией партии в керасе - PullRequest
0 голосов
/ 24 декабря 2018

Я успешно обучил модель более 100000 образцов, которая хорошо работает как в наборе поездов, так и в тестовом наборе.Затем я попытался настроить его на один конкретный образец (один из 100000 образцов) и использовать тренировочные веса в качестве инициализации.

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

model = mymodel()
model.load_weights('./pre_trained.h5') #start from history
rate = model.evaluate(x, y)
print(rate)
checkpoint = tf.keras.callbacks.ModelCheckpoint('./trained.h5', monitor='loss',
        verbose=0, save_best_only=True, mode='min',save_weights_only=True)
model.fit(x, y,validation_data=[x, y], epochs=5, verbose=2, callbacks=[checkpoint])

model.load_weights ('./ train.h5') rate = model.evaluate (x, y) print (rate)

mymodel - это функция самоопределения для генерации моей модели, состоящая из нормализации плотности и партии.x, y - ввод и метка одного конкретного образца.Я хочу дополнительно оптимизировать потери образца.Однако результаты выглядят странно:

 1/1 [==============================] - 0s 209ms/step
-6.087581634521484
Train on 1 samples, validate on 1 samples
Epoch 1/200
 - 1s - loss: -2.7749e-01 - val_loss: -6.0876e+00
Epoch 2/200
 - 0s - loss: -2.8791e-01 - val_loss: -6.0876e+00
Epoch 3/200
 - 0s - loss: -3.0012e-01 - val_loss: -6.0876e+00
Epoch 4/200
 - 0s - loss: -3.1325e-01 - val_loss: -6.0876e+00

Как показано, сначала model.evaluate работает хорошо, так как результат потери (-6.087581634521484) близок к производительности загруженной обученной модели.Но потеря в наборе поездов (фактически такая же, как в валидации model.fit()) странная.Значение val_loss нормальное, аналогично результатам модели. Оцените в первой строке.Так что я действительно озадачен тем, почему все еще большая разница между потерей поезда и потерей вывода (потеря поезда хуже), так как выборка поезда и выборка проверки одинаковы, я думаю, что результат также должен быть одинаковымили, по крайней мере, очень близко. Я подозреваю, что проблема вызвана уровнем BN, из-за большой разницы между поездом и выводом.Тем не менее, я уже установил trainable = False слоя BN после загрузки предварительно обученных весов и до model.fit, но проблема не решена.

out = tf.keras.layers.BatchNormalization(trainable=False)(out)

Я все еще сомневаюсь в слое BN и задаюсь вопросом, достаточно ли установить trainable=False, чтобы параметры BN были одинаковыми.

Может кто-нибудь дать мне какой-нибудь совет?Большое спасибо за вашу помощь заранее.Извините за мой английский, но я изо всех сил старался объяснить мою проблему.

Ответы [ 3 ]

0 голосов
/ 10 января 2019

Я нашел возможное объяснение здесь: https://github.com/keras-team/keras/pull/9965 и здесь: https://github.com/keras-team/keras/issues/9214

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

У меня была похожая находка в pytorch, которой я хотел бы поделиться.Прежде всего, какая у вас версия кераса?Поскольку после 2.1.3, установка уровня BN trainable = False приведет к тому, что BN будет вести себя точно так же в режиме вывода, а это означает, что он не нормализует входные данные до 0, означают 1 дисперсию (как в режиме обучения), но изменяет среднее значение и дисперсию.Если вы установите фазу обучения равной 1, то BN по существу становится нормой экземпляра, которая игнорирует среднее значение и дисперсию, просто нормализуется до 0 среднего и 1 дисперсии, что может быть вашим желаемым поведением.

Ссылка на ссылку к выпуску keras: https://github.com/keras-team/keras/releases/tag/2.1.3

API изменяет обучаемый атрибут в BatchNormalization, теперь отключает обновления статистики пакета (т. Е. Если trainable == False, слой теперь будет работать на 100% в режиме вывода).

0 голосов
/ 24 декабря 2018

Немного неловко, я нашел странный способ решения проблемы в другом вопросе Керас: Точность снижается во время начальной настройки

На самом деле, я думаю, что это не достаточно ответа, нокогда я добавляю

 tf.keras.backend.set_learning_phase(1)

перед model.compile().Результат стал намного нормальным, хотя все еще существует некоторая проблема:

1/1 [==============================] - 0s 246ms/step
-6.087581634521484
Train on 1 samples, validate on 1 samples
Epoch 1/10
 - 1s - loss: -6.0876e+00 - val_loss: -6.0893e+00
Epoch 2/10
 - 0s - loss: -6.0893e+00 - val_loss: -6.0948e+00
Epoch 3/10
 - 0s - loss: -6.0948e+00 - val_loss: -6.0903e+00
Epoch 4/10
 - 0s - loss: -6.0903e+00 - val_loss: -6.0927e+00

Это удивительно и то, что я хочу, но я все еще озадачен этой проблемой.Во-первых, почему это работает, что делает tf.keras.backend.set_learning_phase(1)?Кроме того, я установил layers.trainbale=True, и почему слой BN работает нормально в этом случае?Тогда почему потеря и val_loss все еще имеют очень маленькую разницу?Как образец то же самое, что вызывает явление?Наконец, я обнаружил, что, использую ли я tf.keras.backend.set_learning_phase(0) или tf.keras.backend.set_learning_phase(1), результат будет аналогичным и нормальным.Ниже приведен результат tf.keras.backend.set_learning_phase(0):

1/1 [==============================] - 0s 242ms/step
-6.087581634521484
Train on 1 samples, validate on 1 samples
Epoch 1/10
 - 1s - loss: -6.0876e+00 - val_loss: -6.0775e+00
Epoch 2/10
 - 0s - loss: -6.0775e+00 - val_loss: -6.0925e+00
Epoch 3/10
 - 0s - loss: -6.0925e+00 - val_loss: -6.0908e+00
Epoch 4/10
 - 0s - loss: -6.0908e+00 - val_loss: -6.0883e+00

Он немного отличается от tf.keras.backend.set_learning_phase(1), который также ожидает правильного объяснения.

Я новичок в области глубокого обучения и Keras, и мне очень помогает переполнение стека.И за мои знания, и за мой английский.

Спасибо за помощь заранее.

...