目录
2、测试集的模型准确率(accuracy)和损失(loss)的变换情况:
1、引言
1.1、什么是深度学习?
深度学习 (DL,Deep Learning) 是机器学习 (ML,Machine Learning) 领域中的一种新的研究方向, 它通过学习样本数据的内在规律和表示层次,对文字、图像和声音等数据进行解释提供了重要帮助。作为一种复杂的机器学习算法,深度学习在语音和图像识别方面的效果远远超过以前的相关技术。在搜索技术、数据挖掘、机器翻译、自然语言处理、多媒体学习、语音识别、推荐系统、个性化技术等领域,深度学习已经取得了许多成果。
1.2、项目的背景
而近年来,深度学习技术的快速发展极大地推动了图像处理领域的研究进展。其中,植物叶片分类是一项具有挑战性且具有广泛应用前景的任务,如植物学和农业等领域。通过精确识别植物叶片的形态、硬度、颜色和纹理等特征,植物叶片分类有助于植物分类和疾病监测。本项目旨在使用卷积神经网络(CNN)算法构建植物叶片分类模型,以实现对不同种类植物叶片的准确分类。
1.3、数据集的选择与其意义
本项目的目标是使用深度学习方法对瑞典叶子数据集(Swedish leaf dataset),该数据集包含了1125张叶片图片, 涵盖了15种不同的植物物种. 通过植物进行分类,对不同植物叶片的自动识别, 有助于我们更好地了解和监测植物物种的多样性和分布情况, 这对植物研究、生态学、评估生物多样性变化和环境监测等方面具有重要意义!
2、文献回顾
植物叶片分类的任务已经被广泛研究。例如,Khamparia等人(2019)使用SIFT(Scale-Invariant Feature Transform)算法提取叶片图像的特征,并结合支持向量机(SVM)对九种植物进行了分类。Landi等人(2019)则采用深度卷积神经网络对15种植物的叶子进行了分类。Elharrouss等人(2020)则通过应用深度卷积神经网络成功识别了三种水果叶子,并取得了高度精确的结果。
对于植物叶子分类任务,卷积神经网络(CNN)是一种常用且有效的方法。
3、方法论
在本项目中,我们采用了一种基于卷积神经网络(CNN)的模型结构来进行图像分类任务。该模型的结构由多个卷积层、池化层和全连接层组成。
首先,我们添加了一个卷积层,使用32个大小为3x3的卷积核对输入图像进行卷积操作。卷积操作可以提取图像中的局部特征。接着,我们应用了ReLU激活函数,用来引入非线性性质,增强模型的表达能力。 然后,我们添加了一个2x2的最大池化层,用于降低特征图的尺寸,减少计算量,并提取最显著的特征。
model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=X.shape[1:]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
然后,我们重复添加了几个类似的卷积层和池化层。这些层的目的是逐渐提取图像的更高级特征。我们通过增加卷积核的数量和深度,分别为64、128和64个,来捕捉图像中更丰富的信息。
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(128, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(128, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
在卷积层和池化层之后,我们添加了一个Flatten层,将3D的特征图转换为1D的特征向量。这样做的目的是为了将图像的特征表示转换为适合全连接层处理的形式。
接下来,我们添加了两个全连接层。第一个全连接层包含128个神经元,并使用ReLU激活函数。这一层的作用是进一步提取图像特征并进行非线性映射。第二个全连接层包含64个神经元,并使用softmax激活函数。它将生成一个包含64个类别的概率分布,表示输入图像属于每个类别的可能性。
model.add(Flatten()) # this converts our 3D feature maps to 1D feature vectors
model.add(Dense(128))
model.add(Activation('relu'))
model.add(Dense(64))
model.add(Activation('softmax'))
模型的损失函数采用稀疏分类交叉熵,这是因为我们的标签是整数形式的类别标签。优化器采用Adam,是一种常用的优化算法,用于自适应地调整学习率以提高训练效果。
为了增加数据的多样性和泛化能力,我们使用了图像数据生成器(ImageDataGenerator)。通过设置不同的参数,如图像旋转、剪切、缩放和水平翻转等,生成器可以在训练过程中对图像进行实时的数据增强。这有助于提高模型的鲁棒性和泛化能力。
from keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(
rotation_range=20, # 图像旋转
shear_range=0.2, # 剪切
zoom_range=0.2, # 缩放
horizontal_flip=True, # 水平翻转
)
datagen.fit(x_train)
generated_data = datagen.flow(x_train, y_train, batch_size=32)