【问题标题】:Really Weird Result On BatchNorm On tensorflow 2.1在 tensorflow 2.1 上的 BatchNorm 上的结果真的很奇怪
【发布时间】:2020-06-11 09:28:09
【问题描述】:

我在模型上得到了一个非常奇怪的结果。好吧,我对其进行了训练,它在训练中得到了大约 99.5% 的准确率,但就像你在下图中看到的那样,验证结果太奇怪了。

Training log

所以在训练之后,我测试了我的模型(在训练、验证和测试数据上),我得到了一个非常非常奇怪的结果。当我在没有 training=True 的情况下调用模型时,结果几乎每个地方都是 1(我的模型是二元分类器,所以最后一个模型是带 sigmoid 激活的dense(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'])

我对测试数据的测试显示了奇怪的结果: weird result

我的整个代码可以在这里找到 https://colab.research.google.com/drive/1jImiW0Sn3HOGgo-pUb-5TWVcwIRX-HSF

【问题讨论】:

    标签: tensorflow deep-learning transfer-learning batch-normalization


    【解决方案1】:

    嗯,我找到了这个问题的答案。由于 batchnorm 的动量,由于您在非常小的数据集上微调模型,您应该将动量设置为低(以便它可以快速更新移动均值和移动方差)。 tensorflow 上的动量默认是 0.99,设置为 0.9 就可以了。

    【讨论】:

      猜你喜欢
      • 2017-12-24
      • 2013-11-03
      • 1970-01-01
      • 1970-01-01
      • 2017-11-20
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 2018-03-11
      相关资源
      最近更新 更多