【发布时间】:2020-06-11 09:28:09
【问题描述】:
我在模型上得到了一个非常奇怪的结果。好吧,我对其进行了训练,它在训练中得到了大约 99.5% 的准确率,但就像你在下图中看到的那样,验证结果太奇怪了。
所以在训练之后,我测试了我的模型(在训练、验证和测试数据上),我得到了一个非常非常奇怪的结果。当我在没有 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