深度学习是机器学习中非常重要的一个子集,因其在各个领域的高性能而备受重视。卷积神经网络(CNN)是深度学习中用于图像处理的强大类型,常用于计算机视觉中的图像和视频识别,以及推荐系统和自然语言处理(NLP)。CNN由多层系统组成,包括输入层、输出层和包含多个卷积层、池化层和全连接层的隐藏层。本文将在下一部分讨论所有这些层,同时解释CNN的构建过程。
将使用疟疾细胞图像数据集来讨论CNN的构建。该数据集包含27,558张显微镜下的血液样本图像,分为两个文件夹——感染和未感染。将通过以下六个步骤来讨论CNN的构建和工作原理:
这六个步骤将解释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需要多个层,这些层必须按顺序排列。然后添加第一个卷积层,需要指定五个参数。让讨论每个参数及其目的:
model.add(MaxPooling2D(pool_size=2))
在初始化CNN后,需要应用池化操作。池化是对图像进行下采样的操作。池化层用于减少特征图的尺寸。因此,池化层减少了需要学习的参数数量,并减少了神经网络中的计算量。后续操作是在池化层创建的摘要特征上执行的,而不是卷积层生成的精确定位特征。这使得模型对图像中特征方向的变化更加鲁棒。
主要有三种池化:
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模型的训练和评估:
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
使用三个参数:
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模型在准确率指标上表现良好。