Python中的CNN算法代码

2025年1月5日 | 阅读6分钟

卷积神经网络算法 (CNN) 是一种深度学习算法,非常适合图像处理。它们由卷积层、池化层和全连接层组成。

卷积层在卷积神经网络 (CNN) 中起着至关重要的作用。这些层使用滤波器来帮助提取图像特征,如边缘、纹理和形状。滤波器是应用于输入图像的小矩阵,以滑动窗口的方式进行操作。

卷积层输出一个特征图,其中包含滤波器对输入图像的响应。

池化层用于对卷积层创建的特征图进行下采样。这有助于降低网络的计算成本,并使其对输入图像中的微小平移和旋转更加不变。

CNN 架构

CNN 有多种架构,但首先,我们来看看基本架构。

卷积神经网络 (CNN) 由三个层组成:卷积层、全连接 (FC) 层和池化层。这些层以堆叠的方式排列,形成 CNN 架构。除了这三个层之外,dropout 层和激活函数是另外两个重要的参数。这些参数定义如下。

该架构由不同的层组成,从卷积层开始。

卷积层

卷积层,也称为 conv 层,是卷积神经网络 (CNN) 的基本单元。它在捕获网格状数据(如图像)中的局部模式和特征方面起着重要作用。让我们快速了解一下卷积层的作用及其主要组成部分。

神经网络的第一步是使用称为卷积的数学运算从输入图像中提取特征。在此层中,一个特定大小 (MxM) 的滤波器与输入图像进行卷积。滤波器在输入图像上滑动,并计算滤波器与对应于滤波器大小 (MxM) 的输入图像部分之间的点积。此过程有助于从输入图像中提取关键特征。

输入在 CNN 中经过卷积运算,然后将结果传递到下一层。

  1. 滤波器: 卷积层包含多个滤波器,用于检测输入数据中的特定特征或模式,在训练期间对特征提取起着至关重要的作用。
  2. 步幅: 步幅决定了滤波器在输入数据上的移动量。较大的步幅会导致较小的输出特征图,而较小的步幅会导致较大的输出特征图。

池化层

在卷积神经网络 (CNN) 中,典型的结构涉及卷积层后跟池化层。池化层减小了卷积特征图的大小,从而降低了计算成本。这可以通过减少层之间的连接数量来实现,并且它独立地作用于每个特征图。有几种可用的池化操作类型。

  1. 最大池化: 此操作识别特征图每个部分中的最大元素。
  2. 平均池化: 该函数计算图像特定区域中存在的像素的平均值,该区域预先定义。
  3. 求和池化: 此函数计算指定部分所有元素的累积和。

池化层连接卷积层和全连接 (FC) 层。其主要目的是总结卷积层生成的特征。通过池化,CNN 模型可以独立地识别和泛化这些特征。它不仅有助于特征抽象,还减少了网络中的计算需求。

全连接层

FC 层由每个神经元的权重和偏置组成。FC 层中的每个神经元都连接到前一层中的每个神经元。在训练期间,会学习权重和偏置。

在进入全连接层之前,从之前的卷积层和池化层获得的特征图被展平成一维向量,以匹配 FC 层期望的一维输入。

ReLU 等激活函数应用于 FC 层中的展平输入,引入非线性并使网络能够捕获复杂模式。

全连接 (FC) 层在分类过程中至关重要。它们负责提取高级特征,并根据先前层中学到的特征做出决策。这些层的输出通常用于确定不同类别的概率或回归值,具体取决于手头的任务。

Dropout

Dropout 是一种常用于神经网络(包括卷积神经网络 (CNN))的技术,用于对抗过拟合。过拟合发生在模型过度专门化于从训练数据中学习,并且无法很好地泛化到未见过的数据时。

过拟合是深度学习模型中预期出现的问题,其中神经网络学习训练数据中的噪声或特定模式,而这些模式无法泛化到新数据。Dropout 被用于解决此问题。

在 dropout 中,在训练过程中,层中的指定比例的神经元(节点)会被随机“丢弃”或禁用。这意味着这些神经元在特定的训练迭代中不参与前向或后向传播。

Python 中 CNN 算法的实现

以下是说明 Python 中 CNN 算法实现的简短代码片段

示例

输出

Epoch 1/10
1563/1563 [==============================] - 63s 39ms/step - loss: 1.4819 - accuracy: 0.4600 - val_loss: 1.1862 - val_accuracy: 0.5725
Epoch 2/10
1563/1563 [==============================] - 58s 37ms/step - loss: 1.1218 - accuracy: 0.6045 - val_loss: 1.0347 - val_accuracy: 0.6363
Epoch 3/10
1563/1563 [==============================] - 59s 38ms/step - loss: 0.9765 - accuracy: 0.6589 - val_loss: 0.9404 - val_accuracy: 0.6690
Epoch 4/10
1563/1563 [==============================] - 58s 37ms/step - loss: 0.8796 - accuracy: 0.6933 - val_loss: 0.9010 - val_accuracy: 0.6878
Epoch 5/10
1563/1563 [==============================] - 58s 37ms/step - loss: 0.8060 - accuracy: 0.7206 - val_loss: 0.8983 - val_accuracy: 0.6904
Epoch 6/10
1563/1563 [==============================] - 56s 36ms/step - loss: 0.7441 - accuracy: 0.7402 - val_loss: 0.8833 - val_accuracy: 0.6990
Epoch 7/10
1563/1563 [==============================] - 57s 37ms/step - loss: 0.6917 - accuracy: 0.7587 - val_loss: 0.8629 - val_accuracy: 0.7065
Epoch 8/10
1563/1563 [==============================] - 57s 37ms/step - loss: 0.6466 - accuracy: 0.7721 - val_loss: 0.8479 - val_accuracy: 0.7154
Epoch 9/10
1563/1563 [==============================] - 58s 37ms/step - loss: 0.6065 - accuracy: 0.7848 - val_loss: 0.8652 - val_accuracy: 0.7150
Epoch 10/10
1563/1563 [==============================] - 58s 37ms/step - loss: 0.5613 - accuracy: 0.8031 - val_loss: 0.8726 - val_accuracy: 0.7095
313/313 - 3s - loss: 0.8726 - accuracy: 0.7095 - 3s/epoch - 9ms/step

Test accuracy: 0.7095000147819519

结论

Python 中的 CNN 在计算机视觉和机器学习领域产生了重大影响。它们在图像识别、目标检测和分割等各种应用中都非常有效。然而,成功使用 CNN 需要大量数据、计算资源以及超参数调整和模型解释方面的专业知识。随着深度学习的不断发展,CNN 预计将继续成为现代机器学习应用的基础。