【发布时间】:2019-05-23 12:21:28
【问题描述】:
我已经成功训练了超过 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('./trained.h5') 率 = model.evaluate(x, y) 打印(速率)
mymodel 是一个自定义函数来生成我的模型,由 Dense 和 Batch 标准化组成。 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是正常的,和第一行model.evaluate的结果类似。所以我真的很困惑,为什么train loss和inference loss之间仍然有很大的差异(train loss更差),因为train sample和validation sample是一样的,我想结果也应该是一样的,或者至少非常接近。我怀疑问题是由 BN 层引起的,因为训练和推理之间的差异很大。但是,我已经在加载预训练的权重之后和model.fit之前设置了BN层的trainable = False,但是问题并没有解决。
out = tf.keras.layers.BatchNormalization(trainable=False)(out)
我还是怀疑BN层,不知道设置trainable=False是否足以保持BN的参数不变。
谁能给我一些建议?非常感谢您提前提供的帮助。 对不起我的英语,但我已尽力解释我的问题。
【问题讨论】:
-
简而言之,为什么loss和val_loss在model.fit()中有如此大的差异,而训练集和推理集共享同一个样本?我认为结果必须相同或至少接近,原因是什么?
标签: python tensorflow keras deep-learning batch-normalization