【发布时间】:2019-12-22 18:15:11
【问题描述】:
我正在使用 MobileNet 和 TensorFlow 2 来区分 4 个非常相似的玩具。每个玩具我正好有 750 张图片,一个标签包含 750 张“负面”图片,没有任何玩具。
我之前使用 MobileNet 并取得了相当大的成功,但这种情况导致了很多过度拟合(训练/验证准确度之间存在约 30-40% 的差异)。该模型在 3 个 epoch 内很快训练到大约 99.8% 的训练准确度,但验证准确度停留在 75% 左右。验证数据集是 20% 的输入图像的随机集。在查看模型的准确性时,人们对其中一个玩具有很大的偏见,而很多其他玩具被错误地识别为那个玩具。
我已经尝试了几乎所有的方法来解决这个问题:
我在添加到 MobileNet 顶部的 Conv2D 层之后添加了 Dropout,并尝试了介于 0.2 和 0.9 之间的各种丢弃率。
model = tf.keras.Sequential([
base_model,
tf.keras.layers.Conv2D(32, 3, activation='relu'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.GlobalAveragePooling2D(),
tf.keras.layers.Dense(label_count, activation='softmax')
])
我在 Conv2D 层之前添加了一个额外的 Dropout 层,这似乎稍微改善了一些事情:
model = tf.keras.Sequential([
base_model,
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Conv2D(32, 3, activation='relu'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.GlobalAveragePooling2D(),
tf.keras.layers.Dense(label_count, activation='softmax')
])
我还添加了更多测试数据,尝试混合各种照明条件和背景下的玩具照片,并生成叠加在随机背景上的玩具图像。这些都不会产生重大影响。
我应该将 dropout 添加到 MobileNet 模型中,而不仅仅是添加到我在它之后添加的层吗?我在 github 上遇到了 this code 这样做,但我不知道这是否真的是一个好主意 - 或者不知道如何使用 TensorFlow 2 实现这一点。
这是明智的还是可行的?
另外,我能想到的唯一其他想法是:
- 捕获更多图像,使训练更加困难 - 但我认为每个项目 750 应该足以做得很好。
- 不要使用 MobileNet,而是从头开始创建神经网络或使用另一个预先存在的网络。
【问题讨论】:
-
1.使用其他架构;我会推荐
Densenet121和Densenet169,从 imagenet 权重开始并对其进行微调。 2. 在训练期间添加增强
标签: tensorflow conv-neural-network tensorflow2.0 dropout mobilenet