大家好,我是小寒。
今天给大家分享一个超强的算法模型,卷积神经网络
卷积神经网络(Convolutional Neural Network, CNN)是一种专门用于处理数据具有网格结构的深度学习模型,特别是在图像和视频识别领域取得了显著成功。
CNN 通过引入卷积层、池化层等特殊层,能够有效提取数据的局部特征,同时减少参数量,提升训练效率和模型的泛化能力。
图片
CNN 的基本结构
CNN 主要由以下几种层组成。
输入层
顾名思义,它是我们的输入图像,可以是灰度或 RGB。每个图像都由 0 到 255 范围内的像素组成。我们需要对它们进行规范化,即将范围转换为 0 到 1 之间,然后再将其传递给模型。
下面是大小为 4*4 的输入图像的示例,该图像具有 3 个通道,即 RGB 和像素值。
图片
卷积层
卷积层是 CNN 的核心,通过卷积操作提取输入数据的局部特征。
卷积操作通过一个或多个可学习的滤波器(也称为卷积核)在输入数据上滑动,计算内积来生成特征图。
图片
让我们借助一个例子来理解这一点。为简单起见,我们将采用具有标准化像素的 2D 输入图像。
图片
在上图中,我们有一个大小为 6 * 6 的输入图像,并在其上应用了 3*3 的过滤器来检测一些特征。在这个例子中,我们只应用了一个过滤器,但实际上,会应用许多这样的过滤器来从图像中提取信息。
对图像应用过滤器的结果是我们得到一个 4*4 的 Feature Map,它包含一些关于输入图像的信息。实际应用中会产生许多这样的 Feature Map。
让我们来了解一下上图中特征图(Feature Map)背后的一些数学知识。
图片
如上图所示,第一步是将滤器应用于图像中绿色高亮部分,然后将图像的像素值与过滤器的值相乘(如图中使用线条所示),然后相加得到最终值。
下一步,过滤器将移动一列,如下图所示。这种移动到下一列或行的过程称为步幅,在本例中,我们采用步幅 1,这意味着我们将移动一列。
图片
类似地,过滤器遍历整个图像,我们得到最终的特征图。一旦我们得到特征图,就会对其应用激活函数来引入非线性。
池化层
池化层应用于卷积层之后,用于减少特征图的维度,这有助于保留输入图像的重要信息或特征并减少计算时间。
使用池化,可以创建一个较低分辨率的输入版本,但仍然包含输入图像的较大或重要元素。
最常见的池化类型是最大池化(Max-Pooling)和平均池化(Avg-Pooling)。
图片
图片
全连接层
到目前为止,我们已经完成了特征提取步骤,现在进入分类部分。
全连接层(如 ANN 中的)用于将输入图像分类为标签。
该层将从前面的步骤(即卷积层和池化层)中提取的信息连接到输出层,并最终将输入分类为所需的标签。
图片
案例代码
下面是一个使用卷积神经网络(CNN)对手写数字进行识别的示例代码。
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
import matplotlib.pyplot as plt
# 加载并预处理 MNIST 数据集
(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()
# 重新调整图像的形状为 (28, 28, 1) 并归一化像素值到 [0, 1] 之间
train_images = train_images.reshape((60000, 28, 28, 1)).astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1)).astype('float32') / 255
# 构建卷积神经网络模型
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activatinotallow='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activatinotallow='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activatinotallow='relu'))
# 添加全连接层
model.add(layers.Flatten())
model.add(layers.Dense(64, activatinotallow='relu'))
model.add(layers.Dense(10, activatinotallow='softmax'))
# 编译模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 训练模型
history = model.fit(train_images, train_labels, epochs=5,
validation_data=(test_images, test_labels))
# 评估模型
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print(f'\nTest accuracy: {test_acc}')