🐳CNN前向传播算法
2021-11-30
| 2023-8-6
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
 

CNN的基本结构

一个常见的CNN例子如下图:
notion image
图中是一个图形识别的CNN模型。可以看出最左边的船的图像就是我们的输入层,计算机理解为输入若干个矩阵,这点和DNN基本相同。
接着是卷积层(Convolution Layer),这个是CNN特有的,卷积层的激活函数使用的是ReLU。在卷积层后面是池化层(Pooling layer),这个也是CNN特有的。需要注意的是,池化层没有激活函数
卷积层+池化层的组合可以在隐藏层出现很多次,上图中出现两次。而实际上这个次数是根据模型的需要而来的。当然也可以灵活使用使用卷积层+卷积层,或者卷积层+卷积层+池化层的组合,这些在构建模型的时候没有限制。但是最常见的CNN都是若干卷积层+池化层的组合,如上图中的CNN结构。
在若干卷积层+池化层后面是全连接层(Fully Connected Layer, 简称FC),全连接层其实就是DNN结构,只是输出层使用了Softmax激活函数来做图像识别的分类。
从上面CNN的模型描述可以看出,CNN相对于DNN,比较特殊的也就是是卷积层和池化层。
 
用一个彩色的汽车样本的图像识别直观的看下CNN的结构。图中的CONV即为卷积层,POOL即为池化层,而FC即为DNN全连接层,包括了最后的用Softmax激活函数的输出层。
notion image
要理顺CNN的前向传播算法,重点是输入层的前向传播,卷积层的前向传播以及池化层的前向传播。而DNN全连接层和用Softmax激活函数的输出层的前向传播算法之前已经整理过了。
 

CNN输入层前向传播到卷积层

输入层的前向传播是CNN前向传播算法的第一步,一般输入层对应的都是卷积层,因此是输入层前向传播到卷积层。
以图像识别为例,先考虑最简单的,样本都是二维的黑白图片。这样输入层 就是一个矩阵,矩阵的值等于图片的各个像素位置的值。这时和卷积层相连的卷积核就也是矩阵。
如果样本都是有RGB的彩色图片,这样输入就是3个矩阵,即分别对应R,G和B的矩阵,或者说是一个张量。这时和卷积层相连的卷积核 就也是张量,对应的最后一维的维度为3,即每个卷积核都是3个子矩阵组成。
同样的方法,对于3D的彩色图片之类的样本,输入可以是4维,5维的张量,那么对应的卷积核也是个高维的张量。
不管维度多高,对于输入,前向传播的过程可以表示为:
其中,上标代表层数,星号代表卷积,而 代表偏倚, 为激活函数,这里一般都是ReLU。
和DNN的前向传播比较一下,其实形式非常的像,只是这儿是张量的卷积,而不是矩阵的乘法。同时由于是张量,那么同样的位置, 参数的个数就比DNN多很多了。
为了简化描述,后面如果没有特殊说明都默认输入是3维的张量,即用RBG可以表示的彩色图片。
这里需要自己定义的CNN模型参数是:
  • 一般卷积核不止一个,比如有K个,那么输入层的输出,或者说第二层卷积层的对应的输入就
  • 卷积核中每个子矩阵的的大小,一般都用子矩阵为方阵的卷积核,比如的子矩阵
  • 填充padding(以下简称P),卷积的时候,为了可以更好的识别边缘,一般都会在输入矩阵在周围加上若干圈的0再进行卷积,加多少圈则为多少
  • 步幅stride(以下简称S),即在卷积过程中每次移动的像素距离大小
 

隐藏层前向传播到卷积层

假设隐藏层的输出是个矩阵对应的三维张量,则输出到卷积层的卷积核也是个子矩阵对应的三维张量。这时表达式和输入层的很像,也是
也可以写成个子矩阵子矩阵卷积后对应位置相加的形式,即:
与前面区别仅仅在于,这里的输入是隐藏层来的,而不是输入的原始图片样本形成的矩阵
这里需要定义卷积核的个数K,卷积核子矩阵的维度F,填充大小P以及步幅S
 

隐藏层前向传播到池化层

池化层的处理逻辑是比较简单的,目的就是对输入的矩阵进行缩小概括。比如输入的若干矩阵是维的,而池化大小是 的区域,则输出的矩阵都是 维的。
这里需要需要定义的CNN模型参数是:
  • 池化区域的大小
  • 池化的标准,一般是MAX或者Average
 

隐藏层前向传播到全连接层

由于全连接层就是普通的DNN模型结构,因此可以直接使用DNN的前向传播算法逻辑,即:
激活函数一般是sigmoid或者tanh
经过了若干全连接层之后,最后的一层为Softmax输出层。此时输出层和普通的全连接层唯一的区别是,激活函数是softmax函数。
这里需要需要定义的CNN模型参数是:
  • 全连接层的激活函数
  • 全连接层各层神经元的个数

CNN前向传播小结

输入:1个图片样本,CNN模型的层数L和所有隐藏层的类型,对于卷积层,要定义卷积核的大小K,卷积核子矩阵的维度F,填充大小P,步幅S。对于池化层,要定义池化区域大小k和池化标准(MAX或Average),对于全连接层,要定义全连接层的激活函数(输出层除外)和各层的神经元个数
输出:CNN模型的输出
  1. 根据输入层的填充大小P,填充原始图片的边缘,得到输入张量
  1. 初始化所有隐藏层的参数
  1. for =2 to :
      • 如果第 层是卷积层,则输出为
      • 如果第 层是池化层,则输出为 ,这里的pool指按照池化区域大小k和池化标准将输入张量缩小的过程
      • 如果第 层是全连接层,则输出为
  1. 对于输出层第 层:
 
  • PyTorch
  • 池化层CNN反向传播算法
    目录