百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

卷积神经网络推导-神经网络卷积运算公式

moboyou 2025-04-23 14:11 18 浏览

本文论文来自:

卷积神经网络注释,Jake Bouvrie。

这个主要是一些关于CNN推导和实现的笔记,看这个笔记之前最好先有一些CNN的基础知识,这里也给大家一个可以参考的资源:

[1] 深度学习学习笔记系列(第七部分)

[2]LeNet-5,卷积神经网络

[3] 卷积神经网络

[4]手写数字识别神经网络

[5] 深度学习:三十八(Stacked CNN简单介绍)

[6] 基于梯度的学习应用于文档识别。

[7] 使用深度卷积神经网络进行 Imagenet 分类。

[8]UFLDL中的“卷积特征提取”和“池化”。

[9] 反向传播BP算法

卷积神经网络笔记

1. 简介

本文档讨论了 CNN 的推导和实现。CNN 架构的连接数比权重多得多,这意味着某种形式的正则化。这个特定的网络假设我们想要以数据驱动的方式学习一些过滤器,以此从输入中提取特征。

本文首先描述了训练全连接网络的经典BP算法,然后推导了2D CNN网络的卷积层和下采样层的BP权重更新方法。在推导过程中,我们强调实现的效率,因此会给出一些Matlab代码。最后,我们转而讨论如何自动学习组合前一层的特征图。特别地,我们还学习了特征图的稀疏组合。

2.全连接反向传播算法

在典型的 CNN 中,前几层是交替卷积和下采样,然后最后几层(靠近输出层)都是全连接的一维网络。至此,我们已经将所有二维的 2D 特征图转换为全连接的一维网络的输入。这样,当你准备将最终的 2D 特征图输入到 1D 网络时,一个非常方便的方法就是将所有输出的特征图连接成一个长的输入向量。然后我们回到 BP 算法的讨论。(更详细的基本推导请参考 UFLDL 中的“反向传播算法”)。

2.1 前馈传递

在下面的推导中,我们使用平方误差成本函数。我们正在讨论一个总共有 c 个类和 N 个训练样本的多类问题。

这里

表示第n个样本对应标签的第k维。

表示第n个样本对应的网络输出的第k个输出。对于多分类问题,输出一般以“one-of-c”的形式组织,也就是只有输入对应的类的输出节点是正数,其他类的位或节点都是0或者负数,这取决于你的输出层的激活函数。sigmoid就是0,tanh就是-1。

因为整个训练集上的误差就是每个训练样本的误差之和,所以这里我们先考虑一个样本的BP,第n个样本的误差表示为:

在传统的全连接神经网络中,我们需要按照BP规则计算代价函数E关于网络每个权值的偏导数,我们用l来表示当前层,因此当前层的输出可以表示为:

输出激活函数 f(.) 有很多种,通常是 sigmoid 函数或者双曲正切函数。sigmoid 会将输出压缩到 [0, 1] 之间,所以最终的输出平均值一般会趋向于 0。所以如果我们将训练数据归一化为均值为零、方差为 1,就可以增加梯度下降过程中的收敛性。对于归一化的数据集,双曲正切函数也是一个不错的选择。

2.2 反向传播过程

传播回去的误差可以看成是每个神经元的基的敏感度(敏感度的意思是我们的基b变化多少,误差就会变化多少,也就是误差对于基的变化率,也就是导数),定义如下:(第二个等号是根据链式求导法则得到的)

因为u/b=1,E/b=E/u=δ,这意味着偏差基础E/b=δ的灵敏度等于误差E对某个节点E/u的所有输入u的导数。这个导数就是让高层误差反向传播到底层的魔法。反向传播可以用下面的关系来表达:(下面的公式表达了第l层的灵敏度,即)

公式1)

这里的“o”表示每个元素都相乘。输出层神经元的敏感度不同:

最后,应用delta(或δ)规则更新每个神经元的权重。具体来说,对于给定的神经元,获取其输入,然后使用此神经元的delta(或δ)对其进行缩放。以向量形式表示,对于第l层,该层每个权重(组合成矩阵)的误差的导数是该层的输入(等于前一层的输出)与该层的灵敏度(该层中每个神经元的δ组合成向量)的叉积。然后获得的偏导数乘以负学习率就是该层神经元权重的更新:

公式(2)

