当前位置: 首页 > news >正文

卷积神经网络

卷积神经网络

这一章主要介绍了卷积神经网络(convolutional neural network,简称CNN),它通常适用于具有网格状结构的数据,例如时序数据可看做是在特定时间间 隔上的一维网格,图像可以看做是像素构成的二维网格,医学成像如CT等为三维网格数据。

基本介绍

卷积神经网络,顾名思义,利用了数学上的卷积操作(convolution)。和前面第六章总结的基本的 前馈神经网络相比,CNN只不过是将某层或某几层中的矩阵乘法运算替换为卷积运算,其他的比如说最大似然法则,反向传播算法等等都保持不变。
回顾一下矩阵乘法可以表示为 \(C=A B\) ,矩阵中每个元素为

\[C_{i, j}=\sum_k A_{i, k} B_{k, j} \]

而卷积运算定义为

\[S(i, j)=(I * K)(i, j)=\sum_m \sum_n I(i+m, j+n) K(m, n) \]

其中\(I\)是输入矩阵(input), \(K\) 是核矩阵(kernel),输出 \(S\) 又称作特征图(feature map),而 \(m, n, n\) 则为 \(K\) 的大小。卷积操作即可看做将核矩阵扫过输入矩阵并进行元素积求和的过程,如下图所示:

为什么CNN可以有这么高效的应用于具有网格结构的数据呢?

主要原因是

1.稀疏连接(sparse connectivity)

2.参数共享(parameter sharing)

对于传统的MLP神经网络来说,由于其操作是矩阵乘法,每一个输入与输出元之间都需要一个独立的参数来表示,这代表每个输出元与每个输入元之间都有连接,我们就需要很大的空间来存储这些参数,比如说图像有几摆个像素点,每个像素点都代表一个输入,而每个像素点都需要一个参数进行对应,这很容易造成维度爆炸。而对于CNN来说,通常其kernel的大小远小于其输入的大小,例如对于图像数据,输入常常有成千上万的像素,而对于检测图像中边的结构的kernel可能只需要利用十至百个像素即可,这极大的减小了存储所需空间,而且减小了计算输出时的计算量。对于\(m\)个输入和\(n\)个输出,矩阵乘法需要\(m*n\)个参数,其运算时间为 \(O(m*n)\),而假如我们限制每个输入到输出的连接为k个,则我们仅需要 \(k*n\) 个参数,且运算时间为 \(O(k*n)\) 。如图中所示,上图为卷积操作,下图为矩阵乘法,可见卷积操作总的连接数大大减小

另外,对于传统神经网络来说,每一个输入至输出的元素都是独立的,只对于输入的一个元素起作用,而对于CNN来说,kernel的矩阵元素对于输入的每一个元素都起作用,实现了参数的共享,如图中所示,上图是一个kernel大小为3的卷积神经网络,其中深黑色箭头代表的kernel中间的元素对于每一个 \(x_i\)\(s_i\) 的运算都起作用,而对于下图矩阵乘法来讲,黑色箭头代表的权重矩阵中的元素仅对 \(x_3\)\(s_3\) 的运算起作用。

Pooling

除了卷积层之外,CNN中还有常用的操作是pooling function,其作用是利用附近元素的统计信息来代替其原有的值,其目的是可以使结果在对于输入的小量改变的干扰下保持稳定。例如,一个经典的pooling function是max pooling,即将周围小方格中的最大值作为输出值,当某一输入值改变时,对最大值影响较小,保持了输出的稳定。加入pooling后,卷积的基本单元包括卷积层(convolution layer),激活函数的非线性Detector layer,以及pooling layer,如下图所示

当然pooling layer实际上是假定了数据对于小位移是不变的,比起特定的位置,我们更关心的是某个特征是否存在,对于有些问题,假如我们更关心其特征所在的特定位置,则我们不需用pooling layer。实际上,对于卷积操作来说,我们也是假设了隐藏层中的权重和其邻居是相同的只不过是位移了一下,而且权重集中在与该单元在空间上连续的一个小的空间内,而对于其他元素则权重为零,即我们的卷积层代表的函数是局域相互作用且平移不变的,所以我们要注意对于我们所要研究的数据convolution以及pooling是否会造成欠拟合。

tips:参数共享的卷积和pooling操作有着非常强的先验,我们假定模型具有平移不变性。若真实的Task不能由该强假设模型进行你拟合,就会出现欠拟合​。当我们不使用参数共享的普通卷积,而使用局部连接的卷积,此时网络可以对于不同的局部进行不同的特征探测,此时再搭配上max池化,网络就可以自己学习到新的不变性。

Padding

CNN还有一些其他技巧如strided convolution,即我们每间隔几个元素做一次卷积,则输出相对于输入的大小进一步减小,如下图所示,图中为stride为2的卷积,输出元素个数近似为输入元素的1/2:

其他的技巧还有zero padding,即如果我们不加任何的padding,假如我们的kernel大小为k,对于一维网格的CNN,由于边缘元素的存在,则每层大小会减小k-1,这导致我们不能建立很深的CNN,所以我们可以采取对每层边缘额外补上k-1个零元素的方式,使每层大小保持一致,从而可以训练更深层的CNN。

http://www.sczhlp.com/news/2435/

相关文章:

  • 批量梯度下降
  • 图像生成-FUDUKI解读-01-14 - jack
  • 批处理化
  • 33、简历插入图片
  • 第一章
  • 当“她”不在的四年里,小姨子们竟变成了这样……|女神保卫战剧情体验
  • 测试人员工作指南
  • ManageEngine卓豪如何助你轻松应对GMP/FDA审计?
  • 批量添加edge的ie兼容模式网站
  • Elasticsearch读写优化,1000 到88000/s
  • SC3超低功耗裂缝仪 墙体地表裂缝全天候监测
  • 一文教会你基于 Rainbond 部署 DolphinScheduler 高可用集群
  • 【题解】tupc2024_o Twin Contests
  • 前馈神经网络
  • 最新版likeshop上门家政服务源码 基于likeadmin-php开发的上门预约系统
  • 【解决】Qt Creator只显示.pro文件 / Cannot run compiler cl.
  • LHA8951国产化代替AD7915芯片
  • 深入解析:FSMC的配置和应用
  • keil编译贼慢
  • Vidar Stealer:隐藏在Steam游戏中的信息窃取恶意软件分析
  • 读书笔记:Oracle数据库连接模式:专用、共享和DRCP,到底怎么选?
  • 故障处理:event enq: JZ – Join group dictionary when in-memory disable
  • 国产芯片LHA8961,代替AD7916
  • 226-基于Xilinx Kintex-7 FPGA K7 XC7K325T PCIeX8 四路光纤卡
  • GCD定时器DispatchSourceTimer崩溃问题
  • 【直播预约】天翼云如何通过 DolphinScheduler 实现大数据自动化与全链路血缘,探索实践亮点!
  • 面经学习-ECDHE加密的TLS
  • 关于python环境库导出
  • 圆满闭幕|WAIC2025规模创历史新高,“灵掘”具身智能模型全球首发引全网关注
  • 案例故事 | 数据治理:某半导体巨头的数字化升级之路