在CNN的学习过程中我会提供相应的手算例子帮助理解训练过程。
其他关于卷积神经网络的学习链接如下:
深度学习——卷积神经网络(convolutional neural network)CNN详解(一)——概述. 步骤清晰0基础可看
深度学习——卷积神经网络(convolutional neural network)CNN详解(二)——前向传播与反向传播过程(特征提取+预测+反向传播更新参数). 步骤清晰0基础可看
理解神经网络的简单传播过程,链接如下:
深度学习——神经网络(neural network)详解(一). 带手算步骤,步骤清晰0基础可看
深度学习——神经网络(neural network)详解(二). 带手算步骤,步骤清晰0基础可看
梯度下降法:
机器学习/深度学习——梯度下降法(Gradient descent)详解. 步骤清晰 0基础可看
前向传播包括特征提取与预测过程。
一、特征提取
1.图像输入(Input)
(1)理解图像的基本概念
像素(Pixel)是构成数字图像的基本单元,它是图像中的一个单独的点,可以具有特定的颜色和亮度值。在数字图像中,像素按照网格状排列,每个像素点都对应着图像上的一个特定位置,并且拥有自己的颜色信息。
- 颜色信息:每个像素可以表示一种颜色,这通常通过颜色模型来定义,如RGB(红绿蓝)颜色模型,其中每个像素由红、绿、蓝三种颜色的组合来表示,每种颜色的强度可以在0到255的范围内变化,从而产生超过1600万种不同的颜色。
- 空间位置:在图像的二维网格中,每个像素都有其特定的空间位置,通常用(x, y)坐标来表示,其中x表示水平方向的位置,y表示垂直方向的位置。
- 分辨率:图像的分辨率是指图像中包含的像素数量,通常用像素的宽度和高度来表示,例如1920x1080像素,表示图像水平方向有1920个像素,垂直方向有1080个像素。
如图所示,胸部X光图灰度图对应的像素图。该图片来自医疗数据集https://www.kaggle.com/datasets/tolgadincer/labeled-chest-xray-images
(2)灰度图与RGB图
灰度表示: 灰度图像通常用一个单一的通道表示,其中每个像素点的值表示亮度,范围通常是0(黑色)到255(白色)。
彩色图像:彩色图像通常有多个通道(如RGB),每个通道分别表示红色、绿色和蓝色的强度。取值范围是0(表示该颜色完全没有贡献)到255(表示该颜色强度最大)。
(3)图像尺寸标准化
224x224像素是一个常见的图像尺寸,特别是在使用深度学习模型,如卷积神经网络(CNN)进行图像识别和分类任务时。这个尺寸可以确保模型能够高效处理图像,同时保留足够的细节以进行准确的特征提取和分析。选择224x224作为输入尺寸是因为它可以在减小计算复杂度的同时保留足够的图像信息以供特征提取。
-
缩放:使用不同的插值方法(如最近邻插值、双线性插值、立方插值等)来调整图像的尺寸,使其宽度和高度都变为224像素。
-
填充(可选):如果原始图像的宽高比与目标尺寸不匹配,可能需要在图像的边缘添加一些像素(通常为零填充或复制边缘像素),以保持图像的宽高比。
-
归一化:在缩放之后,图像的像素值通常需要被归一化到一个特定的范围,像素值如0到1或-1到1,比如像素值范围为0~255,可以进行归一化处理至(0,1)范围,即每个像素值除以255,以便于CNN模型的参数更新过程,帮助模型更有效地进行学习。
-
颜色通道处理:对于RGB彩色图像,确保图像具有三个颜色通道,并且每个通道的像素值也经过了适当的归一化。
-
数据增强(可选):在某些情况下,为了提高模型的泛化能力,可能会在缩放和归一化的基础上进一步应用数据增强技术,如旋转、翻转、裁剪等。
2.神经网络概述
简单的神经网络的传播过程请参见我的其他文章:
深度学习——神经网络(neural network)详解(一). 带手算步骤,步骤清晰0基础可看
深度学习——神经网络(neural network)详解(二). 带手算步骤,步骤清晰0基础可看
3.卷积操作
卷积操作是CNN中的核心,它用于提取图像中的局部特征。以下是卷积操作的基本步骤:
(1)滤波器(Filter/Kernel):在卷积操作中,我们使用小的矩阵,这个小的矩阵称为滤波器或卷积核,来扫描输入图像。具体的操作过程如下图所示:
(2)局部特征提取:滤波器覆盖图像的一个小区域,计算该区域与滤波器的点积(就是将图片被卷积核覆盖的像素数值与卷积核的矩阵各个数值对应相乘),生成特征映射(Feature Map)(也就是利用卷积核初步提取到的特征)的一个元素。
(3)滑动窗口:滤波器在图像上按照一定的步长(stride)滑动,对每个局部区域进行卷积操作。
(4)步长(Stride):定义了滤波器滑动的间隔。较大的步长可以减少特征映射的空间尺寸,但可能会丢失一些信息。我们上方这张图像的滑动步长为1。
(6)填充(Padding):为了控制输出特征映射的尺寸,可以在输入图像的边缘添加零值或其他类型的边界扩展。
(7)网络权重:我们所说的卷积神经网络权重更新,其中的网络权重其实就是这些卷积核中的数值,我们需要通过一步步的训练模型使卷积核中的这些数值更新到合适的数值,能帮助我们顺利完成深度学习的预测任务,比如分类任务。
4.池化操作
池化操作通常跟在卷积层之后,用于降低特征映射的空间尺寸,其实就是让矩阵变小。池化操作有以下几种,具体的操作也如下图所示:
池化操作中涉及到的参数为pool_size,若pool_size=[2,2],则该窗口覆盖的2 X 2的特征被池化。
(1)最大池化(Max Pooling):选择局部区域内的最大值作为输出,这有助于保留最重要的特征。
(2)平均池化(Average Pooling):计算局部区域内所有值的平均值作为输出,这有助于平滑特征。
(3)步长(Stride):与卷积操作类似,池化操作也有步长的概念,它决定了池化窗口在特征映射上滑动的距离。
(4)填充(Padding):有时为了保持特征映射的尺寸不变,会在输入的边缘添加额外的零值。
二、全连接层(Fully Connected Layer)
在多个卷积和池化层之后,特征映射通常会通过一个或多个全连接层进行分类或回归任务,这个过程我们搭配下图所展示的过程进行理解:
1.展平(Flattening)
将多维的特征映射转换为一维向量,为全连接层做准备。(将前面过程中经过了卷积,池化等操作后的特征矩阵展平成一维向量)
2.全连接层的输入
展平的一维数据作为输入。这个一维向量包含了从输入图像中提取的特征,这些特征是通过卷积和池化操作得到的。
3.特征数目控制
全连接层的神经元数量(即特征数)是可配置的。设计者可以根据问题的复杂性和所需的模型容量来决定这个数量。
4.全连接层的输出
全连接层的输出数量取决于模型的设计和任务的需求。对于分类任务,最后一个全连接层(也称为输出层或分类层)的输出数量通常等于类别的总数。例如,如果是一个有10个类别的分类问题,最后一个全连接层将有10个神经元,每个神经元对应一个类别的输出。为什么说是最后一个全连接层呢?因为全连接层是可以有多个的。
5.多个全连接层
在某些情况下,可能会有多个全连接层堆叠在一起,其中每个全连接层的输出会成为下一个全连接层的输入。这种情况下,除了最后的输出层,每个全连接层的输出特征数也是我们需要确定的。
6.输出层的特殊性
对于分类任务,最后一个全连接层通常会使用softmax激活函数,它将每个神经元的输出转换为介于0和1之间的概率值,这些概率值的总和为1,表示模型对每个类别的预测信心。
7.softmax激活函数
softmax函数是一种在多分类问题中常用的激活函数,特别是在输出层。它将一个向量或一组实数输入转换为概率分布,使得每个元素的值都在0到1之间,并且所有元素的和为1。比如若是猫狗两类,softmax函数的输出可能为[0.7,0.3]。0.7代表着本模型的预测偏向。
三、损失函数(Loss Function)
损失函数衡量模型预测与实际标签之间的差异
1.分类任务
交叉熵损失(Cross-Entropy Loss)是常用的损失函数。在学习交叉熵之前我们来了解一下One-Hot编码。
(1)One-Hot编码(One-Hot Encoding)
One-Hot编码是一种常见的数据预处理方法,特别是在分类问题中。它将类别标签转换为一种数值形式,使得模型能够更好地处理它们。
One-Hot编码是一种表示类别数据的方式,其中每个类别由一个唯一的二进制向量表示。这个向量的长度等于类别的总数,且除了表示该类别的一个位置为1外,其余所有位置都是0。
编码过程
-
确定类别集合:首先,确定所有可能的类别集合。例如,在猫狗分类问题中,类别集合就是{猫,狗}。
-
创建向量:对于类别集合中的每个类别,创建一个长度等于类别总数的向量{x1,x2}。
-
设置位置:在向量中,找到对应类别的位置,并将其设置为1。其余位置设置为0。
示例
假设我们有三个类别:A、B和C。使用One-Hot编码,这三个类别将被表示为以下向量:
- 类别A:[1, 0, 0]
- 类别B:[0, 1, 0]
- 类别C:[0, 0, 1]
使用场景
- 多分类问题:One-Hot编码在多分类问题中非常有用,因为它允许模型将每个类别视为独立的二分类问题。
- 交叉熵损失:One-Hot编码与softmax激活函数和交叉熵损失函数配合使用,形成多分类问题的标准解决方案。
(2)交叉熵损失(Cross-Entropy Loss)
它衡量的是模型预测的概率分布与真实标签的概率分布之间的差异。
手算实例
假设我们有一个三分类问题,其类别为猫、狗和鸟。我们的模型输出了一个样本属于这三个类别的概率分布 [P_cat, P_dog, P_bird]
,而真实标签是使用One-Hot编码表示的。猫为[1, 0, 0],狗为[0, 1, 0],鸟为[0, 0, 1]。
- 模型预测:模型预测样本为猫、狗和鸟的概率分别为
[0.2, 0.5, 0.3]
。 - 真实标签:假设真实标签是狗,One-Hot编码为
[0, 1, 0]
。
使用交叉熵损失公式:
这个损失值表示模型预测与实际标签之间的差异。在实际训练中,我们会对整个数据集的样本计算平均损失,以此来优化模型参数。
2.回归任务
均方误差(Mean Squared Error, MSE)是常用的损失函数(在我的文章神经网络中的房价预测背景就是回归任务)。
四、反向传播和优化(Backpropagation and Optimization)
这部分的内容可以去我的神经网络概述中理解。搭配图示理解各个过程。
-
反向传播:计算损失函数关于每个参数的梯度(这个过程在我之前的神经网络概述的文章中已经展示了手算)。
-
优化算法:使用梯度下降(Gradient Descent)或其他优化算法(如Adam、RMSprop)更新网络权重。
-
学习率:控制权重更新的步长。
-
迭代训练:重复前向传播、计算损失、反向传播和权重更新的过程,直到模型在验证集上的性能不再提升。
五、评估和测试(Evaluation and Testing)
-
评估:在验证集上评估模型性能,调整超参数,比如学习率的大小。
-
测试:在测试集上测试模型的最终性能,确保模型具有良好的泛化能力。
-
混淆矩阵:用于分类任务,显示真正例、假正例、真反例和假反例的数量。
-
性能指标:准确率、精确率、召回率和F1分数等指标用于评估分类模型的性能。