偏差基础的更新表达式类似。事实上,每个权重 (W)ij 都有一个特定的学习率 ηIj。

3.卷积神经网络

3.1 卷积层

现在我们重点讨论网络中卷积层的BP更新。在卷积层中,上一层的特征图与一个可学习的卷积核进行卷积,然后经过激活函数得到输出的特征图。每个输出图可能是多个输入图组合的值:

这里 Mj 表示选定的输入图的集合,那么选择哪些输入图呢?有些人会选择一对或者三个。但下面我们将讨论如何自动选择需要组合的特征图。每个输出图都会给出一个额外的偏置 b,但对于特定的输出图,每个输入图的卷积核是不同的。换句话说,如果输出特征图 j 和输出特征图 k 都是由输入图 i 通过卷积求和得到的,那么对应的卷积核是不同的。

3.1.1 计算梯度

我们假设每一个卷积层l都连接着一个下采样层l+1。对于BP来说,根据上述,为了得到l层中每一个神经元对应权重的权重更新,我们需要先计算出l层中每一个神经节点的敏感度δ(即权重更新公式(2))。为了计算这个敏感度,我们需要先把下一层节点(与当前l层感兴趣的节点相连的l+1层节点)的敏感度相加(得到δl+1),然后乘以这些连接对应的权重(连接第l层感兴趣的节点和第l+1层节点的权重)W。然后乘以当前l层神经元节点对输入u的激活函数f的导值(即敏感度反向传播公式(1)的δl的解),这样就可以得到当前l层中每一个神经节点对应的敏感度δl。

但由于下采样的原因,采样层中一个像素(神经元节点)的敏感度δ对应着卷积层(前一层)输出图的一个像素(采样窗口大小),因此第l层中某个图的每个节点只与第l+1层中对应图的一个节点相连。

为了能够有效的计算出第l层的敏感度,我们需要对下采样后的层对应的敏感度图进行一次上采样(特征图中的每一个像素对应一个敏感度,所以也构成了一个图),使得这个敏感度图的大小与卷积层的图大小一致,然后将第l层的图的激活值的偏导数与从第l+1层开始上采样得到的敏感度图逐元素相乘(即公式(1))。

下采样层图的权重均取相同的值β,为一个常数,因此我们只需要将上一步得到的结果乘以β,便可完成第l层敏感度δ的计算。

我们可以对卷积层中的每个特征图j重复同样的计算过程。但显然我们需要匹配相应的子采样层的图(参考公式(1)):

up(.) 表示上采样操作。如果下采样因子为 n,它只是将每个像素水平和垂直复制 n 次。这样就恢复了原始大小。实际上,这个函数可以使用 Kronecker 积来实现:

好了,现在我们可以计算给定图的敏感度图了。然后我们可以通过简单地将第 l 层敏感度图中的所有节点相加来快速计算偏差基础的梯度:

公式(3)

最后,卷积核权重的梯度可以用BP算法计算(公式(2))。另外,很多连接的权重是共享的,所以对于给定的权重,我们需要计算该点所有与该权重相关的连接(权重共享的连接)的梯度,然后对这些梯度求和,就像上面对偏置项的梯度计算一样:

这里,

是的

在卷积中

输出卷积图的(u,v)位置的值是前一层的(u,v)位置上的patch与卷积核k_ij逐元素相乘的结果。

乍一看,似乎我们需要费力地记住输出图(以及对应的敏感度图)的每个像素对应输入图的哪个块。但实际上,在 Matlab 中,这可以用一个代码来实现。对于上面的公式,我们可以使用 Matlab 的卷积函数来实现它:

我们首先旋转增量敏感度图,这样我们就可以进行互相关计算,而不是卷积(在卷积的数学定义中,特征矩阵(卷积核)在传递给 conv2 之前需要翻转。也就是说,特征矩阵的行和列是反转的)。然后我们将输出反旋转回来,这样当我们在前向传播中进行卷积时,卷积核就在我们想要的方向。

3.2. 子采样层

对于子采样层,有 N 个输入图和 N 个输出图,但每个输出图变得更小。

down(.) 表示下采样函数。典型操作是对输入图像的不同 nxn 块的所有像素求和。这样,输出图像在两个维度上都缩小了 n 倍。每个输出图对应其自己的乘性偏差 β 和加性偏差 b。

3.2.1 计算梯度

