共计 7095 个字符,预计需要花费 18 分钟才能阅读完成。
- 作者:韩信子 @ShowMeAI
- 教程地址:http://www.showmeai.tech/tutorials/35
- 本文地址:http://www.showmeai.tech/article-detail/221
- 申明:版权所有,转载请分割平台与作者并注明出处
珍藏 ShowMeAI 查看更多精彩内容
本系列为吴恩达老师《深度学习专项课程 (Deep Learning Specialization)》学习与总结整顿所得,对应的课程视频能够在 这里 查看。
引言
在 ShowMeAI 前一篇文章 AI 利用实际策略(下) 中咱们对以下内容进行了介绍:
- 谬误剖析(error analysis)
- 谬误标签状况及修改
- 数据分布和数据不匹配问题及解决办法
- 迁徙学习
- 多任务学习
- 端到端学习
本篇开始,咱们对吴恩达老师第 4 门课《Convolutional Neural Networks》(卷积神经网络)做总结梳理。内容次要笼罩卷积神经网络 (CNN) 的基本概念、模型和具体利用等。
1. 计算机视觉
计算机视觉 (Computer Vision) 的高速倒退标记着新型利用产生的可能,例如主动驾驶、人脸识别、发明新的艺术风格。人们对于计算机视觉的钻研也催生了很多计算机视觉与其余畛域的穿插成绩。如下是一些典型的计算机视觉场景利用场景:
前面局部 ShowMeAI 会依据吴恩达老师的课程给大家讲到以下 CV 利用:
- 图片分类(Image Classification)
- 指标检测(Object detection)
- 神经格调转换(Neural Style Transfer)
应用传统神经网络解决机器视觉面临的一个挑战是数据的输出可能会十分大。例如一张 \(1000 \times 1000 \times 3\) 的图片,神经网络输出层的维度将高达三百万,使得网络权重 \(W\) 十分宏大。这样会造成两个结果:
- 神经网络结构复杂,数据量绝对较少,容易呈现过拟合。
- 所需内存和计算量微小。
因而,个别的神经网络很难解决海量图像数据。解决这一问题的办法就是应用非凡构造的神经网络:卷积神经网络(Convolutional Neural Network, CNN)。
2. 卷积运算
后面的文章里讲到过,神经网络由浅层到深层,别离能够检测出不同档次的信息,在计算机视觉中咱们依靠深度卷积神经网络,来顺次学习了解图片的边缘特色、部分特色(例如眼睛、鼻子等),直至最初一层综合后面检测的特色来辨认整体图像内容。
卷积运算 (Convolutional Operation) 是卷积神经网络最根本的组成部分。咱们以 边缘检测 为例,来解释卷积是怎么运算的。
2.1 边缘检测
如下图所示,以人脸识别为例,神经网络由浅层到深层,别离能够检测出图片的边缘特色、部分特色(例如眼睛、鼻子等)、整体面部轮廓等。
图片最常做的边缘检测有两类:垂直边缘 (Vertical Edges) 检测 和程度边缘 (Horizontal Edges) 检测。
图片的边缘检测能够通过与相应滤波器进行卷积来实现。以 垂直边缘检测 为例,原始图片尺寸为 \(6 \times 6\),两头的矩阵被称作 滤波器(filter),尺寸为 \(3 \times 3\),卷积后失去的图片尺寸为 \(4 \times 4\),失去后果如下(数值示意灰度,以左上角和右下角的值为例):
上图只显示了卷积后的第一个值和最初一个值。卷积运算的求解过程是从左到右,由上到下,每次在原始图片矩阵中取与滤波器等同大小的一部分,每一部分中的值与滤波器中的值对应相乘后求和,将后果组成一个矩阵。
下图对应一个垂直边缘检测的例子:
如果将最左边的矩阵当作图像,那么两头一段亮一些的区域对应最右边的图像两头的垂直边缘。
这里有另一个卷积运算的动静的例子,不便了解:
图中的 *
示意卷积运算符号。在计算机中这个符号示意个别的乘法,而在不同的深度学习框架中,卷积操作的 API 定义可能不同:
- 在 Python 中,卷积用
conv_forward()
示意; - 在 Tensorflow 中,卷积用
tf.nn.conv2d()
示意; - 在 Keras 中,卷积用
Conv2D()
示意。
2.2 更多边缘检测的例子
如果将灰度图左右的色彩进行翻转,再与之前的滤波器进行卷积,失去的后果也有区别。理论利用中,这反映了由明变暗和由暗变明的两种突变形式。能够对输入图片取绝对值操作,以失去同样的后果。
垂直边缘检测滤波器 和程度边缘检测滤波器 如下所示,其余罕用的滤波器还有 Sobel 滤波器 和Scharr 滤波器,它们减少了两头行的权重,以进步后果的稳健性。
滤波器中的值还能够设置为参数,通过模型训练来失去。这样,神经网络应用反向流传算法能够学习到一些低级特色,从而实现对图片所有边缘特色的检测,而不仅限于垂直边缘和程度边缘。
3. 填充 padding
察看上述卷积图片,咱们假如输出图片的大小为 \(n \times n\),而滤波器的大小为 \(f \times f\) (留神 \( f\) 个别为奇数),则卷积后的输入图片大小为 \((n-f+1) \times (n-f+1)\)。
这样的解决会带来两个问题:
- 每次卷积运算后,输入图片的尺寸放大。
- 原始图片的角落、边缘区像素点在输入中采纳较少,输入图片失落边缘地位的很多信息。
为了解决这些问题,能够在进行卷积操作前,对原始图片在边界上进行填充(Padding),以减少矩阵的大小,保障输入的尺寸以及边缘地位信息的无效利用。咱们通常用 \(0\) 进行填充。
设每个方向扩大像素点数量为 \(p\),则填充后原始图片的大小为 \((n+2p) \times (n+2p)\),滤波器大小放弃 \(f \times f\) 不变,则输入图片大小为 \((n+2p-f+1) \times (n+2p-f+1)\)。
有两种对于 \(p\) 的设置是最常见的:
- Valid 卷积:不进行填充,间接卷积。后果大小为 \((n-f+1) \times (n-f+1)\)
- Same 卷积:进行填充,并保障卷积后后果大小与输出统一,此时 \(p = \frac{f-1}{2}\)
在计算机视觉畛域,\(f\) 通常为奇数。起因包含 Same 卷积中 \(p = \frac{f-1}{2}\) 能失去自然数后果,并且滤波器有一个便于示意其所在位置的中心点。
4. 卷积步长
卷积过程中,有时须要通过填充来防止信息损失,有时也须要通过设置 步长 (Stride) 来压缩一部分信息。
步长示意滤波器在原始图片的程度方向和垂直方向上每次挪动的间隔。之前,步长被默认为 1。而如果咱们 设置步长为 2 ,则卷积过程如下图所示:
设步长 stride 为 \(s\),padding 填充大小为 \(p\),输出图片大小为 \(n \times n\),滤波器大小为 \(f \times f\),则卷积后图片的尺寸为:
$$
\biggl\lfloor \frac{n+2p-f}{s}+1 \biggr\rfloor \times \biggl\lfloor \frac{n+2p-f}{s}+1 \biggr\rfloor
$$
上述公式中有一个向下取整的符号,用于解决商不为整数的状况。
咱们后面看到的「卷积」实际上是相互关 (cross-correlation),而非数学意义上的卷积。 真正的卷积操作在做元素乘积求和之前,要将滤波器沿程度和垂直轴翻转(相当于旋转 180 度)。
因为这种翻转对个别为程度或垂直对称的滤波器影响不大,依照 机器学习的常规,咱们通常不进行翻转操作,在简化代码的同时使神经网络可能失常工作。
5. 高维卷积
如果咱们想要对三通道的 RGB 图片进行卷积运算,那么其对应的滤波器组也同样是三通道的。过程是将每个单通道 \((R,G,B)\) 与对应的滤波器进行卷积运算求和,而后再将三个通道的和相加,将这 27 个乘积的和作为输入图片的一个像素值。
理论的计算过程也同样会滑动笼罩所有输出通道和图片全副输出像素,如下动图所示:
<center></center>
不同通道的滤波器能够不雷同。例如只检测 \(R\) 通道的垂直边缘,\(G\) 通道和 \(B\) 通道不进行边缘检测,则 \(G\) 通道和 \(B\) 通道的滤波器全副置零。
当输出有特定的高、宽和通道数时,滤波器能够有不同的高和宽,但通道数必须和输出统一。
如果想同时检测垂直和程度边缘,或者更多的边缘检测,能够减少更多的滤波器组。例如第 1 个滤波器组实现垂直边缘检测,第 2 个滤波器组实现程度边缘检测。
设输出图片的尺寸为 \(n \times n \times n_c\) (\( n_c\) 为通道数),滤波器尺寸为 \(f \times f \times n_c\),则卷积后的输入图片尺寸为 \((n-f+1) \times (n-f+1) \times n\prime_c\),\(n \prime_c\) 为滤波器组的个数。
如下动图为 2 个滤波器对输出进行卷积计算失去输入的过程。
6. 卷积神经网络单层构造
6.1 CNN 单层构造
卷积神经网络的单层构造如下所示:与下面提到的卷积过程相比拟,卷积神经网络的单层构造多了激活函数 (上图应用的 ReLU) 和偏置量 b;
比照规范神经网络:
$$Z^{[l]} = W^{[l]}A^{[l-1]}+b$$
$$A^{[l]} = g^{[l]}(Z^{[l]})$$
卷积神经网络把上式中 \(W^{[l]}\) 与 \(A^{[l-1]}\) 的乘积运算换成了卷积运算,滤波器的取值对应着权重 \(W^{[l]}\),激活函数抉择 ReLU。
咱们重点来看一下上图中参数的数目:每个滤波器组有 \(3 \times 3 \times 3 = 27\) 个参数,还有 1 个偏移量 b,则每个滤波器组有 \(27+1=28\) 个参数,两个滤波器组总共蕴含 \(28 \times 2 = 56\) 个参数。
而且大家会发现,一旦确定滤波器组,则参数数量就确定了,它与输出图片尺寸无关。大尺寸的图片也并不会在卷积层带来微小的参数量。
一张 \(1000 \times 1000 \times 3\) 的图片,规范神经网络输出层的维度将达到 3 百万,而在 CNN 中,参数数目只由滤波器组决定,数目相对来说要少得多,在如上的卷积神经网络层构造中,仍旧只须要 \(56\) 个参数。
6.2 CNN 标记符号梳理总结
为了更标准,咱们来约定一下 CNN 单层构造标记符号,设 \(l\) 层为卷积层:
- \(f^{[l]}\):滤波器的高(或宽)
- \(p^{[l]}\):填充长度
- \(s^{[l]}\):步长
- \(n^{[l]}_c\):滤波器组的数量
- 输出维度:\(n^{[l-1]}_H \times n^{[l-1]}_W \times n^{[l-1]}_c\)
其中 \(n^{[l-1]}_H\) 示意输出图片的高,\(n^{[l-1]}_W\) 示意输出图片的宽。之前的示例中输出图片的高和宽都雷同,然而理论中能够是不同的,咱们在这里加上下标予以辨别。
- 每个滤波器组的维度:\(f^{[l]} \times f^{[l]} \times n^{[l-1]}_c\)。其中 \(n^{[l-1]}_c\) 为输出图片通道数(也称深度)。
- 权重维度:\(f^{[l]} \times f^{[l]} \times n^{[l-1]}_c \times n^{[l]}_c\)
- 偏置维度:\(1 \times 1 \times 1 \times n^{[l]}_c\)
- 输入维度:\(n^{[l]}_H \times n^{[l]}_W \times n^{[l]}_c\)。
其中
$$
n^{[l]}_H = \biggl\lfloor \frac{n^{[l-1]}_H+2p^{[l]}-f^{[l]}}{s^{[l]}}+1 \biggr\rfloor
$$
$$
n^{[l]}_W = \biggl\lfloor \frac{n^{[l-1]}_W+2p^{[l]}-f^{[l]}}{s^{[l]}}+1 \biggr\rfloor
$$
对于 m 个样本的向量化运算,相应的输入维度为:
$$
m \times n^{[l]}_H \times n^{[l]}_W \times n^{[l]}_c
$$
7. 简略卷积网络示例
下图为 1 个简略的 CNN 模型,咱们来剖析一下它的构造:
图示网络中,\(a^{[3]}\) 的维度为 \(7 \times 7 \times 40\),将其平展成 1960 维的单列模式,而后连贯最初的输入层。输入层能够是一个神经元,即二元分类(logistic);也能够是多个神经元,即多分类(Softmax)。最初失去预测输入 \(\hat y\)。
在典型的 CNN 构造里,随着神经网络计算深度一直加深,输出的高度和宽度 \(n^{[l]}_H\)、\(n^{[l]}_W\) 个别逐步减小,而 \(n^{[l]}_c\) 在减少。
卷积神经网络蕴含有三种典型的层构造:
- 卷积层(Convolution layer)
- 池化层(Pooling layer,也有译作「会合层」)
- 全连贯层(Fully Connected layer)
仅用卷积层也有可能构建出很好的神经网络,但很多神经网络还是会增加池化层和全连贯层,它们更容易设计。
8. 池化层
很多 CNN 中都会蕴含 Pooling layers 池化层,池化层的作用是缩减模型的大小,进步计算速度,同时减小噪声进步所提取特色的稳健性。
8.1 最大池化 Max Pooling
有不同的池化操作,比拟常见的一种叫做 最大池化(Max Pooling)。将输出拆分成不同的区域,输入的每个元素都是对应区域中元素的最大值,如下图所示:
类比卷积过程,上图所示的池化过程中相当于应用了一个大小 \(f=2\) 的滤波器,且池化步长 \(s=2\)。卷积过程中的几个计算大小的公式也都实用于池化过程。如果有多个通道,那么就对每个通道别离执行计算过程。
对最大池化的一种直观解释是,元素值较大可能意味着池化过程之前的卷积过程提取到了某些特定的特色,池化过程中的最大化操作使得只有在一个区域内提取到某个特色,它都会保留在最大池化的输入中。然而,没有足够的证据证实这种直观解释的正确性,而最大池化被应用的次要起因是它在很多试验中的成果都很好。
8.2 均匀池化 Average Pooling
还有一种大家可能会见到的池化过程是 均匀池化(Average Pooling),它会对对应区域求平均值输入:
8.3 池化层总结
池化过程的特点之一是,它有一组超参数,然而并没有参数须要学习。池化过程的超参数包含滤波器的大小 \(f\)、步长 \(s\),以及选用最大池化还是均匀池化。而填充 \(p\) 则很少用到。
池化过程的输出维度为:\(n_H \times n_W \times n_c\)
输入维度为:\(\biggl\lfloor \frac{n_H-f}{s}+1 \biggr\rfloor \times \biggl\lfloor \frac{n_W-f}{s}+1 \biggr\rfloor \times n_c\)
9. 卷积神经网络示例
在计算神经网络的层数时,通常只统计具备权重和参数的层,因而池化层通常和之前的卷积层独特计为一层。图中的 FC3 和 FC4 为全连贯层,与规范的神经网络构造统一。整个神经网络各层的尺寸与参数如下表所示:
档次 | 输入维度 | 输入大小 | 参数量 |
---|---|---|---|
Input | (32, 32, 3) | 3072 | 0 |
CONV1(f=5, s=1) | (28, 28, 6) | 4704 | 158 |
POOL1 | (14, 14, 6) | 1176 | 0 |
CONV2(f=5, s=1) | (10, 10, 16) | 1600 | 416 |
POOL2 | (5, 5, 16) | 400 | 0 |
FC3 | (120, 1) | 120 | 48120 |
FC4 | (84, 1) | 84 | 10164 |
Softmax | (10, 1) | 10 | 850 |
举荐大家通过 直观感触卷积神经网络的网站 对 CNN 进行调试和可视化。
10. 应用卷积的起因
依据后面的常识学习,大家晓得,CNN 相比于规范神经网络,能更好地适应高维度的大输出,其卷积设计无效地缩小了 CNN 的参数数量。总结如下:
- 参数共享 (Parameter sharing):特色检测如果实用于图片的某个区域,那么它也可能实用于图片的其余区域。即在卷积过程中,不论输出有多大,一个特色探测器(滤波器) 就能对整个输出的某一特色进行探测。
- 稠密连贯(Sparsity of connections):在每一层中,因为滤波器的尺寸限度,输出和输入之间的连贯是稠密的,每个输入值只取决于输出在部分的一小部分值。
池化的设计,在卷积之后很好地聚合了特色,通过降维来缩小运算量。
另外,吴恩达老师也阐明了,因为 CNN 参数数量较小,所需的训练样本就绝对较少,因而在肯定水平上不容易产生过拟合景象。并且 CNN 比拟善于捕获区域地位偏移。即进行物体检测时,不太受物体在图片中地位的影响,减少检测的准确性和零碎的健壮性。
参考资料
- 直观感触卷积神经网络的网站
ShowMeAI 系列教程举荐
- 图解 Python 编程:从入门到精通系列教程
- 图解数据分析:从入门到精通系列教程
- 图解 AI 数学根底:从入门到精通系列教程
- 图解大数据技术:从入门到精通系列教程
- 图解机器学习算法:从入门到精通系列教程
- 机器学习实战:手把手教你玩转机器学习系列
- 深度学习教程 | 吴恩达专项课程 · 全套笔记解读
举荐文章
- 深度学习教程 | 深度学习概论
- 深度学习教程 | 神经网络根底
- 深度学习教程 | 浅层神经网络
- 深度学习教程 | 深层神经网络
- 深度学习教程 | 深度学习的实用层面
- 深度学习教程 | 神经网络优化算法
- 深度学习教程 | 网络优化:超参数调优、正则化、批归一化和程序框架
- 深度学习教程 | AI 利用实际策略(上)
- 深度学习教程 | AI 利用实际策略(下)
- 深度学习教程 | 卷积神经网络解读
- 深度学习教程 | 经典 CNN 网络实例详解
- 深度学习教程 | CNN 利用:指标检测
- 深度学习教程 | CNN 利用:人脸识别和神经格调转换
- 深度学习教程 | 序列模型与 RNN 网络
- 深度学习教程 | 自然语言解决与词嵌入
- 深度学习教程 | Seq2seq 序列模型和注意力机制