python - 为什么 tensorflow/keras 与训练和验证指标相距甚远?
问题描述
对我的项目的描述,我正在尝试训练一个网络来识别包含从 0 到 9 的数字的图片并将其分类。我的模型如下
model = Sequential(
[
tf.keras.applications.MobileNetV2(include_top=False, input_shape=(224, 224, 3)),
Flatten(),
Dense(128), LeakyReLU(alpha=.3),
Dense(128), LeakyReLU(alpha=.3),
Dense(128), LeakyReLU(alpha=.3),
Dense(128), LeakyReLU(alpha=.3),
Dense(10, activation='softmax')
]
)
model.compile(
optimizer='adam',
loss='categorical_crossentropy',
metrics=['categorical_accuracy','accuracy','mae']
)
我不认为这是过度拟合的问题。数据来自数据生成器,该生成器使用 opencv 的 putText 函数使用随机字体、字体大小/粗细以及随机旋转和移位来创建带有数字的新图片,这意味着所有数据是完全独一无二的。我还目视验证了数据,似乎没有任何异常。我做了两个实验。首先,我创建了两个单独的生成器,一个训练和验证生成器,在 epoch 结束时,之前的验证数据成为训练数据,并为验证创建新数据,但是当这种情况发生时,我没有看到训练指标完全下降。接下来,我使用一组静态训练数据训练模型,并使用完全相同的数据进行验证。
train_x,train_y=new_data(3200)
train_x=train_x/255
history = model.fit(train_x,train_y,steps_per_epoch=steps, epochs=15, verbose=1,validation_data=(train_x,train_y))
然而,在这种情况下,尽管是完全相同的数据,但验证指标比附加图像中显示的训练指标要差得多。有谁知道发生了什么?我只是误解了 keras 的培训过程吗?
解决方案
问题在于 MobileNetV2 模型中的批量归一化层,特别是批量归一化动量参数,如下所述:
fit() 按预期工作,但随后在 evaluate() 模型偶然执行
一个快速的解决方法是将默认动量 0.999 更改为 0.9
推荐阅读
- java - 正则表达式忽略某些字符之间
- java - 如何在 Gams 中从 API Java 运行 gms 模型并在文件中设置包含数据的文件夹
- swift - URL 中的 Swift 引号
- android - 带有几个按钮的主活动屏幕,单击这些按钮会启动一个新屏幕以显示结果
- javascript - Jest 和 Enzyme 模拟输入字段的 onClick 方法
- javascript - 在每个单词之前添加“@”+每个单词之间有一个空格(JavaScript)?
- c++ - 重载运算符 << 后打印二维数组
- c++ - 给 enum 一个 int 数并在 c++ 中将其相关值作为字符串获取
- python-3.x - 将 Pandas df 中的数据提取到列表中
- sql - 在 Bigquery 中使用 REGEXP_EXTRACT 查找破折号之间的字符串