1. 计算机视觉

应用领域:图片猫🐱识别,目标检测(无人驾驶),图像风格转换(比如转成素描)等等。

面临的挑战:

  • 数据的输入量可能会非常大,例如一张1000×1000的图片,特征向量的维度达到了1000×1000×3(RGB,3通道) = 300万
  • 神经网路中涉及的参数比较多,例如在神经网络中,你也许会有1000个隐藏单元,使用标准的全连接网络,这个矩阵将会含有1000×300万,即30亿个参数。
    ① 如此大量的参数情况下,难以获得足够的数据来防止神经网络发生过拟合
    ② 处理30亿参数的神经网络所需的巨大内存难以应对

你希望模型能处理如此的的数据量。为此,你需要进行卷积计算,下节将用边缘检测的例子来说明卷积的含义。

2. 边缘检测示例

在这里插入图片描述
例如 6 × 6 6 \times 6 6×6 的单通道灰度图像,检测垂直边缘,构造一个矩阵 [ 1 0 − 1 1 0 − 1 1 0 − 1 ] \left[\begin{array}{rrr}1 & 0 & -1 \\ 1 & 0 & -1 \\ 1 & 0 & -1\end{array}\right] 111000111 (过滤器 / / / 卷积核),进行卷积运算 * (convolve)在这里插入图片描述

import numpy as np
image = np.array([[3,0,1,2,7,4],[1,5,8,9,3,1],[2,7,2,5,1,3],[0,1,3,1,7,8],[4,2,1,6,2,8],[2,4,5,2,3,9]])
print(image)
print('-------')
filter_ = np.array([[1,0,-1],[1,0,-1],[1,0,-1]])
print(filter_)
print('-------')
from scipy import signal
convolution = -signal.convolve2d(image,filter_,boundary='fill',mode='valid')
print(convolution)
[[3 0 1 2 7 4]
 [1 5 8 9 3 1]
 [2 7 2 5 1 3]
 [0 1 3 1 7 8]
 [4 2 1 6 2 8]
 [2 4 5 2 3 9]]
-------
[[ 1  0 -1]
 [ 1  0 -1]
 [ 1  0 -1]]
-------
[[ -5  -4   0   8]
 [-10  -2   2   3]
 [  0  -2  -4  -7]
 [ -3  -2  -3 -16]]

检测边缘实例:
在这里插入图片描述

image = np.array([[10,10,10,0,0,0],[10,10,10,0,0,0],[10,10,10,0,0,0],[10,10,10,0,0,0],[10,10,10,0,0,0],[10,10,10,0,0,0]])
filter_ = np.array([[1,0,-1],[1,0,-1],[1,0,-1]])
print(-signal.convolve2d(image,filter_,boundary='fill',mode='valid'))
[[ 0 30 30  0]
 [ 0 30 30  0]
 [ 0 30 30  0]
 [ 0 30 30  0]]

3. 更多边缘检测

可以检测明暗变化方向
在这里插入图片描述

竖直,水平的过滤器
在这里插入图片描述
把这9个数字当成参数,通过反向传播学习,边缘捕捉能力会大大增强(可以检查任意角度)

4. Padding

假设原始图片是 n × n n \times n n×n,过滤器是 f × f f \times f f×f,那么输出大小是 ( n − f + 1 ) × ( n − f + 1 ) (n-f+1) \times(n-f+1) (nf+1)×(nf+1)

  • 缺点1,图像每做一次卷积,缩小一点,最后变得很小
  • 缺点2,在角落或边缘区域的像素点在输出中采用较少,丢失了图像边缘位置的许多信息

解决上面的问题:

  • 进行卷积操作前,沿图像边缘填充 p 层像素,令 ( n + 2 ∗ p ) − f + 1 = n ⇒ p = f − 1 2 (n+2*p)-f+1 = n \Rightarrow p = \frac{f-1}{2} (n+2p)f+1=np=2f1,这样可以保持图像大小不变,同时也使得边缘信息发挥作用较小的缺点被削弱

填充多少层,怎么选?

  • 对于Valid 卷积: p = 0 p=0 p=0,不需要填充
  • 对于Same 卷积: p = f − 1 2 p = \frac{f-1}{2} p=2f1 f f f 通常是奇数(对称填充,有中心点)

5. 卷积步长

每次过滤器在图片中移动的步长为s(stride)

输出尺寸为 ( ⌊ n + 2 p − f s ⌋ + 1 ) × ( ⌊ n + 2 p − f s ⌋ + 1 ) (\lfloor \frac{n+2p-f}{s} \rfloor+1) \times (\lfloor \frac{n+2p-f}{s} \rfloor+1) (sn+2pf+1)×(sn+2pf+1)

:数学中的卷积,需要在操作之前对过滤器 顺时针旋转90度 + 水平翻转,深度学习里省略了该步骤,但是不影响,简化了代码

6. 三维卷积

在这里插入图片描述
输出是一个二维的,每个格子里是对应着 27个元素求和

如果希望对不同的通道进行检测边缘,对 filter 的相应层设置不同的参数就可以了

想要多个过滤器怎么办?(竖直的、水平的,各种角度的)

在这里插入图片描述

7. 单层卷积网络

在这里插入图片描述
在这里插入图片描述

参数的个数跟图片大小无关,跟过滤器相关,假如有10个过滤器,上面每个过滤器有 27 个参数,加上偏置 b,28个再乘以10,共计280个参数。

即使图片很大,参数却很少,这也是卷积神经网络的一个特征,叫作避免过拟合在这里插入图片描述

8. 简单卷积网络示例

在这里插入图片描述
除了 卷积层(convolution),还有 池化层(pooling),全连接层(fully connected)。

9. 池化层

除了卷积层,卷积网络也经常使用池化层缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性
在这里插入图片描述
Max 运算的实际作用:

  • 如果在过滤器中提取到某个特征,那么保留其最大值
  • 如果没有提取到这个特征,例如在右上象限中这个特征就不明显,其最大值也还是很小

池化,它有一组超参数 f , s f,s fs,但没有参数需要学习,不需要梯度下降更新
在这里插入图片描述
池化层特征

  • 最大池化比平均池化更常用
  • 常用的参数值为 f = 2  or  3 , s = 2 f=2 \text{ or } 3,s= 2 f=2 or 3s=2
  • 最大池化时,很少用到 padding(即 p = 0 p=0 p=0
  • 池化层前后的输入输出通道数一样
  • 最大池化只是计算神经网络某一层的静态属性,没有需要学习的参数

10. 卷积神经网络示例

在这里插入图片描述
尽量不要自己设置超参数,而是查看文献中别人采用了哪些超参数,选一个在别人任务中效果很好的架构,它也有可能适用于你的应用程序。
在这里插入图片描述

11. 为什么使用卷积?

和只用全连接层相比,卷积层 的两个主要优势在于参数共享稀疏连接,全连接层的参数巨大,卷积层需要的参数较少。

原因:

  • 参数共享,特征检测如果适用于图片的某个区域,那么它也可能适用于图片的其他区域
  • 使用稀疏连接,一个输出仅依赖少部分的输入
    在这里插入图片描述
    神经网络可以通过这两种机制减少参数,以便我们用更小的训练集来训练它,从而预防过度拟合。
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