计算机视觉——深入理解卷积神经网络与使用卷积神经网络创建图像分类算法
引言
卷积神经网络(Convolutional Neural Networks,简称 CNNs)是一种深度学习架构,专门用于处理具有网格结构的数据,如图像、视频等。它们在计算机视觉领域取得了巨大成功,成为图像分类、目标检测、图像分割等任务的核心技术。
CNNs 的核心思想是利用卷积操作(convolution)来提取数据中的局部特征,并通过层次化的结构逐步学习更复杂的模式。
一、卷积神经网络
卷积神经网络,主要用于处理具有网格结构的数据,一般有以下几个关键组成部分:
1.1 输入
输入层是网络的初始数据入口点。在基于图像的任务中,输入层代表图像的像素值。在以下示例中,假设我们正在处理大小为 28x28 像素的灰度图像。
from tensorflow.keras.layers import Input
input_layer = Input(shape=(28, 28, 1))
1.2 卷积层
卷积层是 CNNs 的核心构建块。这些层通过对输入数据应用卷积操作来提取特征,例如边缘、纹理和模式。
from tensorflow.keras.layers import Conv2D
conv_layer = Conv2D(filters=32, kernel_size=(3, 3),
activation='relu')(input_layer)
在卷积神经网络(CNNs)中,“核”和“滤波器”这两个术语经常可以互换使用,它们指的是同一个概念。让我们来剖析一下这两个术语的含义:
2.1 核:核是卷积操作中使用的一个小矩阵。它是一组可学习的权重,应用于输入数据以生成输出特征图。核是使 CNNs 能够自动学习输入数据中空间层次特征的关键元素。在图像处理中,核可能是一个 3x3 或 5x5 的小矩阵。
2.2 滤波器:另一方面,滤波器是一组多个核。在大多数情况下,卷积层使用多个滤波器来捕获输入数据中的不同特征。每个滤波器都与输入进行卷积以生成特征图,网络通过在训练过程中调整这些滤波器的权重(参数)来学习提取各种模式。
在这个示例中,我们定义了一个具有 32 个滤波器的卷积层,每个滤波器的大小为 3x3。在训练过程中,神经网络会调整这 32 个滤波器的权重(参数),以从输入数据中学习不同的特征。让我们通过一个图像示例来看一下:
卷积机制。核形状(3x3)。图片来源:OpenGenus
总之,核是滑动或卷积穿过输入数据的小矩阵,而滤波器是一组这样的核,用于从输入中提取各种特征,从而使神经网络能够学习层次化的表示。
1.3 激活层(ReLU)
在卷积操作之后,通常会应用激活函数,通常是修正线性单元(ReLU),以逐元素地引入非线性。ReLU 有助于网络学习复杂的关系,并使模型更具表现力。完全取决于你的用例,你将使用哪种激活函数。在大多数情况下,研究人员使用 ReLU,也有一些其他激活函数可以使用,例如 Leaky ReLU、ELU。
ReLU 激活。来源:ResearchGate
在 Python 中实现修正线性单元(ReLU)函数非常简单。ReLU 是一种常用于神经网络的激活函数,用于引入非线性。以下是一个简单的 Python 实现:
def relu(x):
return max(0, x)
1.4 池化层
池化层(例如 最大池化 或 平均池化)会降低由卷积层生成的特征图的空间维度。例如,最大池化会从一组值中选择最大值,专注于最显著的特征。
最大池化 — 平均池化。来源:ResearchGate
池化层可以降低空间维度。最大池化通常被使用:
from tensorflow.keras.layers import MaxPooling2D
pooling_layer = MaxPooling2D(pool_size=(2, 2))(conv_layer)
1.5 全连接(密集)层
全连接层将一层中的每个神经元连接到下一层中的每个神经元。这些层通常位于网络的末端,将学到的特征转换为预测或类别概率。全连接层通常用于分类任务:
from tensorflow.keras.layers import Dense, Flatten
flatten_layer = Flatten()(pooling_layer)
dense_layer = Dense(units=128, activation='relu')(flatten_layer)
1.6 Dropout 层
Dropout 层用于正则化,以防止过拟合。在训练过程中,随机神经元会被“丢弃”,即忽略它们,迫使网络学习更健壮和泛化的特征。它通过在训练过程中随机忽略输入单元的一部分来帮助防止过拟合:
Dropout 机制。来源:nagadakos
from tensorflow.keras.layers import Dropout
dropout_layer = Dropout(rate=0.5)(dense_layer)
1.7 批量归一化层
批量归一化(BN)是一种用于神经网络的技术,用于稳定和加速训练过程。它通过在训练过程中调整和缩放输入来归一化输入。批量归一化的数学细节涉及归一化、缩放和移动操作。让我们深入探讨批量归一化的数学原理。
假设我们有一个大小为 m 的小批量,包含 n 个特征。批量归一化的输入可以总结如下:
7.1. 计算均值:计算每个特征的小批量的均值 μ :
数组 X 的均值
这里,_xi_ 表示小批量中第 i 个特征的值。
7.2. 计算方差:计算每个特征的小批量的方差 σ² :
方差计算
7.3. 归一化:通过减去均值并除以标准差 (σ) 来归一化输入:
这里,ϵ 是一个很小的常数,用于避免除以零。
7.4. 缩放和移动:引入可学习的参数 (γ 和 β) 来缩放和移动归一化的值:
这里,γ 是缩放参数,β 是移动参数。
批量归一化操作通常插入在神经网络层的激活函数之前。它已被证明具有正则化效果,并可以减轻内部协变量偏移等问题,使训练更稳定、更快。以下是一个简单的批量归一化代码,用于 CNN 或任何深度神经网络:
from tensorflow.keras.layers import BatchNormalization
batch_norm_layer = BatchNormalization()(dropout_layer)
总之,批量归一化归一化输入,缩放和移动归一化的值,并引入可学习的参数,以便网络在训练过程中进行调整。批量归一化的使用已成为深度学习架构的标准实践。
1.8 展平层
展平层将多维特征图转换为一维向量,为输入到全连接层做准备。