如图示,之前课程中介绍的都是 64* 64 3 的图像,而一旦图像质量增加,例如变成 1000 1000 * 3 的时候那么此时的神经网络的计算量会巨大,显然这不现实。所以需要引入其他的方法来解决这个问题。
边缘检测可以是垂直边缘检测,也可以是水平边缘检测,如上图所示。
至于算法如何实现,下面举一个比较直观的例子:
可以很明显的看出原来 6 * 6 的矩阵有明显的垂直边缘,通过 3 * 3 的过滤器 (也叫做" 核 ") 卷积之后,仍然保留了原来的垂直边缘特征,虽然这个边缘貌似有点大,这是因为数据不够大的原因,如果输入数据很大的话这个不是很明显了。
除了上面的垂直,水平边缘检测,其实也可以检测初颜色过度变化,例如是亮变暗,还是暗变亮?
下面是一些常见的过滤器,第二个是 Sobel filter,具有较强的鲁棒性,第三个是 Schoss filter。
其实过滤器的 9 个参数也可以通过学习的方式获得,虽然比较费劲,但是可能会学到很多其他除了垂直,水平的边缘特征,例如 45°,70° 等各种特征。
之所以运用 Padding(填充) 主要是为了解决如下两个缺点:
1. 由前面的例子可以看到,每经过一次卷积计算,原数据都会减小,但有的时候我们并不希望这样。举个比较极端的例子:假设原数据是 30 * 30 的一只猫的图像,经过 10 次卷积 (过滤器是 3 * 3) 后,最后图像只剩下了 10 * 10 了,此时不就剩下马赛克了吗 23333
2. 由卷积的计算方法可以知道,图像边缘特征计算次数显然少于图像中间位置的像素点,如下图示 (绿色的位置明显是冷宫)
所以为了解决上 = 上面两个问题,引入了 padding,一般是 padding=1,填充的数据是 0。效果如下:
原来的 6 * 6 填充后变成了 8 * 8,此时在经过一次卷积得到的仍旧是 6 * 6 的矩阵。
下面总结一下卷积之后得到矩阵大小的计算方法,假设:
得到的矩阵大小是 (n+2p-f+1)*(n+2p-f+1)
对于第二个缺点,虽然边缘像素点仍旧计算的比较少,但是这个缺点至少一定程度上被削弱了。
两种选择:Valid 卷积和 Same 卷积
即不添加 padding。
即保持原图像矩阵的大小。满足 (n+2p-f+1) = n , 即 \(p=\frac{f-1}{2}\)
为了满足上式,f 一般奇数。
过滤器纵向,横向都需要按步长 S 来移动,如图示
结合之前的内容,输出矩阵大小计算公式方法为,假设:
得到的矩阵大小是 ⌊\(\frac{n+2p-f}{s}\)+1⌋*⌊\(\frac{n+2p-f}{s}\)+1⌋
⌊⌋: 向下取整符号 ⌊59/60⌋=0
⌈⌉:向上取整符号 ⌈59/60⌉=1
这一节用立体卷积来解释。
如图示,输入矩阵是 6 * 6 * 3(height * width * channels), 过滤器是 3 * 3 * 3,计算方法是一一对应相乘相加,最后得到 4 * 4 的二维矩阵。
有时可能需要检测横向边缘和纵向边缘,或者其他特征,所以我们可以使用多个过滤器。
上图则使用了两个过滤器,得到的特征矩阵大小为 4 * 4 * 2.
如图示得到 4 * 4 的矩阵后还需要加上一个变差 \(b_n\),之后还要进行非线性转换,即用 ReLU 函数。因此假如在某一卷积层中使用了 10 个 3 * 3 的过滤器,那么一共有 \((3*3+1)*10=280\) 个参数。
下面总结了各项参数的大小和表示方法:
输出层与输入层计算公式:
\(n_{H/W}^{[l]}=[\frac{n_{H/W}^{[l-1]}+2p^{[l]}-f^{[l]}}{s^{[l]}}+1]\)
上图简单介绍了卷积网络的计算过程,需要再介绍的一点是最后一层的全连接层,即将 7 * 7 * 40 的输出矩阵展开,得到 1960 个节点,然后再采用逻辑回归或 Softmax 来进行预测。
另外从上面的例子还可以看到,在一般的卷积神经网络中,每一层的矩阵的 height 和 width 是逐渐减小的,而 channel 则是增加的。
卷积神经网络中常见的三中类型的 layer:
Pooling layer(池化层) 的作用是压缩数据,加速运算,同时提高所提取特征的鲁棒性。
注意:一般来说池化层是不需要 Padding 的,所以 p 都会置为 0
注意:在吴大大的视频中将 Conv layer 和 Pooling layer 合并在一起视为一层,因为池化层没有参数 (因为池化层的过滤器的无参数,而且其大小可以事先确定好)。 但是在其他文献中可能会把池化层算成单独的层,所以具体视情况而定。
卷积相比于全连接的好处最直观的就是使用的参数更少:
如图示,加入我们有一个 32 * 32 * 3 的图片,经过 6 个 5 * 5 的过滤器后可以得到 28 * 28 * 6 的矩阵,此时我们只需要 \(5*5*6=150\) 个参数就可以了。而如果不用卷积呢?
首先 32 * 32 3 = 3072,假如输出矩阵也要是 28 28 * 6,即 4704 个节点,如果全连接的话那么就需要 4704 * 3072 个权
重参数,所以这个对比还是很明显的了。
至于为什么可以保证参数少的同时也保证了有效性,是因为如下两个原因
参数共享:例如我们希望获取图像的竖向特征,那么我们只需加入一个可以检测竖向特征的过滤器就够了。
稀疏连接:如上图所示,输出矩阵左上角的 0 只与输入矩阵左上角的 9 个元素有关,其他的值不会干扰。输出矩阵其他位置也一样。所以这就是为什么卷积网络也可以捕捉到图像平移的特征,例如将图片中的猫向左平移几个像素点后,依然能够识别正确。
来源: https://www.cnblogs.com/marsggbo/p/8166487.html