当前位置: 首页 > 面试题库 >

具有预先训练的卷积基数的keras模型中损失函数的奇异行为

傅新
2023-03-14
问题内容

我正在尝试在Keras中创建模型,以便根据图片进行数值预测。我的模型具有 密集的net121
卷积基础,顶部还有几个附加层。除最后两个图层外的所有图层均设置为layer.trainable = False。我的损失是均方误差,因为这是一项回归任务。在训练期间,我得到了loss: ~3,而对同一批数据的评估给出loss: ~30

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

时代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
…)。

有人建议这种行为可能是由于BatchNormalization卷积基础中的层(有关github的讨论)。当然,BatchNormalization我模型中的所有图层也都已设置layer.trainable=False为。也许有人遇到了这个问题并想出了解决方案?


问题答案:

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

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

当一个集trainableFalse,这两个参数冻结和层也停止对平均和std收集统计量。但是看起来该层仍在 使用训练批处理的
训练时间内执行归一化。这很可能是喀拉拉邦的一个bug,或者出于某些原因,他们故意这样做了。结果, 即使可训练属性设置为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**

这是在经过一些培训之后-需要等待,直到收集到有关均值和标准差的足够统计信息为止。

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

Update. I found a great blog post where this issue has been discussed in all
the details. Check it outhere



 类似资料:
  • 我试图设计和训练一个卷积神经网络来识别图像中的圆形细胞。我在完整图像的“切口”上训练它,这些图像中间要么有一个圆(正训练样本),要么没有(负训练样本)。 中间有一个圆圈的图像示例(热图颜色不稳定,图像均为灰度):http://imgur.com/a/6q8LZ 我希望网络输出是一个二进制位图,而不仅仅是对两种类型的输入图像(圆形或不在中间)进行分类,如果输入图像中没有圆形,则该位图是一个统一的值(

  • 文章信息 通过本教程,你可以掌握技能:使用预先训练的词向量和卷积神经网络解决一个文本分类问题 本文代码已上传到Github 本文地址:http://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html 本文作者:Francois Chollet 什么是词向量? ”词向量”(词嵌入)是将一类将词的语义映射到向量空间

  • 本文向大家介绍Keras使用ImageNet上预训练的模型方式,包括了Keras使用ImageNet上预训练的模型方式的使用技巧和注意事项,需要的朋友参考一下 我就废话不多说了,大家还是直接看代码吧! 在以上代码中,我们首先import各种模型对应的module,然后load模型,并用ImageNet的参数初始化模型的参数。 如果不想使用ImageNet上预训练到的权重初始话模型,可以将各语句的中

  • 我使用以下代码将预先训练的ResNet50 keras模型导出到tensorflow中,以便为tensorflow提供服务: 最后,我使用以下函数对tensorflow服务进行预测: 然后,我从一个ipython shell中使用上面的两个函数从ImageNet的val集中选择随机的imagenes,我已经在本地存储了这些ImageNet。问题是tensorflow服务总是为我发送的所有图像返回相

  • 这是我的问题。我训练了一个卷积神经网络,用tensorflow将图像分为两类。我现在想知道如何使用神经网络的权重,并在未标记的随机图像上进行测试。tensorflow中是否有这样的函数,或者我现在应该自己运行卷积吗?

  • /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:174:不推荐使用名称tf.get_default_session。请改用tf.compat.v1.get_default_session。 /usr/local/lib/python3.6/dist-packages/keras/backend/t