【问题标题】:Keras model for vehicle orientation车辆定位的 Keras 模型
【发布时间】:2019-09-30 09:07:07
【问题描述】:

我是 Keras 和 TensorFlow 的新手。我正在尝试训练用于图像分类的卷积神经网络。我有大量车辆图像,需要获取方向分类。 Here 是一种使用梯度直方图 (HOG) 的方法(我还需要车顶类,一共九个类)。

以下是我的 CNN 的 Python 代码。

model = Sequential([
    Conv2D(32, (5, 5), input_shape=(1536, 2048, 3)),
    MaxPooling2D(pool_size=(2, 2)),
    Flatten(),
    # One output network layer with 9 nodes (corresponding to the 9 final classes/orientations)
    Dense(9, activation='softmax')
])

model.compile(
    optimizer='adam',
    loss='categorical_crossentropy',
    metrics=['accuracy'] 
)

model.fit(
    train_images,                 # Training data
    to_categorical(train_labels), # Training targets
    epochs=4,
    batch_size=16
)

如您所见,我的 CNN 仅由三层组成。我的训练数据集由 100 辆不同车辆的样本组成,每辆车都有所有 9 个所需的方向,总共有 900 张图像。在四个 epoch 中,我设法在训练阶段达到了 90% 的准确率,但在测试阶段只有约 50% 的准确率。该模型在预测其从未见过的图像的结果时表现不佳。

我的 CNN 模型非常基础。我不得不将 epoch 的数量从 5 减少到 4,因为它在第五个 epoch 开始过拟合。我的问题是:如何改进我的模型?我的数据集足够大吗?我必须向模型添加更多层吗?

提前致谢。

更新

这是经过审查的模型:

model = Sequential([
    Conv2D(32, (3, 3), input_shape=(224, 224, 3)),
    MaxPooling2D(pool_size=(2, 2)),

    Conv2D(64, (3, 3)),
    MaxPooling2D(pool_size=(2, 2)),

    Conv2D(128, (3, 3)),
    MaxPooling2D(pool_size=(2, 2)),

    Conv2D(128, (3, 3)),
    Conv2D(256, (3, 3)),
    MaxPooling2D(pool_size=(2, 2)),

    Conv2D(256, (3, 3)),
    MaxPooling2D(pool_size=(2, 2)),

    Flatten(),
    # One output network layer with 9 nodes (corresponding to the 9 final classes/orientations)
    Dense(9, activation='softmax')
])

【问题讨论】:

  • Thia 模型仍然太小,如果没有 GPU,请在 Colab 中训练更好的模型

标签: python tensorflow machine-learning keras


【解决方案1】:

训练和测试性能之间的巨大差异通常表明过度拟合。由于您的模型已经很浅,您可以考虑更改在Conv2D 层中计算的特征数量。使用 16 或 24 个功能而不是 32 个功能时,它的表现如何?

【讨论】:

    【解决方案2】:

    第一个问题:

    我会使用更好的小型模型,例如 MobileNetsEfficientNetB0,因为您现在的模型太小,甚至无法在 mnist 中使用。但请注意不要使用太大的模型,因为它可能更容易在小数据集中过拟合。

    另外,减少图像输入尺寸,通常 224*224 就足够了,大图像会导致在小数据集中过拟合。

    最重要的注意事项是不要忘记使用数据增强,例如 keras 中的ImageDataGenerator

    第二个问题:

    不是,我认为即使使用EfficientNetB0 也会很困难,至少对于传统的图像分类器,每个类可能需要 50 多张图像。据我所知,Siamese network Matching network 可能会提供更好的结果。

    第三个问题:

    与第一个类似,您的网络甚至比第一个 CNN LeNet 还要小,后者需要 32x32 输入图像。

    更新:

    使用它而不是仅仅堆叠更多的 Conv 层。

    from keras.applications.mobilenet_v2 import MobileNetV2
    from keras import layers, models
    base_model = MobileNetV2(include_top=False)
    x = base_model.output
    x = layers.GlobalAveragePooling2D()(x)
    x = layers.Dense(9, activation='softmax')(x)
    model = models.Model(base_model.inputs, x)
    

    【讨论】:

    • 感谢您的回答。我减小了图像大小,增加了我的数据集,改变了模型,我设法达到了大约 80% 的测试准确率,还不错。更新的模型在原始问题中。当我添加数据增强(仅宽度和高度变化)时出现问题:这里我的测试准确度再次下降到 50%。为什么会这样?我应该继续增加我的数据集以获得更好的结果吗?是否值得再次审查模型?
    • 也许你移动太多了?如果对象几乎适合图像,则移动可能会导致某些内容丢失。通常我只是在 0.1-0.15 左右移动并使用flip
    • 更多数据总是更好,但如果您可以尝试其他方法(匹配算法),我不知道它是否真的值得。这看起来就像我们识别鲸鱼时一样,通常每类只有 2-3 张图片。
    • 就像我在第一个答案中所说的,使用已经测试过的模型!!如果你可以使用预训练的权重,它肯定比堆叠更多层更好。
    • 再次感谢您的回答。我尝试了您建议的 MobileNetV2,但不幸的是,测试准确率约为 35%,而训练准确率仍然很高(约 96%)。关于如何改进此模型的任何建议?
    猜你喜欢
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    相关资源
    最近更新 更多