本文是卷积神经网络的笔记。
1.0 重点
- 一般来说nC随着网络深度增加而增加,nH,nW随着网络深度增加而减小。
- 一般卷积到最后都会把(nH,nW,nC)的向量拉成(nH∗nW∗nC,1)的向量,然后使用SoftMax(多选一任务,如判断为0-9中哪个数字),或者使用Logistic(是否问题,如判断是否为猫)
-
参数共享:
- 它允许在整个输入值的多个位置使用特征检测器。
- 它允许梯度下降将许多参数设置为零,从而使得连接稀疏。(即在全联接神经网络中很多参数都会被设置为0)
-
稀疏连接:
- 下一层中的每个**只依赖于前一层的少量**(数据)。
1.1 计算机视觉
不同于之前的全链接神经网络,卷积神经网络可以减少参数数量。
1.2 边缘检测示例
- filter / kernel: 类似于卷积核
- 实现:
- python:
-forward
- tensorflow:
tf.nn.conv2d
- Keras:
Conv2D
- 例子:
- 垂直边缘检测Kernel:⎣⎡111000−1−1−1⎦⎤
- 如果输入图片为:(对应一个垂直边界,数值越大越亮)
⎣⎢⎢⎢⎢⎢⎢⎡101010101010101010101010101010101010000000000000000000⎦⎥⎥⎥⎥⎥⎥⎤
- 则输出为:
⎣⎢⎢⎡000030303030303030300000⎦⎥⎥⎤
1.3 更多边缘检测内容
- 水平边缘检测Kernel:⎣⎡10−110−110−1⎦⎤
符合这个模式的被称为正向边缘。
- 其他竖直边缘检测的Filter:
-
Sobel Filter
⎣⎡121000−1−2−1⎦⎤
-
Scharr Filter
⎣⎡3103000−3−10−3⎦⎤
1.4 Padding
- 卷积操作后的尺寸:
- 原图像: n×n
- Kernel: f×f
- 输出:(n−f+1)∗(n−f+1)
为了解决边缘数据丢失和尺寸变小的问题,我们采用Padding:
- Padding: p
- 输出:(n+2×p−f+1)∗(n+2×p−f+1)
Convolution的分类
-
"Valid" Convolution: 无Padding,输出为(n−f+1)∗(n−f+1)
-
"Same" Convolution: 有Padding,输出的尺寸和输入的尺寸一致。(n+2p−f+1)∗(n+2p−f+1)
- 所以此时Padding p=2f−1,所以Kernel基本上的尺寸f为奇数。
1.5 卷积步长
-
Stride:s
- 输出为[sn+2∗p−f+1]向下取整数。
Convolution in math textbook:
实际上我们用的是cross-correlation,尽管信息中我们出于习惯将其称为卷积。
在数学书中,Convolution需要取Kernel的镜像,如:
⎣⎡31−1409527⎦⎤
数学上之所以引入这个定义是可以了让卷积操作具有结合律。但实际上信息上我们不需要。
1.6 三维卷积
- 输入:n×n×nc, nc表示通道数/深度
-
nc′个卷积核:f×f×nc
- 输出:(n−f+1)×(n−f+1)×nc′
1.7 单层卷积网络
- 对卷积核i的输出之后加一个常数bi,之后再通过**函数得到一个输出,将nc′个输出叠加起来得到最后的结果。
【类比全联接神经网络】
- 练习:
- 10个3∗3∗3的卷积核有多少个参数?
-
10∗(3∗3∗3+1)=280 个参数。
记号
-
f[l]:第l层的Filter大小
-
p[l]:第l层的Paddingr大小
- 如果是
Same Padding
则p[l]=2f[l]−1
-
s[l]:第l层的Stride大小
-
第l层输入:nH[l−1]×nW[l−1]×nC[l−1]
-
第l层输出:nH[l]×nW[l]×nC[l]
nH[l]=⌊s[l]nH[l−1]+2×p[l]−f[l]+1⌋
nW[l]=⌊s[l]nW[l−1]+2×p[l]−f[l]+1⌋
-
第l层的filters个数: nC[l]
- 每个Filters的大小为f[l]×f[l]×nC[l−1]
-
单个样本的**输出:a[l],尺寸为nH[l]×nW[l]×nC[l]
-
将m个样本的输出A[l],尺寸为m×nH[l]×nW[l]×nC[l]
-
第l层卷积核参数总个数:f[l]×f[l]×nc[l−1]×nc[l]
-
第l层Bias的尺寸:(1,1,1,nc[l])
1.8 ⚠️ 简单卷积网络示例
一般来说nC随着网络深度增加而增加,nH,nW随着网络深度增加而减小。
这个例子过于简单,我们直接看1.10中的LeNet-5即可。
1.9 池化层
Max Pooling
- 一个f=2(尺寸2∗2),步长为2的例子。
- 基本原理
如果通过卷积提取到这个特征,则保留这个数据。
- 它没有什么需要学习的
- ⚠️ 尺寸计算:
类似于之前的卷积的计算,如果
- 输入尺寸为n∗n∗nc
- Kernel f∗f∗nc
- Padding p(很少用!)
- Stride s
- 输出尺寸为⌊sn+2∗p−f+1⌋×⌊sn+2∗p−f+1⌋∗nc
Average Pooling
一般在最后一层使用,如将一个7∗7∗1000的输出变成1∗1∗1000。
Pooling总结
- ⚠️ 没有需要学习的参数!!
- 常用的Hyperparameters:
- filter size: f
- stride: s
- Padding: p (用得很少!!)
- 选一种Pooling: Max / Average Pooling
- 最常用的Pooling是
- f=2,s=2,maxpool 等价于 nH/2,nW/2,nC′
1.10 卷积神经网络示例
- LeNet-5
两个卷积层,+Flatten(变成400*1的向量)+两个全联接+SoftMax(多选一)
1.11 为什么使用卷积?
- 卷积的好处:参数个数比较少
- 例子:(比较全连接神经网络和卷积神经网络的参数个数)
- 为什么卷积网络参数个数比较少?
-
权重共享(Parameter Sharing):一个训练好的kernel在一张图片的各个位置都有用。
-
稀疏连接(Sparsity of Connections):每一个输出都只和一小部分的输入有关。