Convolutional Neural Networks卷积神经网络

本文深入讲解了Back Propagation反向传播算法与Convolutional Neural Networks卷积神经网络的基本原理及LeCun提出的LeNet-5架构,并介绍了CNNs的训练过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:前导 Back Propagation反向传播算法

网络结构

0001

经典的BP网络是三层结构:输入层X、输出层O和隐层Y。

输入向量:X = (x1,x2,…,xn)T

隐层输出:Y = (y1,y2,…,ym)T    权值
V = (v1,v2,…,vm)T

输出向量:O = (o1,o2,…,ol)T    权值W = (w1,w2,…,wl)T

期望输出:D = (d1,d2,…,dn)T

学习算法

输入层到隐层的计算过程:

0002

 

隐层到输出层的计算过程:

0003

 

网络输出层误差函数为:

0004

将误差函数展开到隐层,则为:

0005

训练过程就是要让最后的E减到尽可能小,以达到最优值,所以可以将E对每一个输入参数求偏导,以达到最优。所以:

0006

η是一个比例系数,经过一系列计算之后,上式可化成:

00070008

通过极小化误差反向传播调整权值矩阵,不断循环直到最佳。

 

二:Convolutional Neural Networks卷积神经网络

BP神经网络每一层节点是一个线性的一维排列状态,层与层的网络节点之间是全连接的。而如果BP网络中层与层之间的节点连接不再是全连接,而是局部连接的。这样,就是一种最简单的一维卷积网络。如果我们把上述这个思路扩展到二维,这就是我们在大多数参考资料上看到的卷积神经网络,具体参看图2:

0010  0009

a.全连接网络                      b.局部连接网络

图2

图2.a:全连接网络。如果L1层有1000×1000像素的图像,L2层有1000,000个隐层神经元,每个隐层神经元都连接L1层图像的每一个像素点,就有1000x1000x1000,000=10^12个连接,也就是10^12个权值参数。

图2.b:局部连接网络。L2层每一个节点与L1层节点同位置附近10×10的窗口相连接,则1百万个隐层神经元就只有100w乘以100,即10^8个参数。其权值连接个数比原来减少了四个数量级。

卷积神经网络另外一个特性是权值共享。例如,就图2.b来说,权值共享,不是说,所有的红色线标注的连接权值相同。而是说,每一个颜色的线都有一个红色线的权值与之相等,所以第二层的每个节点,其从上一层进行卷积的参数都是相同的。

图2中隐层的每一个神经元都连接10×10个图像区域,也就是说每一个神经元存在10×10=100个连接权值参数。如果我们每个神经元这100个参数是相同的?也就是说每个神经元用的是同一个卷积核去卷积图像。这样L1层我们就只有100个参数。但是这样,只提取了图像一种特征?如果需要提取不同的特征,就加多几种卷积核。所以假设我们加到100种卷积核,也就是1万个参数。

每种卷积核的参数不一样,表示它提出输入图像的不同特征(不同的边缘)。这样每种卷积核去卷积图像就得到对图像的不同特征的放映,我们称之为Feature Map,也就是特征图。

需要注意的一点是,上面的讨论都没有考虑每个神经元的偏置,加上偏置参数,则每个神经元需要的权值参数个数需要加1。

上面描述的只是单层网络结构,Yann LeCun等在1998年发布的论文“Gradient-Based Learning Applied to Document Recognition”提出了基于卷积神经网络的一个文字识别系统 LeNet-5,随后被用于银行手写数字的识别。

三:LeCun的LeNet-5

0011

不包含输入,LeNet-5共有7层,每层都包含连接权值(可训练参数)。输入图像为32*32大小。我们先要明确一点:每个层有多个特征图,每个特征图通过一种卷积滤波器提取输入的一种特征,然后每个特征图有多个神经元。

C1、C3、C5是卷积层,S2、S4、S6是下采样层。利用图像局部相关性的原理,对图像进行下抽样,可以减少数据处理量同时保留有用信息。

C1层是卷积层,由6个特征图构成。特征图中每个神经元与输入层中5*5的邻域相连。C1的大小为28*28,这样能防止输入的连接掉到边界之外。C1有156个可训练参数,共122,304个连接。

可训练参数是卷积核可训练参数个数加上一个偏置参数,再乘以特征图个数。(公式)

连接数即可训练参数乘以特征图大小。(公式)

对于C1:

(5*5+1)*6=156个参数

156*(28*28)=122,304个连接

S2层是下采样层,有6个14*14的特征图。特征图中的每个单元与C1中相对应特征图的2*2邻域相连接。S2层每个单元的4个输入相加,乘以一个可训练参数,再加上一个可训练偏置。结果通过sigmoid函数计算。可训练系数和偏置控制着sigmoid函数的非线性程度。如果系数比较小,那么运算近似于线性运算,亚采样相当于模糊图像。如果系数比较大,根据偏置的大小亚采样可以被看成是有噪声的“或”运算或者有噪声的“与”运算。每个单元的2*2感受野并不重叠,

