【发布时间】:2018-12-09 21:58:38
【问题描述】:
我正在尝试在 Keras 中创建一个模型,以根据图片进行数值预测。我的模型有 densenet121 卷积基础,顶部有几个附加层。除了最后两个层之外的所有层都设置为layer.trainable = False。我的损失是均方误差,因为它是一个回归任务。在训练期间我得到loss: ~3,而对同一批数据的评估得到loss: ~30:
model.fit(x=dat[0],y=dat[1],batch_size=32)
Epoch 1/1 32/32 [===============================] - 0s 11ms/step - 损失:2.5571
model.evaluate(x=dat[0],y=dat[1])
32/32 [===============================] - 2s 59ms/step 29.276123046875
我在训练和评估期间提供完全相同的 32 张图片。我还使用来自y_pred=model.predict(dat[0]) 的预测值计算了损失,然后使用 numpy 构造了均方误差。结果与我从评估中得到的结果相同(即 29.276123...)。
有人建议这种行为可能是由于卷积基础 (discussion on github) 中的 BatchNormalization 层造成的。当然,我模型中的所有BatchNormalization 层也已设置为layer.trainable=False。也许有人遇到过这个问题并想出了解决方案?
【问题讨论】:
-
您的模型是否包含
Dropout或BatchNormalization层?如果它有 Dropout 层,那么很可能是造成差异的原因。 -
是的,确实如此。我的模型中有一个可训练的 dropout 层。但是 dropout 层通常会产生相反的效果,使评估的损失小于训练期间的损失。此外,它通常不会产生如此大的数量级差异。
-
不一定!尽管在 dropout 层中,一些神经元被丢弃了,但请记住,输出会根据 dropout 率进行缩减。在推理时间(即测试时间)中,完全消除了 dropout,并且考虑到您只训练了一个 epoch 的模型,您看到的行为可能会发生。自己试验一下:只需将
Dropout层的trainable参数设置为False,看看是否会发生这种情况。
标签: python tensorflow keras deep-learning transfer-learning