关于卷积
参考https://www.cnblogs.com/believe-in-me/p/6645402.html
卷积神经网络(CNN)由输入层、卷积层、激活函数、池化层、全连接层组成,即INPUT-CONV-RELU-POOL-FC
输入图像是32 * 32 * 3,3是它的深度(即R、G、B),卷积核是一个5 * 5 * 3的filter,这里注意:卷积核的深度必须和输入图像的深度相同。通过一个filter与输入图像的卷积可以得到一个28 * 28 * 1的特征图.
Wout = (Win - K + 2P) / S + 1 = (32 - 5 + 2 * 0) / 1 + 1 = 28
tensorflow中kernels = [5, 5, 3, 16]代表16个5x5x3的卷积核, stride = [1, 2, 2, 1]代表横纵两个方向上的步长都等于2, 看中间的两个.
RELU为激活函数, 引入非线性
矩阵卷积为点积再求和, 不是矩阵相乘.有时卷积核需180度上下翻转
输入图像和filter的对应位置元素相乘再求和,最后再加上b,得到特征图。如图中所示,filter w0的第一层channel和输入图像的蓝色方框中对应元素相乘再求和得到0,其他两个channel得到2,0,则有0+2+0+1=3即图中右边特征图的第一个元素3.
stride=2, 则卷积核向右移动2格, 继续与输入图像相乘
padding项,即为图像加上一个边界,边界元素均为0或复制最边上的数,(对原输入无影响)一般有
F=3 => zero pad with 1
F=5 => zero pad with 2
F=7 => zero pad with 3
边界宽度是一个经验值,加上zero pad这一项是为了充分利用边界上的像素, 有时也可使输入图像和卷积后的特征图具有相同的大小(stride为1时),如:
输入为5*5*3,filter为3*3*3,在zero pad 为1,则加上zero pad后的输入图像为7*7*3,则卷积后的特征图大小为5*5*1 ( 有如下公式可得(5 + 2 * 1 - 3) / 1 + 1 ),与输入图像一样.
输出大小计算公式
按照经验, 网络中看到stride为1的时候,当kernel为 3 padding为1或者kernel为5 padding为2 一看就是卷积前后尺寸不变(卷积向下取整,池化向上取整); stride=2时, 当kernel=3 padding=1时或者kernel=5 padding=2时, 尺寸减半.
对于反卷积
反卷积过程输入:2x2, 卷积核:4x4, 滑动步长:3, 输出:7x7
(2 - 1) * 3 + 4 = 7 (此处的7x7是做了padding的, 原图大小应该为5x5)
就是把普通卷积的计算Wout = (Win + 2P - K) / S + 1反过来
Wout' = (Win' - 1) * S + K - 2P
权值共享
由经验: stride=1时, k=5, p = 2则输出图像尺寸大小和输入图像相同
如没有这个原则,则总特征图由10个32*32*1的特征图组成,即每个特征图上有1024个神经元(像素, 不是卷积核),每个神经元对应输入图像上一块5*5*3的区域,即一个神经元和输入图像的这块区域有75个连接,即75个权值参数,则共有75*1024*10=768000个权值参数,这是非常复杂的,因此卷积神经网络引入“权值”共享原则,即一个特征图上每个神经元对应的75个权值参数被其他神经元共享,这样则只需75*10=750个权值参数,而每个特征图的阈值也共享,即需要10个阈值,则总共需要750+10=760个参数。
即每个filter对每一个像素采取相同的权重系数, 不随filter的滑动而改变, 则10个filter总共需要750个权重系数
问题: 特征图feature map上的阈值是什么? bias吗?
池化(下采样)
池化压缩特征池化层:对输入的特征图进行压缩,一方面使特征图变小,简化网络计算复杂度;一方面进行特征压缩,提取主要特征,如下:
注意:这里的pooling操作使特征图缩小,有可能影响网络的准确度,因此可以通过增加特征图的channel来弥补 (池化不改变channel数)
全连接层:连接所有的特征,将输出值送给分类器(如softmax分类器)
另外:CNN网络中前几层的卷积层参数量占比小,计算量占比大;而后面的全连接层正好相反,大部分CNN网络都具有这个特点。因此我们在进行计算加速优化时,重点放在卷积层;进行参数优化、权值裁剪时,重点放在全连接层
网友评论