读书笔记--Deep Learning for Computer Vision with Python(第11章)

文章目录

  • 第十一章 CNNs
    • 1.理解卷积
      • 1.1 卷积VS互相关
      • 1.2 Kernels
      • 1.3 卷积
      • 1.4 卷积在深度学习中的作用
    • 2. CNN Building Blocks
      • 2.1 CONV
      • 2.2 Pooling层
      • 2.3 BN层
      • 2.4 DO层
    • 3. 常见网络构架
    • Rules of Thumb(ps.这是重点哦)

第十一章 CNNs

本书的前几章是关于机器学习的,所以在此不做前几章的笔记。

1.理解卷积

卷积无处不在,图像的模糊、平滑和边缘识别都是用的卷积;Photoshop的图像锐化也是用的卷积。卷积是计算机视觉和图像处理中最重要,最基础的东西(原文fundamental building-blocks
什么是卷积?
1.搞两个矩阵(dimensions相同)
2.把它们对应位置的元素乘起来(element-by-element)
3.把乘好的元素加起来

1.1 卷积VS互相关

二维图像数据 I 和 二维kernel K的卷积定义为:
卷积
然而,几乎所有的机器学习和深度学习库用简化的互相关函数(本书也是如此):
简化的互相关函数

1.2 Kernels

Kernels?kernels是啥?长啥样?
Kernel
上面是一个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层

举个例子一看便知:
读书笔记--Deep Learning for Computer Vision with Python(第11章)_第1张图片
现在网络中越来越普遍倾向于不使用Pooling层,用较大步长的CONV代替Pooling层

2.3 BN层

Batch Normalization

2.4 DO层

DO层主要是随机断开网络中前一层和下一层的连接,为了防止过拟合
读书笔记--Deep Learning for Computer Vision with Python(第11章)_第2张图片

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.这是重点哦)

  1. 输入到input层的图像应是方形的(32 X 32, 64 X 64, 96 X 96, 224 X 224, 227 X 227, 229 X 229)
  2. 经过第一层卷积操作后的输入层应该可以被2整除,以方便使用Pooling
  3. 通常情况下使用小点的kernel,如:3 X 3,5 X 5。如果输入图像的尺寸较大,可以将7 X 7,11 X 11这样较大的kernel用于第一个COVN层,但在此之后应减小kernel的尺寸
  4. CONV的步长可以选择S = 1,用Pooling来减小卷积尺寸
  5. 使用zero-padding保持CONV输出尺寸与原图像尺寸相同
  6. 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,学生党的福利
  1. DO层通常用于FC层之间

你可能感兴趣的:(读书笔记--Deep Learning for Computer Vision with Python(第11章))