首页 > 解决方案 > 为什么 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 的培训过程吗?

在此处输入图像描述

标签: pythontensorflowkeras

解决方案


问题在于 MobileNetV2 模型中的批量归一化层,特别是批量归一化动量参数,如下所述:

fit() 按预期工作,但随后在 evaluate() 模型偶然执行

一个快速的解决方法是将默认动量 0.999 更改为 0.9


推荐阅读