我是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张图像。在四个时期中,我在训练阶段达到了90%的准确率,但在测试阶段只有50%的准确率。这个模型在预测从未见过的图像结果方面表现不佳。
我的CNN模型非常基础。我不得不将历元的数量从5个减少到4个,因为它在第五个历元开始过度拟合。我的问题是:我如何改进我的模型?我的数据集足够大吗?我需要向模型中添加更多的层吗?
提前谢谢。
更新
以下是经过审核的模型:
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')
])发布于 2019-09-30 17:21:22
训练和测试性能之间的巨大差异通常是过度拟合的迹象。由于您的模型已经相当浅,您可以考虑更改在Conv2D层中计算的要素数量。在使用16或24个功能而不是32个的情况下,它的性能如何?
发布于 2019-09-30 17:25:46
第一个问题:
我会使用更好的小模型,比如MobileNets或EfficientNetB0,因为你现在的模型太小了,它甚至不能在mnist中工作。但要注意不要使用太大的模型,因为它可能更容易在较小的数据集中过度拟合。
此外,减少图像输入大小,224*224通常就足够了,大图像导致在小数据集中过度拟合。
最重要的是不要忘记使用数据增强,就像keras中的ImageDataGenerator。
第二个问题:
这不是,我认为即使使用EfficientNetB0也会很困难,至少对于传统的图像分类器来说,你可能需要每个类都有50+图像。据我所知,Siamese network或Matching network可能会提供更好的结果。
第三个问题:
与第一个类似,你的网络甚至比第一个CNN,LeNet更小,它需要32x32的输入图像。
更新:
使用此选项,而不是仅堆叠更多的转换层。
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)https://stackoverflow.com/questions/58164678
复制相似问题