图片
顾名思义,它是我们的输入图像,可以是灰度或 RGB。每个图像都由 0 到 255 范围内的像素组成。我们需要对它们进行规范化,即将范围转换为 0 到 1 之间,然后再将其传递给模型。

大家好,我是小寒。

今天给大家分享一个超强的算法模型,卷积神经网络

卷积神经网络(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}')
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
文章来自:51CTO

Loading

作者 yinhua

发表回复