gpt4 book ai didi

python - keras 模型中损失函数的奇怪行为,具有预训练的卷积基

转载 作者:太空狗 更新时间:2023-10-30 00:47:20 25 4
gpt4 key购买 nike

我正在尝试在 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 - loss: 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。也许有人遇到过这个问题并找到了解决方案?

最佳答案

看来我找到了解决方案。正如我所建议的那样,问题出在 BatchNormalization 层上。他们做树的东西

  1. 减去均值并用标准差归一化
  2. 使用移动平均值收集平均值和标准差的统计数据
  3. 训练两个附加参数(每个节点两个)。

当将 trainable 设置为 False 时,这两个参数会卡住,层也会停止收集有关 mean 和 std 的统计信息。但看起来该层在训练期间仍在执行归一化使用训练批处理。很可能这是 keras 中的错误,或者他们可能出于某种原因故意这样做。因此,训练期间前向传播的计算与预测时间相比是不同的即使可训练属性设置为 False

我可以想到两种可能的解决方案:

  1. 将所有 BatchNormalization 层设置为可训练。在这种情况下,这些层将从您的数据集中收集统计数据,而不是使用预训练的数据(这可能会有很大的不同!)。在这种情况下,您将在训练期间将所有 BatchNorm 层调整为您的自定义数据集。
  2. 将模型分成两部分 model=model_base+model_top。之后,使用model_base通过model_base.predict()提取特征,然后将这些特征输入到model_top中,只训练model_top

我刚刚尝试了第一个解决方案,它看起来很有效:

model.fit(x=dat[0],y=dat[1],batch_size=32)

Epoch 1/1
32/32 [==============================] - 1s 28ms/step - loss: **3.1053**

model.evaluate(x=dat[0],y=dat[1])

32/32 [==============================] - 0s 10ms/step
**2.487905502319336**

这是经过一些训练后的结果 - 需要等到收集到足够的均值和标准差统计数据。

第二种解决方案我还没有尝试过,但我很确定它会起作用,因为训练和预测期间的前向传播是相同的。

更新。我发现了一篇很棒的博客文章,其中对这个问题进行了详细讨论。看看here

关于python - keras 模型中损失函数的奇怪行为,具有预训练的卷积基,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51123198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com