Действительно странный результат на BatchNorm на тензорном потоке 2.1

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

Журнал обучения

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

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

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


person TLOfPY    schedule 27.02.2020    source источник


Ответы (1)


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

person TLOfPY    schedule 27.02.2020