文章目录
第十一章 CNNs
本书的前几章是关于机器学习的,所以在此不做前几章的笔记。
1.理解卷积
卷积无处不在,图像的模糊、平滑和边缘识别都是用的卷积;Photoshop的图像锐化也是用的卷积。卷积是计算机视觉和图像处理中最重要,最基础的东西(原文fundamental building-blocks)
什么是卷积?
1.搞两个矩阵(dimensions相同)
2.把它们对应位置的元素乘起来(element-by-element)
3.把乘好的元素加起来
1.1 卷积VS互相关
二维图像数据 I 和 二维kernel K的卷积定义为:
然而,几乎所有的机器学习和深度学习库用简化的互相关函数(本书也是如此):
1.2 Kernels
Kernels?kernels是啥?长啥样?
上面是一个3 X 3 的kernel。通常情况下我们用方形的Kernel(这样我们能够利用优化的线性代数库,这些库在方形矩阵上运行效率最高),并且要是奇数的(保证在内核的中心坐标是整数)。
如果M和N都是奇数整数,kernels 可以是任意的M X N大小。
1.3 卷积
在图像处理中,卷积需要三个参数:
1.输入图像
2.应用到图像上的核矩阵
3.存储卷积后数据的图像
卷积步骤:
1.在原始图像中选出(x, y)坐标
2.将卷积核的中心对应在(x, y)坐标上
3.将原始图像和卷积核对应的部分做矩阵的点乘(对应位置的点相乘),乘完之后再将乘积相加
4.将相加的值存储在输出图像的(x, y)坐标处(而非原图像)
给出一个例子:
1.矩阵点乘
2.乘积相加
132就是卷积后的值
1.4 卷积在深度学习中的作用
通过应用卷积,非线性激活函数,池化和反向传播,CNN能够学习到网络较低层中边缘和类似blob结构的滤波器,然后将这些滤波器用作“构建块” ,最终在网络的更深层中检测高级物体(例如,面部,猫,狗等)。
2. CNN Building Blocks
常见的网络层:
- Convolutional(CONV) 卷积层
- Activation 激活层
- Pooling(POOL) 池化层
- Fully-connected(FC) 全连接层
- Batch normalization(BN)
- Dropout(DO)
2.1 CONV
参数包括:depth, stride和padding
stride是kernel每次移动的步长:大步长会使输出的数据量小,小步长会使输出数据量大。减小数据用大步长,想让网络多学特征用小步长;
padding是为了使输出尺寸和输入尺寸保持一致而对图像进行填充,如果没有填充输入体积的空间尺寸会减小太快,我们将无法训练深度网络(因为输入体积太小而无法从中学习任何有用的特征)。
记忆下面的公式:
1)假设输入:W_in * H_in * D_in
2)需要四个参数:
- kernel的个数K(控制输出的深度)
- kernel的大小F(kernel的大小是F*F)
- 步长S
- 填充量P
3)CONV的输出是:W_out * H_out * D_out - W_out = ((W_in - F + 2P) / S) + 1
- H_out = ((H_in - F + 2P) / S) + 1
- D_out = K
2.2 Pooling层
举个例子一看便知:
现在网络中越来越普遍倾向于不使用Pooling层,用较大步长的CONV代替Pooling层
2.3 BN层
2.4 DO层
DO层主要是随机断开网络中前一层和下一层的连接,为了防止过拟合
3. 常见网络构架
- CNN通用结构
INPUT => [[CONV => RELU]*N => POOL?]*M => [FC => RELU]*K => FC
?代表可选,*代表重复
0 <= N <= 3
M >= 0
0 <= K <= 2 - 一个非常浅的CNN网络(shallow CNN)
INPUT => CONV => RELU => FC
- 类AlexNet
INPUT => [CONV => RELU => POOL] * 2 => [CONV => RELU] * 3 => POOL => [FC => RELU => DO] * 2 => SOFTMAX
- VGGNet
INPUT => [CONV => RELU] * 2 => POOL => [CONV => RELU] * 2 => POOL => [CONV => RELU] * 3 => POOL => [CONV => RELU] * 3 => POOL => [FC => RELU => DO] * 2 => SOFTMAX
Rules of Thumb(ps.这是重点哦)
- 输入到input层的图像应是方形的(32 X 32, 64 X 64, 96 X 96, 224 X 224, 227 X 227, 229 X 229)
- 经过第一层卷积操作后的输入层应该可以被2整除,以方便使用Pooling
- 通常情况下使用小点的kernel,如:3 X 3,5 X 5。如果输入图像的尺寸较大,可以将7 X 7,11 X 11这样较大的kernel用于第一个COVN层,但在此之后应减小kernel的尺寸
- CONV的步长可以选择S = 1,用Pooling来减小卷积尺寸
- 使用zero-padding保持CONV输出尺寸与原图像尺寸相同
- BN层虽然会增加训练网络的时间,但是容易调整其他参数,因此建议所有的网络都使用BN层
INPUT => CONV => RELU => BN => FC
INPUT => [CONV => RELU => BN => POOL] * 2 => FC => RELU => BN => FC
NPUT => [CONV => RELU => BN => CONV => RELU => BN => POOL] * 3 => [FC => RELU => BN] * 2 => FC
- 减小时间的方法:Google免费GPU,学生党的福利
- DO层通常用于FC层之间