这里最难的部分是计算敏感度图。一旦我们有了这个,我们需要更新的唯一偏置参数β和b就很容易了(公式(3))。如果下一个卷积层与这个子采样层完全连接,那么子采样层的敏感度图就可以通过BP计算出来。

我们需要计算卷积核的梯度,因此我们必须找到输入图中的哪个patch对应于输出图中的哪个像素。这里,我们必须找到当前层的敏感度图中的哪个patch对应于下一层的敏感度图中的给定像素,这样我们就可以像公式(1)中那样使用delta递归,也就是敏感度反向传播。此外,我们需要乘以输入patch和输出像素之间的连接的权重,这实际上是卷积核(旋转)的权重。

在此之前,我们需要对核进行旋转,以便卷积函数进行互相关计算。另外,我们需要处理卷积边界,不过在Matlab中,这更容易处理。Matlab中的全卷积会用0填充缺失的输入像素。

此时,我们可以计算 b 和 β 的梯度。首先,加法基础 b 的计算与上面的卷积层相同,只需将敏感度图中的所有元素相加即可:

至于乘性偏置β,由于在前向传播过程中涉及到下采样图的计算,所以最好在前向过程中保存这些图,这样在反向计算中就不需要重新计算了。我们定义:

这样β的梯度就可以计算如下:

3.3. 学习特征图的组合

很多时候,通过对多个输入图进行卷积,然后将这些卷积值相加得到一个输出图,效果往往比较好。在一些文献中,一般都是人工来选择将哪些输入图组合起来得到一个输出图。但这里我们尝试让CNN在训练过程中学习这些组合,也就是让网络学会选择哪些输入图来计算最佳的输出图。我们用αij来表示第i个输入图在得到第j个输出图时的权重或者贡献。这样,第j个输出图可以表示为:

需要满足约束:

这些对变量 αij 的约束可以通过将变量 αij 表示为一组不受约束的隐式权重 cij 的 softmax 函数来强制执行(因为 softmax 因变量是自变量的指数函数,所以它们的变化率会有所不同)。

因为对于固定的j,每组权重cij与其他组的权重无关,所以为了描述方便,我们去掉下标j,只考虑一个映射的更新。其他映射的更新也是同样的过程,只是映射索引j不同。

Softmax函数的导数表示为:

这里δ是克罗内克δ。误差关于第l层变量αi的导数为:

最后,可以通过链式法则得到成本函数关于权重ci的偏导数:

3.3.1 强制稀疏组合

为了限制 αi 的稀疏性,即限制一个输出图只与部分输入图相连,而不是与全部输入图相连,我们在总体成本函数中添加了一个稀疏约束项 Ω(α)。对于单个样本,将成本函数重写为:

然后求出这个正则化约束项对权重ci导数的贡献,正则化项Ω(α)对αi的导数为:

然后,根据链式法则,ci 的导数为:

因此,权重ci的最终梯度为:

3.4 使用 MATLAB 加速

CNN的训练主要基于卷积层和下采样层的交互,其主要计算瓶颈是:

1)前向传播过程:对每个卷积层的地图进行下采样;

2)反向传播过程:对高级子采样层的敏感度图进行上采样,以匹配底层卷积层的输出图的大小;

3)S形函数的应用及推导。

针对第一点和第二点问题,我们考虑如何利用Matlab内置的图像处理函数实现上采样和下采样操作。对于上采样,imresize函数可以做到,但是需要很大的开销。一个更快的版本是使用克罗内克积函数kron。通过用全一矩阵ones和我们需要上采样的矩阵做克罗内克积,就能达到上采样的效果。对于前向传播过程中的下采样,imresize并没有提供在缩小图像的同时计算nxn块中像素和的功能,所以不能使用。一个更好更快的方法是用全一的卷积核对图像进行卷积,然后简单地使用标准指数法对最后的卷积结果进行采样。 比如降采样域为2x2,那么我们可以用一个元素全为1的2x2卷积核对图像进行卷积,然后在卷积后的图像中每2个点采集一次数据,y=x(1:2:end,1:2:end),这样既可以得到一倍的降采样,又可以同时起到求和的效果。

对于第三个问题,其实有些人觉得在 Matlab 中内联定义 sigmoid 函数会更快,其实不然,Matlab 不同于 C/C++ 等语言,Matlab 的内联比普通的函数定义更省时,因此我们可以在代码中直接使用真实的代码来计算 sigmoid 函数及其导数。

