1.摘要
本文主要实现了一个卷积神经网络模型进行垃圾图像分类,为了提高垃圾分类模型的准确率,使用使用Batch Normalization层、使用早期停止策略来防止过拟合等方法来优化模型,实验结果显示最终优化后的模型准确率较高90%左右。最终,本文基于PySimpleGUI库实现了一个图形用户界面(GUI)应用程序,旨在演示如何使用深度学习模型进行垃圾分类预测。
2.模型设计与实验
首先设计实现的基线模型结构如下:
为了进一步优化模型,本文从以下几个方面入手进行优化上述模型:
- 模型结构:
- 增加卷积层的数量和/或深度。当前的模型只有两个卷积层,这对于复杂的图像分类任务可能不够。
- 使用Batch Normalization层在卷积层后,有助于加快训练速度并提高模型性能。
- 超参数调整:
- 调整学习率、批量大小、Dropout率等超参数。
- 使用学习率调度器(如StepDecay、ReduceLROnPlateau等)动态调整学习率。
- 尝试不同的优化器,如AdamW、RMSprop等。
- 正则化和Dropout:
- 在全连接层后添加Dropout层,以减少过拟合。
- 尝试L1或L2正则化。
- 早期停止:
- 使用早期停止策略来防止过拟合,基于验证集的性能在连续多个epoch后没有提升时停止训练。
实现的代码如下:
# 调整模型结构
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=train_images[0].shape))
model.add(layers.BatchNormalization())
model.add(layers.Conv2D(32, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.BatchNormalization())
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dropout(0.5))
model.add(layers.Dense(256, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(6, activation='softmax'))
# 编译模型
model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=['accuracy'])
# 使用ReduceLROnPlateau进行学习率调整
lr_reducer = callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.2, patience=5, verbose=1, min_lr=0.00001)
# 训练模型
history = model.fit(train_images, train_labels, epochs=10, callbacks=[lr_reducer, callbacks.EarlyStopping(monitor='val_loss', patience=10)],validation_data=(test_images, test_labels))
本文在如下数据集上进行了实验,总计数据量为10104张,6分类问题。
其实验结果如下:
3.垃圾分类小程序
该应用程序为垃圾分类提供了一个直观且用户友好的界面,使用户能够轻松利用深度学习模型进行垃圾分类预测。其功能为:用户选择包含图像的文件夹;用户从列表中选择图像;应用程序加载并显示选定的图像,并使用模型进行预测;应用程序显示预测结果的条形图,突出显示预测类别测等。使用的函数如Matplotlib(用于绘图)、PySimpleGUI(用于构建GUI)、Keras(用于加载和使用深度学习模型)以及PIL(用于图像处理)
实现的界面如下:
上传一文件夹下的数据进行测试,其结果显示如下:
代码下载链接:
https://download.csdn.net/download/weixin_40651515/90117152
包含数据集等。