一、导论
对于小尺寸的图片问题,也许我们用深度神经网络的结构可以较为简单的解决一定的问题。但是当应用在大尺寸的图片上,输入规模将变得十分庞大,使用神经网络将会有非常多的参数需要去学习,这个时候全连接神经网络就不再适用,卷积神经网络能较好处理这类问题。
比如下面这张图
不进行全部像素的匹配,而是进行局部的匹配。这就是CNN的核心思想。
二、卷积
将3x3的filter和左边的6x6的图像进行运算,运算规则是从6x6的图像中圈出3x3的子图像进行对应网格相乘,并将相乘结果相加,将相加的结果写入右边的4x4的网格中,这便是卷积运算。3x3的子图像就像一个滑动窗口一样,每运算完一次,就向右移动,移动的网格的距离就叫步长。移动一格步长为1,移动两个步长为2.
2.Padding
按照我们上面讲的图片卷积,如果原始图片尺寸为n x n,filter尺寸为f x f,则卷积后的图片尺寸为(n-f+1) x (n-f+1)。这样会面临两个问题:
- 输出图片尺寸缩小
- 原始图片边缘信息对输出贡献得少,输出图片丢失边缘信息
于是我们将旁边补零。
经过padding之后,原始图片尺寸为(n+2p) x (n+2p),则卷积后的图片尺寸为(n+2p-f+1) x (n+2p-f+1)。若要保证卷积前后图片尺寸不变,则p应满足:
p
=
f
−
1
2
p = \frac{f-1}{2}
p=2f−1
filter尺寸为f x f,padding步长为p,原图像尺寸为nxn
3.立体卷积
假设原图像为R,G,B三个颜色通道,那么对应的卷积核也为三维通道,将每个维度进行卷积运算,如上图所示,进行三次单卷积运算,得到三维的卷积结果,将三维的卷积结果对应相加得到一维的卷积结果。
以上讨论的是只有一个卷积核(切莫搞混卷积核的维度和多卷积核),下面开始讨论多卷积核:
如上图所示为双卷积核,无非就是将上面的单卷积运算重复两遍,上面得到的是4x4的卷积结果,现在进行双卷积运算得到4x4x2的卷积结果。
4.池化层
最大池化
平均池化
- 池化层可以减少feature map的尺寸,从而减少计算量
- 池化层可以增强网络的表达能力
池化层没有需要学习的参数
5.卷积网络例子
卷积神经网络的参数:
- Conv:卷积
- Pool:池化
- Fc:全连接
三、Resnet
我们知道,如果神经网络层数越多,网络越深,源于梯度消失和梯度爆炸的影响,整个模型难以训练成功。解决的方法之一是人为地让神经网络某些层跳过下一层神经元的连接,隔层相连,弱化每层之间的强联系。这种神经网络被称为Residual Networks(ResNets)。
下面是一个普通的神经网络块的传输:
进行前向传播:
z
[
l
+
2
]
=
W
[
l
+
2
]
a
[
l
+
1
]
+
b
[
l
+
2
]
z^{[l+2]} = W^{[l+2]}a^{[l+1]}+b^{[l+2]}
z[l+2]=W[l+2]a[l+1]+b[l+2]
a
[
l
+
2
]
=
g
(
z
[
l
+
2
]
)
a^{[l+2]} = g(z^{[l+2]})
a[l+2]=g(z[l+2])
而Resnet则是直接将
a
[
l
]
a^{[l]}
a[l]和
z
[
l
+
2
]
z^{[l+2]}
z[l+2] 连接
于是:
a
l
+
2
=
g
(
z
[
l
+
2
]
+
a
[
l
[
)
a^{l+2} = g(z^{[l+2]}+a^{[l[})
al+2=g(z[l+2]+a[l[)
这里的连接是在激活函数之前,进行相加之后在进行激活
我们看一下a[l+2]的值,也就是上节课讲过的表达式,即 a l + 2 = g ( z [ l + 2 ] + a [ l [ ) a^{l+2} = g(z^{[l+2]}+a^{[l[}) al+2=g(z[l+2]+a[l[),添加项是刚添加的跳跃连接的输入。展开这个表达式,注意一点,如果使用L2正则化或权重衰减,它会压缩w的值。如果对b应用权重衰减也可达到同样的效果,如果w,b衰减到趋向零,若此时没有使用Resnet网络,则网络会训练不成功,此时对网络进行残缺处理,根据上面的额表达式,a[l+2]的值基本由a[l]决定。不会因为w,b趋向零而导致a[l+2]等于0.
当然,我们的目标不仅仅是保持网络的效率,还要提升它的效率。想象一下,如果这些隐藏层单元学到一些有用信息,那么它可能比学习恒等函数表现得更好。而这些不含有残差块或跳跃连接的深度普通网络情况就不一样了,当网络不断加深时,就算是选用学习恒等函数的参数都很困难,所以很多层最后的表现不但没有更好,反而更糟。
四、 1×1 卷积
你会好奇,1×1的卷积能做什么呢?不就是乘以数字么?听上去挺好笑的,结果并非如此,我们来具体看看。
那么,这样呢?
加入filter为16,那么这样一个1x1的卷积就减少了通道数目。
1×1卷积层就是这样实现了给神经网络添加了一个非线性函数,从而减少或保持输入层中的通道数量不变,当然如果你愿意,也可以增加通道数量。
五、Inception 网络
构建卷积层时,你要决定过滤器的大小究竟是1×1,3×3还是5×5,或者要不要添加池化层。而Inception网络的作用就是代替你来决定,虽然网络架构因此变得更加复杂,但网络表现却非常好,
- 如果使用1×1卷积,输出结果会是28×28×#(某个值),假设输出为28×28×64,对应上图的绿色部分。
- 如果使用3×3的过滤器,有128个,那么输出是28×28×128。然后我们把第二个值堆积到第一个值上,为了匹配维度,我们应用same卷积,输出维度依然是28×28,和输入维度相同,即高度和宽度相同。
- 使用5x5的,输出变成28×28×32,我们再次使用same卷积,保持维度不变。
因此他的基本思想是:Inception网络不需要人为决定使用哪个过滤器或者是否需要池化,而是由网络自行确定这些参数,你可以给网络添加这些参数的所有可能值,然后把这些输出连接起来,让网络自己学习它需要什么样的参数,采用哪些过滤器组合。
再看下一张图:
为什么在中间加入1x1的卷积层,拿5x5来说,若是没有家1x1的卷积层,那么就是28x28x192经过32个5x5的卷积得到28x28x32的输出,那么他的参数个数为551922828*32=1.2亿,参数非常庞大,假如我们加入1x1的卷积,那么就是先缩小网格,再在扩大网络,算一下他的参数约为1240万,减少了十分之一。
参考博客:https://blog.csdn.net/legend_hua/article/details/79876168?utm_source=app&app_version=4.7.0