相关推荐

cvpr 2024|注意力校准用于解缠结的文本到图像个性化

AttentionCalibrationforDisentangledText-to-ImagePersonalization研究背景近年来,大规模文本到图像(T2I)模型取得了显著进展,能...

1080P的显示,4K的享受?NVIDIA DSR游戏实测!

游戏玩家对画质的要求越来越高,因此每到新一代显卡推出的时候,除了游戏性能的提升之外,也会采用提升画质的新技术。NVIDIA最新的Geforce900系列显卡也不例外,一起推出的DSR技术号称可以在1...

「学习OpenCV4」OpenCV线性滤波与非线性滤波总结

本文分享内容来自图书《学习OpenCV4:基于Python的算法实战》,该书内容如下:第1章OpenCV快速入门;第2章图像读写模块imgcodecs;第3章核心库模块core;第4章...

增益映射耦合局部正则化的图像重构算法

朱莉(西安科技大学计算机学院,陕西西安710054)摘要:针对当前的图像重构方法在对多帧超分辨率图像复原时,存在明显的模糊效应与振铃效应的不足,提出增益映射控制耦合局部正则化的图像重构算法。首...

图像处理——5种常见的平滑滤波

平滑滤波是一种简单又常见的图像处理操作。平滑图像的目的有很多,但通常都是为了减少噪声和伪影。在OpenCV中共有5种平滑滤波操作,分别是以下几种:测试代码如下:#include<iostream...

C# 图像处理技术——简单的滤波去噪

在C#中,可以使用System.Drawing命名空间中的类来进行图像处理和滤波去噪操作。以下是一个示例代码,演示如何使用平均滤波器进行简单的去噪处理:usingSystem.Drawing;us...

Java,OpenCV,图像模糊,归一化均值滤波,中值滤波器,高斯模糊

图像模糊图像模糊是图像处理中最简单和常用的操作之一,其主要目的之一是给图像预处理的时候降低图像噪声。图像模糊方法可以总结如下:1、归一化均值滤波器(API为blur())2、高斯滤波器(API为Ga...

带频偏校准的GMSK解调器设计与实现

郑婧怡1,高绍全1,姜汉钧1,张春1,王志华1,2,贾雯2(1.清华大学微电子所,北京100084;2.深圳清华大学研究院,广东深圳518055)摘要:提出了一种在零中频低功耗蓝牙接收机中使用...

图像滤波去噪方法及应用场景

在图像处理中,不同滤波方法针对不同类型的噪声和场景具有特定优势。以下是三种常见滤波器的特点和应用场景总结:1.高斯滤波(GaussianFilter)原理:基于高斯函数的加权平均,对邻域像素进行平...

多体系统动力学仿真软件(DAP)

多体系统动力学仿真软件(DAP)-北京西交智众软件科技有限公司–DAP软件简介DAP(DynamicsAnalysisPlatform)软件,源自西南交通大学沈志云院士带队轨道交通运载系统全国...

精品博文图文详解Xilinx ISE14.7 安装教程

在软件安装之前,得准备好软件安装包,可从Xilinx官网上下载:http://china.xilinx.com/support/download/index.html/content/xilinx/z...

酷睿 Ultra 5 和 Ultra 7,或者i5和i7差距多大?

#我来唠家常#提到ultra,我觉得看这个题目,应该主打轻薄本,或者设计本。分两个问题看:ultra7或者i7的优势,ultra相对老款处理器的优势Ultra7的最大优势是:多了2个大核心,这两个大...

直流-直流(DC-DC)变换电路

直流-直流(DC-DC)变换电路,可以将一种直流电源经过变换电路后输出另一种具有不同输出特性的直流电源,可以是一种固定电压或可调电压的直流电。按照电路拓扑结构的不同,DC-DC变换电路可以分成两种形式...

Energies CL致命错误

期刊基础信息·刊号:ISSN1996-1073·全称:Energies·影响因子:3.2·分区:Q2(能源与燃料类)·版面费:2200瑞士法郎·年发文量:约4500篇CoverLett...

基于心电脉搏信号的无创血压算法研究

洋洋,陈小惠(南京邮电大学自动化学院,江苏南京210023)摘要:针对人体血压无创检测问题,提出了一种基于心电信号(Electrocardiogram,ECG)与光电容积脉搏波(Photople...