对于S2:

每个特征图的大小是C1中特征图大小的1/4(行和列各1/2)。S2层有(1+1)*6=12个可训练参数和14*14*(4+1)*6=5880个连接。

C3层也是一个卷积层,它同样通过5×5的卷积核去卷积层S2,然后得到的特征map就只有10×10个神经元,但是它有16种不同的卷积核,所以就存在16个特征图了。C3中的每个特征map是连接到S2中的所有6个或者几个特征map的,表示本层的特征map是上一层提取到的特征map的不同组合(这个做法也并不是唯一的)。

为什么不把S2中的每个特征图连接到每个C3的特征图呢?原因有2点。第一,不完全的连接机制将连接的数量保持在合理的范围内。第二,其破坏了网络的对称性。由于不同的特征图有不同的输入,所以迫使他们抽取不同的特征。

LeCun采用的方式是:C3的前6个特征图以S2中3个相邻的特征图子集为输入。接下来6个特征图以S2中4个相邻特征图子集为输入。然后的3个以不相邻的4个特征图子集为输入。最后一个将S2中所有特征图为输入。如图:

0012

 

这样C3层有(25*3+1)*6+(25*4+1)*6+(25*4+1)*3+(25*6+1)*1=1516个可训练参数和((25*3+1)*6+(25*4+1)*6+(25*4+1)*3+(25*6+1)*1)*(10*10)=151600个连接。

S4层是下采样层,由16个5*5大小的特征图构成。特征图中的每个单元与C3中相应特征图的2*2邻域相连接,跟C1和S2之间的连接一样。S4层有16*(1+1)=32个可训练参数(每个特征图1个因子和一个偏置)和5*5*(4+1)*16=2000个连接。(如果到这看不懂公式,可以不按照顺序阅读,先看所有的卷积层,再看所有的下采样层)

C5层是一个卷积层,有120个特征图。每个单元与S4层的全部16个单元的5*5邻域相连。由于S4层特征图的大小也为5*5(同滤波器一样),故C5特征图的大小为1*1:这构成了S4和C5之间的全连接。

之所以仍将C5标示为卷积层而非全相联层,是因为如果LeNet-5的输入变大,而其他的保持不变,那么此时特征图的维数就会比1*1大。C5层有(5*5*16+1)*120=48120个可训练参数,由于C5特征图大小为1:1,所以有48120*1*1=48120个链接(Yann原文只是说有48120个trainable connection,与上文所用术语不一样,暂且认为就是说48120个trainable parameters and 48120个connection吧,这个与我们计算出来也一致)。

F6层有84个单元(之所以选这个数字的原因来自于输出层的设计),与C5层全相连。如同经典神经网络,F6层计算输入向量和权重向量之间的点积,再加上一个偏置。然后将其传递给sigmoid函数产生单元i的一个状态。有(120+1)*84=10164个可训练参数,也是10164个连接。

 最后,输出层由欧式径向基函数(Euclidean Radial Basis Function)单元组成,每类一个单元,每个有84个输入。换句话说,每个输出RBF单元计算输入向量和参数向量之间的欧式距离。输入离参数向量越远,RBF输出的越大。一个RBF输出可以被理解为衡量输入模式和与RBF相关联类的一个模型的匹配程度的惩罚项。用概率术语来说,RBF输出可以被理解为F6层配置空间的高斯分布的负log-likelihood。给定一个输入模式,损失函数应能使得F6的配置与RBF参数向量(即模式的期望分类)足够接近。这些单元的参数是人工选取并保持固定的(至少初始时候如此)。这些参数向量的成分被设为-1或1。虽然这些参数可以以-1和1等概率的方式任选,或者构成一个纠错码,但是被设计成一个相应字符类的7*12大小(即84)的格式化图片。这种表示对识别单独的数字不是很有用,但是对识别可打印ASCII集中的字符串很有用。

使用这种分布编码而非更常用的“1 of N”编码用于产生输出的另一个原因是,当类别比较大的时候,非分布编码的效果比较差。原因是大多数时间非分布编码的输出必须为0。这使得用sigmoid单元很难实现。另一个原因是分类器不仅用于识别字母,也用于拒绝非字母。使用分布编码的RBF更适合该目标。因为与sigmoid不同,他们在输入空间的较好限制的区域内兴奋,而非典型模式更容易落到外边。

RBF参数向量起着F6层目标向量的角色。需要指出这些向量的成分是+1或-1,这正好在F6 sigmoid的范围内,因此可以防止sigmoid函数饱和。实际上,+1和-1是sigmoid函数的最大弯曲的点处。这使得F6单元运行在最大非线性范围内。必须避免sigmoid函数的饱和,因为这将会导致损失函数较慢的收敛和病态问题。

 

