文章目录
Inception V1架构卷积核池化参数(重要)
注:下表中的“#3x3 reduce”,“#5x5 reduce”表示在3x3,5x5卷积操作之前使用了1x1卷积的数量。
0、输入
原始输入图像为224x224x3,且都进行了零均值化的预处理操作(图像每个像素减去均值)。
深度是22层
1、conv1 深度1
输入:224x224x3,目标输出:112x112x64
使用7x7的卷积核(滑动步长2,padding为3,SAME),64通道,输出为112x112x64,卷积后进行ReLU操作,
经过最大值池化:使用3x3的卷积核(滑动步长2,padding为1,SAME),输出为((112 - 3+1)/2)+1=56,即56x56x64,再进行ReLU操作。
1.1 卷积核大小选取(以前称为滤波器filter)
大部分卷积神经网络都会采用逐层递增(1⇒ 3 ⇒ 5 ⇒ 7)的方式。每经过一次池化层,卷积层过滤器的深度都会乘以 2;
注:卷积核具有的一个属性就是局部性。局部的程度取决于卷积核的大小。
一个卷积核在与 Input 不同区域做卷积时,它的参数是固定不变的。放在 DNN 的框架中理解,就是对同一层 Layer 中的神经元而言,它们的 和 是相同的,只是所连接的节点在改变。因此在 CNN 里,这叫做 共享权值偏置。卷积核的权值不需要提前设计,而是跟 DNN 一样利用 GD 来优化,我们只需要初始化。
权值共享:减轻过拟合 & 降低计算量
一个卷积层(Wx+b ⇒ ReLU ⇒ maxpooling)可以有多个不同的卷积核,而每一个卷积核都对应一个滤波后映射出的新图像,同一个新图像中的每一个像素都来自完全相同的卷积核,这就是卷积核的权值共享。权值共享的目的减轻过拟合 & 降低计算量。
1.2 1x1卷积核意义
1×1卷积核只有一个参数,这个核在输入上滑动,就相当于给输入数据乘以一个系数。(对于单通道和单个卷积核而言这样理解是可以的),看起来好像并没有什么意义,那它为什么还作用这么广泛了?可以从如下几个方向理解:
- 实现跨通道的交互和信息整合。比如输入是多通道的,由卷积神经网络计算方式可知,对于单一卷积核函数:当前位置的输出值,是由多个通道上的卷积结果相加然后再取激活函数值得到的。所以卷积核函数的尺寸是1*1的话,他可以整合多个通道的信息,而不会改变输入的大小。
- 卷积网络通道数目的升降,由于输出的通道数目是由卷积核函数的数目决定的,所以使用1*1的卷积核,在不改变输入大小的情况下,可以任意增减输出的通道数目。
1.3 池化层的理解
pooling池化的作用则体现在降采样:保留显著特征、降低特征维度,增大kernel的感受野。max_pool(value, ksize, strides, padding, name=None), ksize一般是[1, height, width, 1],因为我们不想在batch和channels上做池化,所以这两个维度设为了1。池化输出特征图计算和卷积计算公式相同,区别是池化是求卷积区域中的max,不涉及卷积计算。
池化层可对提取到的特征信息进行降维,一方面使特征图变小,简化网络计算复杂度并在一定程度上避免过拟合的出现;一方面进行特征压缩,提取主要特征。
注:padding
- 卷积层加入Padding,可以使得卷积层的输入维度和输出维度一致。
- 池化层加入Padding,一般都是保持边界信息。如果没有加padding的话,输入图片最边缘的像素点信息只会被卷积核操作一次,但是图像中间的像素点会被扫描到很多遍,那么就会在一定程度上降低边界信息的参考程度,但是在加入padding之后,在实际处理过程中就会从新的边界进行操作,就从一定程度上解决了这个问题。。
SAME:是填充,填充大小, p = (f-1)/2(f为卷积核大小,维度f通常是奇数);向上取整
VALID:是不填充,直接计算输出,即令p=0,向上取整。
举例:池化输出特征图计算和卷积计算公式相同,区别是池化是求卷积区域中的max,不涉及卷积计算。
(1)pooling(kernel size 2×2,padding 0,stride 2)
32*32*16->pooling之后(32-2+0)/2 + 1 =16*16
pool3 = tf.nn.max_pool(layer3,[1,2,2,1],[1,2,2,1],padding=‘SAME’)
padding = p = (f-1)/2=(2-1)/2=0
(2)pooling(kernel size 3×3,padding 0,stride 1)
32*32*16 → pooling之后(32-3+0)/1 + 1 = 30*30
pool3 = tf.nn.max_pool(layer3,[1,3,3,1],[1,1,1,1])
1.4 输出矩阵计算
综合考虑步长、padding后,计算两个矩阵卷积后的输出矩阵的维度大小的公式如下:
- 输入:n x n
- 卷积核: f x f
- padding: p
- 步长strides: s
输出: [ [ ( n + 2 p − f ) / s ] + 1 ] × [ [ ( n + 2 p − f ) / s ] + 1 ] [[(n + 2p -f) /s] + 1] × [[(n + 2p -f) /s] + 1] [[(n+2p−f)/s]+1]×[[(n+2p−f)/s]+1]
对于VALID向上取整
[ ( n − f + 1 ) ) / s ] [(n -f + 1)) /s ] [(n−f+1))/s]
对于SAME向上取整
[ n / s ] [n/s ] [n/s]
对于卷积神经网络来说,每个卷积层(l层)的维度变化如下:
import tensorflow as tf
import numpy as np
input = tf.Variable(tf.random_normal([64, 5, 5, 3]))
filter =