文章目录
1.1 计算机视觉
图片过大,参数过多,需要卷积的方式缩小维度
1.2 边缘检测示例
[
1
0
−
1
1
0
−
1
1
0
−
1
]
\left[\begin{array}{lll} 1 & 0 & -1 \\ 1 & 0 & -1 \\ 1 & 0 & -1 \end{array}\right]
⎣⎡111000−1−1−1⎦⎤
代表核,或者是卷积核,过滤器。
*
代表卷积运算
卷积运算:
如果在tensorflow下,这个函数叫tf.conv2d。Keras这个框架,在这个框架下用Conv2D实现卷积运算。
卷积运算提供了一种方便的算法来发现图像中的垂直边缘
1.3 更多边缘检测内容
通过垂直或者水平的滤波器,找到不同的分界线
各种各样的滤波器
叫做Sobel的过滤器,它的优点在于增加了中间一行元素的权重,这使得结果的鲁棒性会更高一些。
这叫做Scharr过滤器,它有着和之前完全不同的特性,实际上也是一种垂直边缘检测,如果你将其翻转90度,你就能得到对应水平边缘检测。
随着深度学习的发展,我们学习的其中一件事就是当你真正想去检测出复杂图像的边缘,你不一定要去使用那些研究者们所选择的这九个数字,但你可以从中获益匪浅。把这矩阵中的9个数字当成9个参数,并且在之后你可以学习使用反向传播算法,其目标就是去理解这9个参数。
1.4 Padding
当发生卷积运算的时候,会出现两个缺点
1.每次做卷积操作,你的图像就会缩小,从6×6缩小到4×4,你可能做了几次之后,你的图像就会变得很小了,可能会缩小到只有1×1的大小。你可不想让你的图像在每次识别边缘或其他特征时都缩小,这就是第一个缺点。
2.第二个缺点边缘像素信息丢失,如果你注意角落边缘的像素,这个像素点(绿色阴影标记)只被一个输出所触碰或者使用,因为它位于这个3×3的区域的一角。但如果是在中间的像素点,比如这个(红色方框标记),就会有许多3×3的区域与之重叠。所以那些在角落或者边缘区域的像素点在输出中采用较少,意味着你丢掉了图像边缘位置的许多信息。
解决这两个问题的方法:在原数据上填充像素。
若未卷积前使6x6,Padding周边一圈,维度提高到8x8, 核维度是3x3,那么卷积后维度不变6x6
总结公式为:
n
×
n
=
=
>
(
n
+
2
p
−
f
+
1
)
×
(
n
+
2
p
−
f
+
1
)
n\times n ==> (n+2 p-f+1) \times(n+2 p-f+1)
n×n==>(n+2p−f+1)×(n+2p−f+1)
若你想卷积后维持维度不变
n
+
2
p
−
f
+
1
=
n
n+2 p-f+1=n
n+2p−f+1=n,那么可以得出:
p
=
(
f
−
1
)
/
2
p=(f-1) / 2
p=(f−1)/2
也就是若
p
p
p为整数,那么
f
f
f必须为奇数。
若
f
f
f为偶数,则p带小数,证明左右不对称填充,
两种卷积的方法
Valid
不使用填充
“Same”
使用填充
1.5 卷积步长(Strided convolutions)
步长,蓝色框移动的步长。
我们用3×3的矩阵卷积一个7×7的矩阵,得到一个3×3的输出。输入和输出的维度是由下面的公式决定的。如果你用一个f×f的过滤器卷积一个n×n的图像,你的padding为p,步幅为s,在这个例子中s=2,你会得到一个输出,因为现在你不是一次移动一个步子,而是一次移动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,也就是3x3
有一点,公式算出来不是整数,向下取整。
实际含义:如果有任意一个蓝框移动到了外面,那你就不要进行相乘操作。
额外说明
这些视频中定义卷积运算时,我们跳过了这个镜像操作。从技术上讲,我们实际上做的,我们在前面视频中使用的操作,有时被称为互相关(cross-correlation)而不是卷积(convolution)。但在深度学习文献中,按照惯例,我们将这(不进行翻转操作)叫做卷积操作。
1.6 三维卷积
三维卷积的基本方法:
- 第一个6代表图像高度,第二个6代表宽度,这个3代表通道的数目
- 同样你的过滤器也有高,宽和通道数,并且图像的通道数必须和过滤器的通道数匹配,所以这两个数(紫色方框标记的两个数)必须相等
- 这个3×3×3的过滤器有27个数,这27个数与原数据一个位置相乘加在一起输出1个数字。
输出的维度就等于,这里的
n
c
′
n_{c^{\prime}}
nc′代表着有几个滤波器输出的就有几个channles。
(
n
−
f
+
1
)
×
(
n
−
f
+
1
)
×
n
c
′
(n-f+1) \times (n-f+1) \times n_{c^{\prime}}
(n−f+1)×(n−f+1)×nc′
1.7 单层卷积网络
单层卷积网络如何进行前向传播?
基本的前向传播
- z [ 1 ] = W [ 1 ] a [ 0 ] + b [ 1 ] z^{[1]}=W^{[1]}a^{[0]}+b^{[1]} z[1]=W[1]a[0]+b[1],其中 a [ 0 ] = x a^{[0]} = x a[0]=x
- a [ 1 ] = g ( z [ 1 ] ) a^{[1]} = g(z^{[1]}) a[1]=g(z[1])
卷积的前向传播
- 第一步的卷积过程类似于 W [ 1 ] a [ 0 ] W^{[1]}a^{[0]} W[1]a[0],卷积核就是 W W W,然后加上偏差b
- 得到的结果在用激活函数ReLU计算
体会参数简化了多少
其中计算图片RBG的卷积核维度为 3x3x3,那么就是27个参数,然后加上一个偏差,用参数b表示,现在参数增加到28个。这里采用10个过滤器,那么就是280个参数。
不论输入图片有多大,1000×1000也好,5000×5000也好,参数始终都是280个。
即使这些图片很大,参数却很少,这就是卷积神经网络的一个特征,叫作“避免过拟合”。
各种参数的含义
- f [ l ] f^{[l]} f[l] , 过滤器的大小
- p [ l ] p^{[l]} p[l] , 填充的参数 , 可看1.4介绍
- s [ l ] s^{[l]} s[l] , 步长的大小
- n [ l ] n^{[l]} n[l] , 过滤器的个数
- n [ l − 1 ] n^{[l - 1]} n[l−1] , 上一层最后一个维度的大小,若是图像层,也就是红蓝绿,代表3。若是隐藏层也就是上一层过滤器的个数
每一层的输入,输出维度
- 输入:
- 输出:
- 每一层过滤器的维度:
- 激活函数的维度:
- 维度的维度:
- 偏差的维度:
且L层
n
W
,
n
H
n_W,n_H
nW,nH维度与上一层L-1层的关系:
1.8 简单卷积网络示例
卷积神经网络的趋势:
- 维度越来越小,信道越来越多。
一般的CNN具有3层:
- convolution ,Conv, 卷积层
- Pooling , pool , 池化层
- Fully connected , FC 全连接层
1.9 池化层(Pooling layers)
Max pooling
基本概念
对f维度的参数取出最大值
最大池化的超级参数,
f
f
f与
s
s
s
最大池化的作用
你可以把这个4×4区域看作是某些特征的集合,也就是神经网络中某一层的非激活值集合。
- 数字大意味着可能探测到了某些特定的特征,显然左上象限中存在这个特征,这个特征可能是一只猫眼探测器。
- 数字小意味可能并没有提取到有效的特征
所以最大化运算的实际作用就是,如果在过滤器中提取到某个特征,那么保留其最大值。如果没有提取到这个特征,可能在右上象限中不存在这个特征,那么其中的最大值也还是很小,这就是最大池化的直观理解。
参数一旦确定,梯度下降不用改变任何的值
Average pooling
最大池化比平均池化用的更多,再特别深的网络中会使用平均池化
总结:池化的可选择参数
池化很少使用p参数
没有参数可以学习,不需要反向传播,只是一种静态属性
1.10 卷积神经网络示例
一个CNN的示例
- 第一层 卷积 + 池化
- 第二层 卷积 + 池化
- 全连接FC3 (普通的神经网络层)
- 全连接FC4(普通的神经网络层)
- softmax 输出
体会各个层的激活层大小,和参数大小
- 第一,池化层和最大池化层没有参数
- 第二卷积层的参数相对较少,前面课上我们提到过,其实许多参数都存在于神经网络的全连接层。
- 随着神经网络的加深,激活值尺寸会逐渐变小,如果激活值尺寸下降太快,也会影响神经网络性能。
1.11 为什么使用卷积?
卷积层的两个主要优势在于参数共享和稀疏连接
神经网络可以通过这两种机制减少参数,以便我们用更小的训练集来训练它,从而预防过度拟合。
卷积神经网络善于捕捉平移不变
参数共享
观察发现,特征检测如垂直边缘检测如果适用于图片的某个区域,那么它也可能适用于图片的其他区域。
稀疏连接
这个0是通过3×3的卷积计算得到的,它只依赖于这个3×3的输入的单元格,右边这个输出单元(元素0)仅与36个输入特征中9个相连接。而且其它像素值都不会对输出产生任影响,这就是稀疏连接的概念。