四:CNNs的训练过程

CNNs训练算法与传统的BP算法差不多。主要包括4步,这4步被分为两个阶段:

第一阶段,向前传播阶段:

a)从样本集中取一个样本(X,Yp),将X输入网络;

b)计算相应的实际输出Op。

在此阶段,信息从输入层经过逐级的变换,传送到输出层。这个过程也是网络在完成训练后正常运行时执行的过程。在此过程中,网络执行的是计算(实际上就是输入与每层的权值矩阵相点乘,得到最后的输出结果):

Op=Fn(…(F2(F1(XpW(1))W(2))…)W(n))

第二阶段,向后传播阶段

a)算实际输出Op与相应的理想输出Yp的差;

b)按极小化误差的方法反向传播调整权矩阵。

 

五:总结

CNNs这种算法目前在图像识别和处理应用的相当广泛。在ImageNet 2014大规模视觉识别比赛中,CNNs得到了广泛的应用,其中错误率只有6.656%的最优算法也是源自CNNs。

Yann LeCun在90年代做出LeNet,到今天成为视觉识别的最主要技术,一方面与他的努力分不开,另一反面,他愿意在神经网络低谷时期坚持研究这个方向,本身也是一直值得学习的精神。

原文链接
### 卷积神经网络(CNN)的原理 卷积神经网络Convolutional Neural Networks, CNN)是一种专门用于处理数据具有网格拓扑结构的任务的深度学习模型[^1]。它通过模拟生物视觉系统的分层特性来实现对输入信息的有效处理,特别擅长于图像和视频中的模式识别。 #### 基本组成单元 CNN 的核心组成部分包括以下几个主要模块: - **卷积层(Convolution Layer)**: 这一层负责执行局部感知野内的加权求和运算,从而提取输入数据的空间层次特征[^2]。 - **激活函数(Activation Function)**: 通常采用 ReLU 函数作为非线性变换工具,增强模型表达能力。 - **池化层(Pooling Layer)**: 主要作用是对特征图进行降采样操作,减少参数数量并控制过拟合现象的发生[^3]。 - **全连接层(Fully Connected Layer)**: 将前面各层所得到的高维抽象表示映射到具体类别标签上完成最终预测任务。 这些组件共同构成了一个完整的 CNN 架构,在训练过程中不断调整权重使得整个系统可以自动地从原始像素级描述逐步建立起高层次语义概念之间的联系。 ### 结构设计特点 相比于传统的全连接型人工神经网络(Fully Connected Feed Forward Network),CNN 具有如下显著优势: - 参数共享机制(Parameter Sharing Mechanism): 同一滤波器(Filter/Kernel)在整个感受域范围内重复利用相同的一组可学习系数(weights),这不仅极大地降低了总的自由度数目同时也赋予了该方法天然具备空间位移鲁棒性的特质即所谓的“平移不变性(Translation Invariance)”. - 局部稀疏交互(Local Sparse Interactions): 只考虑相邻区域间的相互关系而非全局范围内的任意两点关联情况,进一步简化了计算复杂度. 上述两项关键技术的应用使 CNN 成为了当前解决计算机视觉领域诸多难题最为有效的解决方案之一[^4]. ### 实际应用场景 由于其卓越性能表现,CNN 已经被广泛应用于多个实际场景当中,比如但不限于以下方面: - 图像分类(Image Classification) - 物体检测(Object Detection) - 面部识别(Face Recognition) 以下是基于 Python 编程语言的一个简单示例程序片段展示如何构建基础版本的 LeNet-5 模型来进行手写数字 MNIST 数据集上的实验验证工作: ```python import tensorflow as tf from tensorflow.keras import layers, models model = models.Sequential() # 添加第一个卷积层+最大池化层组合 model.add(layers.Conv2D(filters=6,kernel_size=(5,5),activation='relu',input_shape=(32,32,1))) model.add(layers.AvgPool2D(pool_size=(2,2))) # 继续堆叠更多类似的卷积+池化层... model.add(layers.Conv2D(filters=16,kernel_size=(5,5),activation='relu')) model.add(layers.AvgPool2D(pool_size=(2,2))) # Flatten 平展成向量形式送入后续 FC 层之前 model.add(layers.Flatten()) # 加入若干个 Dense(full-connected)层构成最后判别部分 model.add(layers.Dense(units=120, activation='relu')) model.add(layers.Dense(units=84, activation='relu')) # 输出层设置 Softmax 得到最后概率分布结果 model.add(layers.Dense(units=10, activation='softmax')) # 打印查看整体架构详情 print(model.summary()) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值