构建卷积神经网络(CNN)与TensorFlow Keras库的使用

深度学习是机器学习中非常重要的一个子集,因其在各个领域的高性能而备受重视。卷积神经网络(CNN)是深度学习中用于图像处理的强大类型,常用于计算机视觉中的图像和视频识别,以及推荐系统和自然语言处理(NLP)。CNN由多层系统组成,包括输入层、输出层和包含多个卷积层、池化层和全连接层的隐藏层。本文将在下一部分讨论所有这些层,同时解释CNN的构建过程。

使用Keras库构建CNN

将使用疟疾细胞图像数据集来讨论CNN的构建。该数据集包含27,558张显微镜下的血液样本图像,分为两个文件夹——感染和未感染。将通过以下六个步骤来讨论CNN的构建和工作原理:

  1. 导入所需库
  2. 初始化CNN并添加卷积层
  3. 池化操作
  4. 添加两个卷积层
  5. 展平操作
  6. 全连接层和输出层

这六个步骤将解释CNN的工作原理,如下图所示:

现在,让详细讨论每一步:

请参阅以下链接以获取有关Keras模块的详细解释:。

from tensorflow.keras.layers import Input, Lambda, Dense, Flatten, Conv2D from tensorflow.keras.models import Model from tensorflow.keras.applications.vgg19 import VGG19 from tensorflow.keras.applications.resnet50 import preprocess_input from tensorflow.keras.preprocessing import image from tensorflow.keras.preprocessing.image import ImageDataGenerator, load_img from tensorflow.keras.models import Sequential import numpy as np from glob import glob import matplotlib.pyplot as plt from tensorflow.keras.layers import MaxPooling2D model = Sequential() model.add(Conv2D(filters=16, kernel_size=2, padding="same", activation="relu", input_shape=(224, 224, 3)))

首先需要初始化Sequential类,因为构建CNN需要多个层,这些层必须按顺序排列。然后添加第一个卷积层,需要指定五个参数。让讨论每个参数及其目的:

  • 过滤器(Filters):卷积的主要目的是使用特征检测器在图像中找到特征,然后将它们放入特征图中,保留图像的独特特征。特征检测器也被称为过滤器,最初是随机初始化的,经过多次迭代后,选择最佳的过滤器矩阵参数以分离图像。例如,动物的眼睛、鼻子等将被视为特征,用于使用过滤器或特征检测器对图像进行分类。这里使用16个特征。
  • 核大小(Kernel_size):核大小指的是过滤器矩阵的大小。这里使用2*2的过滤器大小。
  • 填充(Padding):让讨论CNN的问题以及如何通过填充操作解决这些问题。对于灰度(n x n)图像和(f x f)过滤器/核,卷积操作后的图像尺寸是(n – f + 1)x(n – f + 1)。例如,5*7的图像和3*3的过滤器核大小,卷积操作后的输出结果将是3*5的大小。因此,图像在每次卷积操作后都会缩小。
  • 激活函数 – ReLU:由于图像是非线性的,为了引入非线性,卷积操作后应用ReLU激活函数。ReLU代表修正线性激活函数。如果输入为正,则ReLU函数直接输出输入,否则输出零。
  • 输入形状(Input shape):此参数显示图像大小——224*224*3。由于图像是RGB格式的,所以图像的第三维是3。
model.add(MaxPooling2D(pool_size=2))

在初始化CNN后,需要应用池化操作。池化是对图像进行下采样的操作。池化层用于减少特征图的尺寸。因此,池化层减少了需要学习的参数数量,并减少了神经网络中的计算量。后续操作是在池化层创建的摘要特征上执行的,而不是卷积层生成的精确定位特征。这使得模型对图像中特征方向的变化更加鲁棒。

主要有三种池化:

  • 最大池化(Max Pooling)
  • 平均池化(Average Pooling)
  • 全局池化(Global Pooling)
model.add(Conv2D(filters=32, kernel_size=2, padding="same", activation="relu")) model.add(MaxPooling2D(pool_size=2)) model.add(Conv2D(filters=64, kernel_size=2, padding="same", activation="relu")) model.add(MaxPooling2D(pool_size=2))

分别将第二和第三卷积层的过滤器数量修改为32和64。

model.add(Flatten())

展平操作是将数据集转换为一维数组,以便输入到下一层,即全连接层。完成上述三个步骤后,现在有池化后的特征图。现在将输出展平成一列,因为需要将这个一维数据插入到人工神经网络层中。

model.add(Dense(500, activation="relu")) model.add(Dense(2, activation="softmax"))

展平操作的输出作为神经网络的输入。人工神经网络的目标是使卷积神经网络更加先进,能够对图像进行分类。这里使用Keras库中的Dense类来创建全连接层和输出层。

Softmax激活函数用于构建输出层。让讨论Softmax激活函数。

Softmax激活函数用作神经网络的最后一个激活函数,将神经网络的输出转换为预测类别的概率分布。Softmax的输出是每个可能预测类别的概率。所有可能预测类别的概率之和应该为一。

CNN模型的训练和评估

将在三个步骤中讨论CNN模型的训练和评估:

  1. 编译CNN模型
  2. 在训练集上拟合模型
  3. 评估结果
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

使用三个参数:

  • 损失函数:使用分类任务中的categorical_crossentropy损失函数。这种损失是衡量两个离散概率分布之间差异的一个很好的度量。
  • 优化器:使用adam优化器来更新神经网络的权重和学习率。优化器用于通过最小化函数来解决优化问题。
  • 度量参数:使用准确率作为评估卷积神经网络算法性能的度量。
model.fit_generator(training_set, validation_data=test_set, epochs=50, steps_per_epoch=len(training_set), validation_steps=len(test_set))

在训练数据集上拟合CNN模型,进行50次迭代,每次迭代的训练和评估步骤根据测试集和训练集的长度而有所不同。

比较训练集和测试集的准确率和损失函数。

plt.plot(r.history['loss'], label='train loss') plt.plot(r.history['val_loss'], label='val loss') plt.legend() plt.show() plt.savefig('LossVal_loss')

损失是不良预测的惩罚。目标是使验证损失尽可能低。一些过拟合几乎总是好事。最重要的是:验证损失是否尽可能低。

plt.plot(r.history['accuracy'], label='train acc') plt.plot(r.history['val_accuracy'], label='val acc') plt.legend() plt.show() plt.savefig('AccVal_acc')

准确率是评估分类模型的一个指标。非正式地说,准确率是模型预测正确的比例。在这里,可以观察到准确率在验证测试中接近90%,这表明CNN模型在准确率指标上表现良好。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485