【问题标题】:How to improve perfomance on my cnn trained model如何提高我的 cnn 训练模型的性能
【发布时间】:2022-01-07 15:25:15
【问题描述】:

我的问题听起来很抽象,但我在其他讨论中找不到我的问题的解决方案。

我创建了自己的图片数据集 (128*128) 以拥有一个识别限速标志的 cnn 模型。所以我拍了大约 2000 张照片,大约分为 8 类。所以每个标志我有大约 200 张或更多的图片。

我已经测试了不同的模型,简单的模型,困难的模型,进行了数据增强以避免过度拟合,但结果始终相同,如图所示,我得到了“相当糟糕”或“嘈杂”的结果。

graph accuracy model 1

graph loss model 1

result model 1

graph accuracy model 2

graph loss model 2

result model 2

如您所见,我用不同的参数测试了两个不同的模型(图片大小不同,激活 = elu,内核大小不同,从 8 和 16 开始)。

所以我或多或少对我的工作深信不疑,因为当它来自我的相机的实时识别时,它不能很好地工作,或者预测并不总是正确的(尽管准确度为 0.9)。也许它来自我不正确的数据集?我的模型?我想对这个棘手的问题稍微了解一下:)。

我会给你我的模型和我的 20 公里/小时标志数据集示例。

example dataset 20km/h

此型号代码对应第二张图和结果:

no_Of_Filters = 8
size_of_Filter = (3, 3)  # THIS IS THE KERNEL THAT MOVE AROUND THE IMAGE TO GET THE FEATURES.
# THIS WOULD REMOVE 2 PIXELS FROM EACH BORDER WHEN USING 100 100 IMAGE
size_of_pool = (2, 2)  # SCALE DOWN ALL FEATURE MAP TO GENERALIZE MORE, TO REDUCE OVERFITTING
no_Of_Nodes = 100  # NO. OF NODES IN HIDDEN LAYERS
model = Sequential()
# ADDING MORE CONVOLUTION LAYERS = LESS FEATURES BUT CAN CAUSE ACCURACY TO INCREASE
model.add((layers.Conv2D(no_Of_Filters, size_of_Filter, input_shape=(imageDimensions[0], imageDimensions[1], 1),
                         activation='elu')))

model.add((layers.Conv2D(no_Of_Filters * 2, size_of_Filter, activation='elu')))
model.add(layers.MaxPooling2D(pool_size=size_of_pool))

model.add((layers.Conv2D(no_Of_Filters * 4, size_of_Filter, activation='elu')))

model.add((layers.Conv2D(no_Of_Filters * 8, size_of_Filter, activation='elu')))
model.add(layers.MaxPooling2D(pool_size=size_of_pool))

model.add(Flatten())
model.add(Dense(no_Of_Nodes, activation='relu'))
# model.add(Dropout(0.2))  # INPUTS NODES TO DROP WITH EACH UPDATE 1 ALL 0 NONE
model.add(Dense(noOfClasses, activation='softmax'))  # OUTPUT LAYER
# COMPILE MODEL
model.compile(Adam(lr=0.001), loss='categorical_crossentropy', metrics=['accuracy'])

【问题讨论】:

  • 也许您可以尝试在您的 Conv2DMaxPooling2D 之后添加 layers.Dropout 。它可能有助于过度拟合。

标签: python tensorflow keras conv-neural-network image-recognition


【解决方案1】:

您的问题涉及多个层面,所以让我一步一步尝试。

首先,您的图表并不是“非常糟糕”,而是您的模型正在训练的非常公平的指标。这是因为准确率的总体趋势是向上的,而损失是向下的(可以忽略噪声)。 一般来说,图表不应在训练和验证指标之间存在越来越大的差距,因为这是过度拟合的指标。

这将我带到下一部分 - 您如何拆分训练/验证/测试数据? 是通常的 60-20-20 拆分吗?如果是,拆分是否分层(每个拆分中每个类别的比例相同)?您的测试数据必须是完全不可见的数据。

最后,对于使用您的相机进行实际推理,背景设置是否与训练图像相同(似乎是在办公室设置中)。由于背景中的附加细节,对在道路上捕获的图像进行测试可能会使模型失效——尤其是当您的模型非常简单时。 看来您的任务是某种程度的数字分类 - 为此,您应该查看在 MNIST 和 SVHN 等数据集上表现良好的模型。 对于第一步,我建议添加更多卷积层并查看性能是否有所提高。 此外,您可以尝试使用一些在 imagenet 上预训练的内置 keras 模型进行迁移学习,从而为训练提供良好的基础。

【讨论】:

  • 首先感谢您的回答。对于拆分,是的,它像往常一样是 60、20、20。但是我没有在每个班级中放置任何相同比例的东西,所以我会检查这个方向来改进它。对于数据集,是的,它确实在我的办公室,但我认为它会产生一个后果,这就是为什么在屏幕上它没有显示它但我有 3/4 不同的背景。但如果它可以改进我的数据集,那么我也会添加一些不同的背景。我肯定会检查 MNIST 和 SVHN 数据集,如果他们有我感兴趣的数据集。但是再次感谢您的回答,我会尽快回来。
猜你喜欢
  • 2021-06-06
  • 2019-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
相关资源
最近更新 更多