如何提高我的cnn训练模型的性能



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

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

我测试了不同的模型——简单的,硬的,做了数据扩充以避免过拟合,但结果总是一样的,我有";相当糟糕";结果或";嘈杂的";如图所示。

图形精度模型1

图形损失模型1

结果模型1

图形精度模型2

图形损失模型2

结果模型2

正如你所看到的,我用不同的参数测试了两个不同的模型(不同大小的图片,activations=elu,内核大小不同,一开始是8和16(。

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

我会给你我的模型和我的20km/h标志数据集的例子。

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'])

你的问题有很多层次,所以让我试着一步一步来。

首先,你的图不是";相当糟糕";而是相当公平地表明您的模型正在训练。这是因为精度的总体趋势是向上的,而损耗是向下的(你可以忽略噪声(。一般来说,图在训练和验证指标之间的差距不应该越来越大,因为这是过度拟合的指标。

这让我进入下一部分——你是如何分配培训/验证/测试数据的?是通常的60-20-20分制吗?如果是,拆分是否分层(每个类别在每个拆分中的比例相同(?您的测试数据必须是完全看不见的数据。

最后,对于使用相机进行的实际推断,背景设置是否与训练图像相同(似乎是在办公室环境中(。在道路上拍摄的图像上进行测试可能会因为背景中添加了细节而使模型偏离正轨,尤其是因为你的模型非常简单。你的任务似乎是某种程度的数字分类——为此,你应该看看在MNIST和SVHN等数据集上表现良好的模型。对于第一步,我建议添加更多的卷积层,看看性能是否有所提高。此外,你可以尝试使用一些内置的keras模型进行迁移学习,这些模型是在图像网络上预训练的,因此为训练提供了良好的基础。

最新更新