Действительно странный результат на BatchNorm On tenorflow 2.1 - PullRequest
0 голосов
/ 27 февраля 2020

Я получил очень странный результат на модели. Что ж, я тренирую его, и он дает результат с точностью примерно 99,5% на тренировках, но, как вы видите на рисунке ниже, результат проверки такой странный.

Журнал тренировок

Итак, после тренировки я тестирую свою модель (и на тренировке, и на валидации, и на данных теста) и получаю очень странный результат. Когда я называю модель без обучения = True, результат почти 1 каждый (моя модель - двоичный классификатор, поэтому последняя модель плотная (1) с сигмовидной активацией). Действительно странно, когда я тестирую с: model (test_tensor, training = True), я получаю разумный результат, когда могу воспроизвести результат 99,5% на наборе поездов и удивительно, 98,5% на наборе тестов. Я сомневаюсь в этом из-за слоя BatchNorm, так как это единственный слой в моей модели, который отличается на этапе обучения и тестирования. Таким образом, я проверяю результат, чтобы увидеть, изучаются ли moving_mean и moving_variance во время обучения, и да, он действительно изучает (так как это не ноль и единица, значение по умолчанию), и фактически он используется во время тестирования (я проверяю с использованием moving_mean и Дисперсия Batchnorm и применить его к выходу предыдущего слоя. Я так устал, чтобы понять, что на самом деле происходит. Так что у кого-нибудь есть идея, что на самом деле происходит?

Моя модель здесь:

import tensorflow as tf
input_layer = tf.keras.layers.Input(shape=(224,224,3), name='input')
pretrained_model = tf.keras.applications.mobilenet_v2.MobileNetV2(include_top=False, 
weights='imagenet')
pretrained_model_output = pretrained_model(input_layer)
global_avg = tf.keras.layers.GlobalAveragePooling2D()(pretrained_model_output)
dense = tf.keras.layers.Dense(units=512)(global_avg)
dense = tf.keras.layers.BatchNormalization()(dense)
dense = tf.keras.layers.ReLU()(dense)
output = tf.keras.layers.Dense(units=1,activation='sigmoid')(dense)
model = tf.keras.Model(input_layer, output)
model.compile(optimizer=tf.keras.optimizers.Adam(lr=1e- 
3),loss=tf.keras.losses.binary_crossentropy,metrics=['accuracy'])

Мой тест на тестовых данных, которые показывают странный результат: странный результат

Весь мой код можно найти здесь https://colab.research.google.com/drive/1jImiW0Sn3HOGgo-pUb-5TWVcwIRX-HSF

1 Ответ

0 голосов
/ 27 февраля 2020

Ну, я нахожу ответ на этот вопрос. Это из-за импульса batchnorm, так как вы точно настраиваете модель на довольно маленьком наборе данных, вы должны установить минимум импульса (чтобы он мог обновлять скользящее среднее и быстрое изменение дисперсии). Импульс по умолчанию для tenorflow равен 0,99, установите 0,9, и все будет хорошо.

...