如何提高我的 cnn 训练模型的性能
How to improve perfomance on my cnn trained model
我的问题听起来很抽象,但我在其他讨论中找不到解决问题的方法。
我已经创建了自己的图片数据集 (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
这里如你所见,我测试了两个不同参数的不同模型(不同大小的图片,activations = 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'])
你的问题有很多层次,让我试着一步一步来。
首先,您的图表并非“非常糟糕”,而是非常公平地表明您的模型正在训练。这是因为总的趋势是accuracy是向上的,loss是向下的(可以忽略noise)。
一般来说,图表不应在训练和验证指标之间增加差距,因为这是过度拟合的指标。
这让我进入下一部分 - 您如何拆分 training/validation/testing 数据?
是通常的 60-20-20 拆分吗?如果是,拆分是否分层(每个拆分中每个 class 的比例相同)?你的测试数据需要是完全看不见的数据。
最后,为了使用相机进行实际推理,背景设置是否与训练图像相同(似乎在办公室设置中)。由于背景中的附加细节,对在道路上捕获的图像进行测试可能会使模型偏离 - 特别是当您的模型非常简单时。
看来您的任务是某种程度的数字化 classification - 为此,您应该看看在 MNIST 和 SVHN 等数据集上表现良好的模型。
对于第一步,我建议添加更多的卷积层并查看性能是否有所提高。
此外,您可以尝试使用一些在 imagenet 上预训练的内置 keras 模型进行迁移学习,从而为训练提供良好的基础。
我的问题听起来很抽象,但我在其他讨论中找不到解决问题的方法。
我已经创建了自己的图片数据集 (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
这里如你所见,我测试了两个不同参数的不同模型(不同大小的图片,activations = 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'])
你的问题有很多层次,让我试着一步一步来。
首先,您的图表并非“非常糟糕”,而是非常公平地表明您的模型正在训练。这是因为总的趋势是accuracy是向上的,loss是向下的(可以忽略noise)。 一般来说,图表不应在训练和验证指标之间增加差距,因为这是过度拟合的指标。
这让我进入下一部分 - 您如何拆分 training/validation/testing 数据? 是通常的 60-20-20 拆分吗?如果是,拆分是否分层(每个拆分中每个 class 的比例相同)?你的测试数据需要是完全看不见的数据。
最后,为了使用相机进行实际推理,背景设置是否与训练图像相同(似乎在办公室设置中)。由于背景中的附加细节,对在道路上捕获的图像进行测试可能会使模型偏离 - 特别是当您的模型非常简单时。 看来您的任务是某种程度的数字化 classification - 为此,您应该看看在 MNIST 和 SVHN 等数据集上表现良好的模型。 对于第一步,我建议添加更多的卷积层并查看性能是否有所提高。 此外,您可以尝试使用一些在 imagenet 上预训练的内置 keras 模型进行迁移学习,从而为训练提供良好的基础。