提交 52ee39d1 编写于 作者: W wizardforcel

段首不要有空格

上级 8348802d
......@@ -2,37 +2,37 @@
# 第13章 卷积神经网络
尽管IBM的深蓝超级计算机在1996年击败了国际象棋世界冠军Garry Kasparvo,直到近几年计算机都不能可靠地完成一些看起来较为复杂的任务,比如判别照片中是否有狗以及识别语音。为什么这些任务对于人类而言如此简单?答案在于感知主要发生在我们意识领域之外,在我们大脑中的专门视觉,听觉和其他感官模块内。当感官信息达到我们的意识时,它已经被装饰了高级特征;例如,当你看着一只可爱的小狗的照片时,你不能选择不看这只小狗,或不注意它的可爱。你也不能解释你如何认出这是一只可爱的小狗,这对你来说很明显。因此,我们不能相信我们的主观经验:感知并不是微不足道的,理解它我们必须看看感官模块是如何工作的。
​尽管IBM的深蓝超级计算机在1996年击败了国际象棋世界冠军Garry Kasparvo,直到近几年计算机都不能可靠地完成一些看起来较为复杂的任务,比如判别照片中是否有狗以及识别语音。为什么这些任务对于人类而言如此简单?答案在于感知主要发生在我们意识领域之外,在我们大脑中的专门视觉,听觉和其他感官模块内。当感官信息达到我们的意识时,它已经被装饰了高级特征;例如,当你看着一只可爱的小狗的照片时,你不能选择不看这只小狗,或不注意它的可爱。你也不能解释你如何认出这是一只可爱的小狗,这对你来说很明显。因此,我们不能相信我们的主观经验:感知并不是微不足道的,理解它我们必须看看感官模块是如何工作的。
卷积神经网络(CNNs)是从大脑视觉皮层的研究中出现的,自20世纪80年代以来它们一直用于图像识别。在过去的几年里,由于计算能力的增加,可用训练数据的数量以及第11章介绍的训练深度网络的技巧,CNN致力于在某些复杂的视觉任务中做出超出人类的表现。他们使图像搜索服务,自动驾驶汽车,视频自动分类系统等变得强大。此外,CNN并不局限于视觉感知:它们在其他任务中也很成功,如语音识别或自然语言处理(NLP); 然而,我们现在将专注于视觉应用。
​卷积神经网络(CNNs)是从大脑视觉皮层的研究中出现的,自20世纪80年代以来它们一直用于图像识别。在过去的几年里,由于计算能力的增加,可用训练数据的数量以及第11章介绍的训练深度网络的技巧,CNN致力于在某些复杂的视觉任务中做出超出人类的表现。他们使图像搜索服务,自动驾驶汽车,视频自动分类系统等变得强大。此外,CNN并不局限于视觉感知:它们在其他任务中也很成功,如语音识别或自然语言处理(NLP); 然而,我们现在将专注于视觉应用。
在本章中,我们将介绍CNN的来源,构建它们模块的外观以及如何使用TensorFlow实现它们。然后我们将介绍一些最好的CNN架构。
​在本章中,我们将介绍CNN的来源,构建它们模块的外观以及如何使用TensorFlow实现它们。然后我们将介绍一些最好的CNN架构。
### **The Architecture of the Visual Cortex(视觉皮层的结构)**
David H.Hubel和Torsten Wiesel在1958年和1959年对猫进行了一系列实验(以及几年后在猴子上的实验),对视觉皮层的结构提供了重要的见解(1981年作者因此获得了诺贝尔生理和医学奖)。具体来说,他们发现视皮层中的许多神经元有一个小的局部感受野,这意味着它们只对位于视野中有限的一部分区域的视觉刺激起作用(见图13-1,五个神经元的局部感受野由虚线圆圈表示)。不同神经元的感受野可能重叠,并且它们一起平铺了整个视野。此外,作者表明,一些神经元只对水平线方向的图像作出反应,而另一些神经元只对不同方向的线作出反应(两个神经元可能具有相同的感受野,但对不同方向的线作出反应)。他们还注意到一些神经元具有较大的感受野,并且它们对较复杂的模式作出反应,这些模式是较低层模式的组合。这些观察结果让我们想到:更高级别的神经元是基于相邻低级神经元的输出(在图13-1中,请注意,每个神经元只与来自前一层的少数神经元相连)。这个强大的结构能够检测视野中任何区域的各种复杂图案。
​David H.Hubel和Torsten Wiesel在1958年和1959年对猫进行了一系列实验(以及几年后在猴子上的实验),对视觉皮层的结构提供了重要的见解(1981年作者因此获得了诺贝尔生理和医学奖)。具体来说,他们发现视皮层中的许多神经元有一个小的局部感受野,这意味着它们只对位于视野中有限的一部分区域的视觉刺激起作用(见图13-1,五个神经元的局部感受野由虚线圆圈表示)。不同神经元的感受野可能重叠,并且它们一起平铺了整个视野。此外,作者表明,一些神经元只对水平线方向的图像作出反应,而另一些神经元只对不同方向的线作出反应(两个神经元可能具有相同的感受野,但对不同方向的线作出反应)。他们还注意到一些神经元具有较大的感受野,并且它们对较复杂的模式作出反应,这些模式是较低层模式的组合。这些观察结果让我们想到:更高级别的神经元是基于相邻低级神经元的输出(在图13-1中,请注意,每个神经元只与来自前一层的少数神经元相连)。这个强大的结构能够检测视野中任何区域的各种复杂图案。
这些对视觉皮层的研究启发了1980年推出的新认知机(neocognitron),后者逐渐演变为我们现在称之为卷积神经网络。一个重要的里程碑是Yann LeCun,LéonBottou,Yoshua Bengio和Patrick Haffner于1998年发表的一篇论文,该论文引入了着名的LeNet-5架构,广泛用于识别手写支票号码。这个架构有一些你已经知道的构建块,比如完全连接层和Sigmoid激活函数,但是它还引入了两个新的构建块:卷积层和池化层。现在我们来看看他们。
​这些对视觉皮层的研究启发了1980年推出的新认知机(neocognitron),后者逐渐演变为我们现在称之为卷积神经网络。一个重要的里程碑是Yann LeCun,LéonBottou,Yoshua Bengio和Patrick Haffner于1998年发表的一篇论文,该论文引入了着名的LeNet-5架构,广泛用于识别手写支票号码。这个架构有一些你已经知道的构建块,比如完全连接层和Sigmoid激活函数,但是它还引入了两个新的构建块:卷积层和池化层。现在我们来看看他们。
### **Convolutional Layer(卷积层)**
CNN最重要的组成部分是卷积层:第一卷积层中的神经元不是连接到输入图像中的每一个像素(就像它们在前面的章节中那样),而是仅仅连接到它们的局部感受野中的像素(参见图13-2)。 进而,第二卷积层中的每个神经元只与位于第一层中的小矩形内的神经元连接。 这种架构允许网络专注于第一隐藏层中的低级特征,然后将其组装成下一隐藏层中的高级特征,等等。 这种层次结构在现实世界的图像中是很常见的,这也是CNN在图像识别方面效果很好的原因之一。
​CNN最重要的组成部分是卷积层:第一卷积层中的神经元不是连接到输入图像中的每一个像素(就像它们在前面的章节中那样),而是仅仅连接到它们的局部感受野中的像素(参见图13-2)。 进而,第二卷积层中的每个神经元只与位于第一层中的小矩形内的神经元连接。 这种架构允许网络专注于第一隐藏层中的低级特征,然后将其组装成下一隐藏层中的高级特征,等等。 这种层次结构在现实世界的图像中是很常见的,这也是CNN在图像识别方面效果很好的原因之一。
![](https://img-blog.csdn.net/20171108161737493?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWtvbl93YW5nX2hrYnU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
**到目前为止,我们所看到的所有多层神经网络都有由一长串神经元组成的层,在输入到神经网络之前我们必须将输入图像压缩成1D。 现在,每个图层都以2D表示,这使得神经元与其相应的输入进行匹配变得更加容易。**
**到目前为止,我们所看到的所有多层神经网络都有由一长串神经元组成的层,在输入到神经网络之前我们必须将输入图像压缩成1D。 现在,每个图层都以2D表示,这使得神经元与其相应的输入进行匹配变得更加容易。**
位于给定层的第i行第j列的神经元连接到位于前一层中的神经元的输出的第i行到第![](https://img-blog.csdn.net/20171108162635570)行,第j列到第![](https://img-blog.csdn.net/20171108162652320)列.fh和fw是局部感受野的高度和宽度(见图13-3)。 为了使图层具有与前一图层相同的高度和宽度,通常在输入周围添加零,如图所示。 这被称为零填充.
​位于给定层的第i行第j列的神经元连接到位于前一层中的神经元的输出的第i行到第![](https://img-blog.csdn.net/20171108162635570)行,第j列到第![](https://img-blog.csdn.net/20171108162652320)列.fh和fw是局部感受野的高度和宽度(见图13-3)。 为了使图层具有与前一图层相同的高度和宽度,通常在输入周围添加零,如图所示。 这被称为零填充.
![](https://img-blog.csdn.net/20171108162911484)
如图13-4所示,通过将局部感受野隔开,还可以将较大的输入层连接到更小的层。 两个连续的感受野之间的距离被称为步幅。 在图中,一个5×7的输入层(加零填充)连接到一个3×4层,使用3×3的卷积核和一个步幅为2(在这个例子中,步幅在两个方向是相同的,但是它并不一定总是如此)。 位于上层第i行第j列的神经元与位于前一层中的神经元的输出连接的第![](https://img-blog.csdn.net/20171108173747363)至![](https://img-blog.csdn.net/20171108173754717)行,第![](https://img-blog.csdn.net/20171108173803989)列, Sh和Sw是垂直和水平的步幅。
​如图13-4所示,通过将局部感受野隔开,还可以将较大的输入层连接到更小的层。 两个连续的感受野之间的距离被称为步幅。 在图中,一个5×7的输入层(加零填充)连接到一个3×4层,使用3×3的卷积核和一个步幅为2(在这个例子中,步幅在两个方向是相同的,但是它并不一定总是如此)。 位于上层第i行第j列的神经元与位于前一层中的神经元的输出连接的第![](https://img-blog.csdn.net/20171108173747363)至![](https://img-blog.csdn.net/20171108173754717)行,第![](https://img-blog.csdn.net/20171108173803989)列, Sh和Sw是垂直和水平的步幅。
![](https://img-blog.csdn.net/20171108173911213?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWtvbl93YW5nX2hrYnU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
......@@ -42,9 +42,9 @@
![](https://img-blog.csdn.net/20171109092053104?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWtvbl93YW5nX2hrYnU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
神经元的权重可以表示为局部感受野大小的小图像。 例如,图13-5显示了两个可能的权重集,称为flters(或卷积核)。第一个表示为中间有一条垂直的白线的黑色正方形(除了中间一列外,这是一个充满0的7×7矩阵,除了中央垂直线是1)。 使用这些权重的神经元会忽略除了中央垂直线以外感受野的一切(因为除位于中央垂直线以外,所有的输入都将乘0)。第二个卷积核是一个黑色的正方形,中间有一条水平的白线。 再一次,使用这些权重的神经元将忽略除了中心水平线之外的局部感受野中的一切。
​神经元的权重可以表示为局部感受野大小的小图像。 例如,图13-5显示了两个可能的权重集,称为flters(或卷积核)。第一个表示为中间有一条垂直的白线的黑色正方形(除了中间一列外,这是一个充满0的7×7矩阵,除了中央垂直线是1)。 使用这些权重的神经元会忽略除了中央垂直线以外感受野的一切(因为除位于中央垂直线以外,所有的输入都将乘0)。第二个卷积核是一个黑色的正方形,中间有一条水平的白线。 再一次,使用这些权重的神经元将忽略除了中心水平线之外的局部感受野中的一切。
现在,如果一个图层中的所有神经元都使用相同的垂直线卷积核(以及相同的偏置项),并且将网络输入到图13-5(底部图像)中所示的输入图像,则该图层将输出左上图像。 请注意,垂直的白线得到增强,其余的变得模糊。 类似地,如果所有的神经元都使用水平线卷积核,右上角的图像就是你所得到的。 注意到水平的白线得到增强,其余的则被模糊了。因此,使用相同卷积和的一个充满神经元的图层将为您提供一个特征映射,该特征映射突出显示图像中与卷积和最相似的区域。 在训练过程中,CNN为其任务找到最有用的卷积和,并学习将它们组合成更复杂的模式(例如,交叉是图像中垂直卷积和和水平卷积和都激活的区域)。
​现在,如果一个图层中的所有神经元都使用相同的垂直线卷积核(以及相同的偏置项),并且将网络输入到图13-5(底部图像)中所示的输入图像,则该图层将输出左上图像。 请注意,垂直的白线得到增强,其余的变得模糊。 类似地,如果所有的神经元都使用水平线卷积核,右上角的图像就是你所得到的。 注意到水平的白线得到增强,其余的则被模糊了。因此,使用相同卷积和的一个充满神经元的图层将为您提供一个特征映射,该特征映射突出显示图像中与卷积和最相似的区域。 在训练过程中,CNN为其任务找到最有用的卷积和,并学习将它们组合成更复杂的模式(例如,交叉是图像中垂直卷积和和水平卷积和都激活的区域)。
......@@ -52,15 +52,15 @@
![](https://img-blog.csdn.net/20171109094334211?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWtvbl93YW5nX2hrYnU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
到目前为止,为了简单起见,我们已经将每个卷积层表示为一个薄的二维层,但是实际上它是由几个相同大小的特征映射组成的,所以使用3D图表示其会更加准确(见图13-6)。 在一个特征映射中,所有神经元共享相同的参数(权值共享)(权重和偏置),但是不同的特征映射可能具有不同的参数。 神经元的感受野与前面描述的相同,但是它延伸到所有先前的层的特征映射。 简而言之,卷积层同时对其输入应用多个卷积核,使其能够检测输入中的任何位置的多个特征。
​到目前为止,为了简单起见,我们已经将每个卷积层表示为一个薄的二维层,但是实际上它是由几个相同大小的特征映射组成的,所以使用3D图表示其会更加准确(见图13-6)。 在一个特征映射中,所有神经元共享相同的参数(权值共享)(权重和偏置),但是不同的特征映射可能具有不同的参数。 神经元的感受野与前面描述的相同,但是它延伸到所有先前的层的特征映射。 简而言之,卷积层同时对其输入应用多个卷积核,使其能够检测输入中的任何位置的多个特征。
**事实上,特征地图中的所有神经元共享相同的参数会显着减少模型中的参数数量,但最重要的是,一旦CNN学会识别一个位置的模式,就可以在任何其他位置识别它。 相比之下,一旦一个常规DNN学会识别一个位置的模式,它只能在该特定位置识别它。**
**事实上,特征地图中的所有神经元共享相同的参数会显着减少模型中的参数数量,但最重要的是,一旦CNN学会识别一个位置的模式,就可以在任何其他位置识别它。 相比之下,一旦一个常规DNN学会识别一个位置的模式,它只能在该特定位置识别它。**
而且,输入图像也由多个子图层组成:每个颜色通道一个。 通常有三种:红色,绿色和蓝色(RGB)。 灰度图像只有一个通道,但是一些图像可能更多 - 例如捕捉额外光频(如红外线)的卫星图像。
​而且,输入图像也由多个子图层组成:每个颜色通道一个。 通常有三种:红色,绿色和蓝色(RGB)。 灰度图像只有一个通道,但是一些图像可能更多 - 例如捕捉额外光频(如红外线)的卫星图像。
具体地,位于给定卷积层L中的特征映射k的i行,j列中的神经元连接到前一层(L-1)位于![](https://img-blog.csdn.net/20171109144341193)行,![](https://img-blog.csdn.net/20171109144349090)列的神经元的输出.请注意,位于同一行第i列和第j列但位于不同特征映射中的所有神经元都连接到上一层中完全相同神经元的输出。
​具体地,位于给定卷积层L中的特征映射k的i行,j列中的神经元连接到前一层(L-1)位于![](https://img-blog.csdn.net/20171109144341193)行,![](https://img-blog.csdn.net/20171109144349090)列的神经元的输出.请注意,位于同一行第i列和第j列但位于不同特征映射中的所有神经元都连接到上一层中完全相同神经元的输出。
公式13-1在一个总结前面解释的大的数学公式:它展示了如何计算卷积层中给定神经元的输出。它是计算所有投入的加权总并且加上偏置。
​公式13-1在一个总结前面解释的大的数学公式:它展示了如何计算卷积层中给定神经元的输出。它是计算所有投入的加权总并且加上偏置。
![](https://img-blog.csdn.net/20171109145639661?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWtvbl93YW5nX2hrYnU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
......@@ -78,7 +78,7 @@
### TensorFlow Implementation (TensorFlow实现)
在Tensorflow中,每个输入图像的通常被表示为三维张量![](https://img-blog.csdn.net/20171109152735613)。 一个min-batch被表示为四维张量![](https://img-blog.csdn.net/20171109152745225)。 卷积层的权重被表示为四维张量![](https://img-blog.csdn.net/20171109152752376)。 卷积层的偏差项简单地表示为一维形状的张量![](https://img-blog.csdn.net/20171109152758574)。我们来看一个简单的例子。 下面的代码使用**Scikit-Learn****load_sample_images()**(加载两个彩色图像,一个中国庙宇,另一个是一朵花)加载两个样本图像。 然后创建两个7×7的卷积核(一个中间是垂直的白线,另一个是水平的白线),并将他们应用到两张图形中,使用TensorFlow的**conv2d()**函数构建的卷积图层(使用零填充 且步幅为2)。 最后,绘制其中一个结果特征映射(类似于图13-5中的右上图)。
​在Tensorflow中,每个输入图像的通常被表示为三维张量![](https://img-blog.csdn.net/20171109152735613)。 一个min-batch被表示为四维张量![](https://img-blog.csdn.net/20171109152745225)。 卷积层的权重被表示为四维张量![](https://img-blog.csdn.net/20171109152752376)。 卷积层的偏差项简单地表示为一维形状的张量![](https://img-blog.csdn.net/20171109152758574)。我们来看一个简单的例子。 下面的代码使用**Scikit-Learn****load_sample_images()**(加载两个彩色图像,一个中国庙宇,另一个是一朵花)加载两个样本图像。 然后创建两个7×7的卷积核(一个中间是垂直的白线,另一个是水平的白线),并将他们应用到两张图形中,使用TensorFlow的**conv2d()**函数构建的卷积图层(使用零填充 且步幅为2)。 最后,绘制其中一个结果特征映射(类似于图13-5中的右上图)。
```python
from sklearn.datasets import load_sample_image
......@@ -127,27 +127,27 @@ if __name__ == '__main__':
### **Memory Requirements (内存需求)**
CNN的另一个问题是卷积层需要大量的RAM,特别是在训练期间,因为反向传播需要在正向传递期间计算的所有中间值。
​CNN的另一个问题是卷积层需要大量的RAM,特别是在训练期间,因为反向传播需要在正向传递期间计算的所有中间值。
例如,考虑具有5×5卷积核的卷积层,输出200个尺寸为150×100的特征映射,步长为1,使用SAME padding。 如果输入是150×100 RGB图像(三个通道),则参数的数量是(5×5×3 + 1)×200 = 15,200(+1对应于偏置项),这跟全连接层比较是相当小的.(具有150×100神经元的全连接层,每个连接到所有150×100×3输入,将具有150 ^ 2×100 ^ 2×3 = 675,000,000个参数!)然而,200个特征映射中的每一个包含150×100个神经元,并且这些神经元中的每一个都需要计算其5×5×3 = 75个输入的权重和:总共2.25亿次浮点乘法。不像完全连接的层那么糟糕,但仍然是计算密集型的。 而且,如果使用32位浮点数来表示特征映射,则卷积层的输出将占用RAM的200×150×100×32 = 9600万位(大约11.4MB)。 这只是一个例子! 如果培训批次包含100个实例,则该层将占用超过1 GB的RAM!
​例如,考虑具有5×5卷积核的卷积层,输出200个尺寸为150×100的特征映射,步长为1,使用SAME padding。 如果输入是150×100 RGB图像(三个通道),则参数的数量是(5×5×3 + 1)×200 = 15,200(+1对应于偏置项),这跟全连接层比较是相当小的.(具有150×100神经元的全连接层,每个连接到所有150×100×3输入,将具有150 ^ 2×100 ^ 2×3 = 675,000,000个参数!)然而,200个特征映射中的每一个包含150×100个神经元,并且这些神经元中的每一个都需要计算其5×5×3 = 75个输入的权重和:总共2.25亿次浮点乘法。不像完全连接的层那么糟糕,但仍然是计算密集型的。 而且,如果使用32位浮点数来表示特征映射,则卷积层的输出将占用RAM的200×150×100×32 = 9600万位(大约11.4MB)。 这只是一个例子! 如果培训批次包含100个实例,则该层将占用超过1 GB的RAM!
在推理过程中(即对新实例进行预测时),一旦下一层计算完毕,一层所占用的RAM就可以被释放,因此只需要两个连续层所需的RAM数量。 但是在训练期间,在正向传递期间计算的所有内容都需要被保留用于反向传递,所以所需的RAM量(至少)是所有层所需的RAM总量。
​在推理过程中(即对新实例进行预测时),一旦下一层计算完毕,一层所占用的RAM就可以被释放,因此只需要两个连续层所需的RAM数量。 但是在训练期间,在正向传递期间计算的所有内容都需要被保留用于反向传递,所以所需的RAM量(至少)是所有层所需的RAM总量。
**如果由于内存不足错误导致培训崩溃,则可以尝试减少小批量大小。 或者,您可以尝试使用步幅降低维度,或者删除几个图层。 或者你可以尝试使用16位浮点数而不是32位浮点数。 或者你可以在多个设备上分发CNN。**
**如果由于内存不足错误导致培训崩溃,则可以尝试减少小批量大小。 或者,您可以尝试使用步幅降低维度,或者删除几个图层。 或者你可以尝试使用16位浮点数而不是32位浮点数。 或者你可以在多个设备上分发CNN。**
### **Pooling Layer (池化层)**
一旦你理解了卷积层是如何工作的,池化层很容易掌握。 他们的目标是对输入图像进行二次抽样(即收缩)以减少计算负担,内存使用量和参数数量(从而限制过度拟合的风险)。 减少输入图像的大小也使得神经网络容忍一点点的图像变换(位置不变)。
​一旦你理解了卷积层是如何工作的,池化层很容易掌握。 他们的目标是对输入图像进行二次抽样(即收缩)以减少计算负担,内存使用量和参数数量(从而限制过度拟合的风险)。 减少输入图像的大小也使得神经网络容忍一点点的图像变换(位置不变)。
就像在卷积图层中一样,池化层中的每个神经元都连接到前一层中有限数量的神经元的输出,位于一个小的矩形感受野内。 您必须像以前一样定义其大小,跨度和填充类型。 但是,汇集的神经元没有权重; 它所做的只是使用聚合函数(如最大值或平均值)来聚合输入。 图13-8显示了最大池层,这是最常见的池化类型。 在这个例子中,我们使用一个2×2的核,步幅为2,没有填充。 请注意,只有每个核中的最大输入值才会进入下一层。 其他输入被丢弃。![](https://img-blog.csdn.net/20171112211849729?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWtvbl93YW5nX2hrYnU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
就像在卷积图层中一样,池化层中的每个神经元都连接到前一层中有限数量的神经元的输出,位于一个小的矩形感受野内。 您必须像以前一样定义其大小,跨度和填充类型。 但是,汇集的神经元没有权重; 它所做的只是使用聚合函数(如最大值或平均值)来聚合输入。 图13-8显示了最大池层,这是最常见的池化类型。 在这个例子中,我们使用一个2×2的核,步幅为2,没有填充。 请注意,只有每个核中的最大输入值才会进入下一层。 其他输入被丢弃。![](https://img-blog.csdn.net/20171112211849729?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWtvbl93YW5nX2hrYnU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
这显然是一个非常具有破坏性的层:即使只有一个2×2的核和2的步幅,输出在两个方向上都会减小两倍(所以它的面积将减少四倍),一下减少了75%的输入值
​这显然是一个非常具有破坏性的层:即使只有一个2×2的核和2的步幅,输出在两个方向上都会减小两倍(所以它的面积将减少四倍),一下减少了75%的输入值
池化层通常独立于每个输入通道工作,因此输出深度与输入深度相同。 接下来可以看到,在这种情况下,图像的空间维度(高度和宽度)保持不变,但是通道数目可以减少。
​池化层通常独立于每个输入通道工作,因此输出深度与输入深度相同。 接下来可以看到,在这种情况下,图像的空间维度(高度和宽度)保持不变,但是通道数目可以减少。
在TensorFlow中实现一个最大池层是非常容易的。 以下代码使用2×2核创建最大池化层,步幅为2,没有填充,然后将其应用于数据集中的所有图像:
​在TensorFlow中实现一个最大池层是非常容易的。 以下代码使用2×2核创建最大池化层,步幅为2,没有填充,然后将其应用于数据集中的所有图像:
```python
import numpy as np
......@@ -176,31 +176,31 @@ plt.imshow(output[0].astype(np.uint8)) # plot the output for the 1st image
plt.show()
```
ksize参数包含沿输入张量的所有四维的核形状:[min-batch,height,width,channels]。 TensorFlow目前不支持在多个实例上合并,因此ksize的第一个元素必须等于1。此外,它不支持在空间维度(高度和宽度)和深度维度上合并,因此ksize [1] 和ksize [2]都必须等于1,否则ksize [3]必须等于1。
​ksize参数包含沿输入张量的所有四维的核形状:[min-batch,height,width,channels]。 TensorFlow目前不支持在多个实例上合并,因此ksize的第一个元素必须等于1。此外,它不支持在空间维度(高度和宽度)和深度维度上合并,因此ksize [1] 和ksize [2]都必须等于1,否则ksize [3]必须等于1。
要创建一个平均池化层,只需使用**avg_pool()**函数而不是**max_pool()**
​要创建一个平均池化层,只需使用**avg_pool()**函数而不是**max_pool()**
现在你知道所有的构建模块来创建一个卷积神经网络。 我们来看看如何组装它们。
​现在你知道所有的构建模块来创建一个卷积神经网络。 我们来看看如何组装它们。
### **CNN Architectures(CNN 架构)**
典型的CNN体系结构有一些卷积层(每一个通常跟着一个ReLU层),然后是一个池化层,然后是另外几个卷积层(+ ReLU),然后是另一个池化层,等等。 随着网络的进展,图像变得越来越小,但是由于卷积层的缘故,图像通常也会越来越深(即更多的特征映射)(见图13-9)。 在堆栈的顶部,添加由几个完全连接的层(+ ReLU)组成的常规前馈神经网络,并且最终层输出预测(例如,输出估计类别概率的softmax层)。![](https://img-blog.csdn.net/20171112220217170?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWtvbl93YW5nX2hrYnU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
​典型的CNN体系结构有一些卷积层(每一个通常跟着一个ReLU层),然后是一个池化层,然后是另外几个卷积层(+ ReLU),然后是另一个池化层,等等。 随着网络的进展,图像变得越来越小,但是由于卷积层的缘故,图像通常也会越来越深(即更多的特征映射)(见图13-9)。 在堆栈的顶部,添加由几个完全连接的层(+ ReLU)组成的常规前馈神经网络,并且最终层输出预测(例如,输出估计类别概率的softmax层)。![](https://img-blog.csdn.net/20171112220217170?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWtvbl93YW5nX2hrYnU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
**一个常见的错误是使用太大的卷积核。 通常可以通过将两个3×3内核堆叠在一起来获得与9×9内核相同的效果,计算量更少。**
**一个常见的错误是使用太大的卷积核。 通常可以通过将两个3×3内核堆叠在一起来获得与9×9内核相同的效果,计算量更少。**
多年来,这种基础架构的变体已经被开发出来,导致了该领域的惊人进步。 这种进步的一个很好的衡量标准是比赛中的错误率,比如ILSVRC ImageNet的挑战。 在这个比赛中,图像分类的五大误差率在五年内从26%下降到仅仅3%左右。 前五位错误率是系统前5位预测未包含正确答案的测试图像的数量。 图像很大(256像素),有1000个类,其中一些非常微妙(尝试区分120个狗的品种)。 查看获奖作品的演变是了解CNN如何工作的好方法。
​多年来,这种基础架构的变体已经被开发出来,导致了该领域的惊人进步。 这种进步的一个很好的衡量标准是比赛中的错误率,比如ILSVRC ImageNet的挑战。 在这个比赛中,图像分类的五大误差率在五年内从26%下降到仅仅3%左右。 前五位错误率是系统前5位预测未包含正确答案的测试图像的数量。 图像很大(256像素),有1000个类,其中一些非常微妙(尝试区分120个狗的品种)。 查看获奖作品的演变是了解CNN如何工作的好方法。
我们先来看看经典的LeNet-5架构(1998年),然后是ILSVRC挑战赛的三名获胜者AlexNet(2012),GoogLeNet(2014)和ResNet(2015)。
​我们先来看看经典的LeNet-5架构(1998年),然后是ILSVRC挑战赛的三名获胜者AlexNet(2012),GoogLeNet(2014)和ResNet(2015)。
其他视觉任务在其他视觉任务中,如物体检测和定位以及图像分割,也取得了惊人的进展。 在物体检测和定位中,神经网络通常输出图像中各种物体周围的一系列边界框。 例如,参见Maxine Oquab等人的2015年论文,该论文为每个客体类别输出热图,或者Russell Stewart等人的2015年论文,该论文结合使用CNN来检测人脸,并使用递归神经网络来输出 围绕它们的一系列边界框。 在图像分割中,网络输出图像(通常与输入大小相同),其中每个像素指示相应输入像素所属的对象的类别。 例如,查看Evan Shelhamer等人的2016年论文。
​其他视觉任务在其他视觉任务中,如物体检测和定位以及图像分割,也取得了惊人的进展。 在物体检测和定位中,神经网络通常输出图像中各种物体周围的一系列边界框。 例如,参见Maxine Oquab等人的2015年论文,该论文为每个客体类别输出热图,或者Russell Stewart等人的2015年论文,该论文结合使用CNN来检测人脸,并使用递归神经网络来输出 围绕它们的一系列边界框。 在图像分割中,网络输出图像(通常与输入大小相同),其中每个像素指示相应输入像素所属的对象的类别。 例如,查看Evan Shelhamer等人的2016年论文。
### LeNet-5
LeNet-5架构也许是最广为人知的CNN架构。 如前所述,它是由Yann LeCun于1998年创建的,广泛用于手写数字识别(MNIST)。 它由表13-1所示的层组成。
​LeNet-5架构也许是最广为人知的CNN架构。 如前所述,它是由Yann LeCun于1998年创建的,广泛用于手写数字识别(MNIST)。 它由表13-1所示的层组成。
![](https://img-blog.csdn.net/20171113104318799?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWtvbl93YW5nX2hrYnU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
......@@ -217,46 +217,46 @@ Yann LeCun的网站(“LENET”部分)展示了LeNet-5分类数字的很好
### AlexNet
AlexNet CNN架构赢得了2012年的ImageNet ILSVRC挑战赛:它达到了17%的top-5的错误率,而第二名错误率只有26%! 它由Alex Krizhevsky(因此而得名),Ilya Sutskever和Geoffrey Hinton开发。 它与LeNet-5非常相似,只是更大更深,它是第一个将卷积层直接堆叠在一起,而不是在每个卷积层顶部堆叠一个池化层。 表13-2介绍了这种架构。![](https://img-blog.csdn.net/20171113163456526?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWtvbl93YW5nX2hrYnU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
AlexNet CNN架构赢得了2012年的ImageNet ILSVRC挑战赛:它达到了17%的top-5的错误率,而第二名错误率只有26%! 它由Alex Krizhevsky(因此而得名),Ilya Sutskever和Geoffrey Hinton开发。 它与LeNet-5非常相似,只是更大更深,它是第一个将卷积层直接堆叠在一起,而不是在每个卷积层顶部堆叠一个池化层。 表13-2介绍了这种架构。![](https://img-blog.csdn.net/20171113163456526?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWtvbl93YW5nX2hrYnU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
为了减少过拟合,作者使用了前面章节中讨论的两种正则化技术:首先他们在训练期间将丢失率(dropout率为50%)应用于层F8和F9的输出。其次,他们通过随机对训练图像进行各种偏移,水平翻转和改变照明条件来进行数据增强。
​为了减少过拟合,作者使用了前面章节中讨论的两种正则化技术:首先他们在训练期间将丢失率(dropout率为50%)应用于层F8和F9的输出。其次,他们通过随机对训练图像进行各种偏移,水平翻转和改变照明条件来进行数据增强。
AlexNet还在层C1和C3的ReLU步骤之后立即使用竞争标准化步骤,称为局部响应标准化(local response normalization)。 这种标准化形式使得在相同的位置的神经元被最强烈的激活但是在相邻的特征映射中抑制神经元(在生物神经元中观察到了这种竞争激活)。 这鼓励不同的特征映射特殊化,迫使它们分开,并让他们探索更广泛的特征,最终提升泛化能力。 公式13-2显示了如何应用LRN。![](https://img-blog.csdn.net/20171113165417821?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWtvbl93YW5nX2hrYnU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
​AlexNet还在层C1和C3的ReLU步骤之后立即使用竞争标准化步骤,称为局部响应标准化(local response normalization)。 这种标准化形式使得在相同的位置的神经元被最强烈的激活但是在相邻的特征映射中抑制神经元(在生物神经元中观察到了这种竞争激活)。 这鼓励不同的特征映射特殊化,迫使它们分开,并让他们探索更广泛的特征,最终提升泛化能力。 公式13-2显示了如何应用LRN。![](https://img-blog.csdn.net/20171113165417821?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWtvbl93YW5nX2hrYnU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
* ![](https://img-blog.csdn.net/20171113181414584)是位于特征映射i的神经元的标准化输出,在某行u和列v(注意,在这个等式中我们只考虑位于这个行和列的神经元,所以u和v没有显示)。
* ![](https://img-blog.csdn.net/20171113191223416)是在ReLU步骤之后,但在归一化之前的那个神经元的激活。
* k,α,β和r是超参数。 k称为偏置,r称为深度半径。
* ![](https://img-blog.csdn.net/20171113191339071)是特征映射的数量。
例如,如果r = 2且神经元具有强激活,则将抑制位于其上下的特征映射中的神经元的激活。
​例如,如果r = 2且神经元具有强激活,则将抑制位于其上下的特征映射中的神经元的激活。
在AlexNet中,超参数设置如下:r = 2,α= 0.00002,β= 0.75,k = 1。这个步骤可以使用TensorFlow的**local_response_normalization()**操作来实现。
​在AlexNet中,超参数设置如下:r = 2,α= 0.00002,β= 0.75,k = 1。这个步骤可以使用TensorFlow的**local_response_normalization()**操作来实现。
AlexNet的一个名为ZF Net的变体由Matthew Zeiler和Rob Fergus开发,赢得了2013年ILSVRC的挑战。 它基本上是AlexNet的一些调整的超参数(特征映射的数量,内核大小,步幅等)。
​AlexNet的一个名为ZF Net的变体由Matthew Zeiler和Rob Fergus开发,赢得了2013年ILSVRC的挑战。 它基本上是AlexNet的一些调整的超参数(特征映射的数量,内核大小,步幅等)。
### GoogLeNet
GoogLeNet架构是由Christian Szegedy等人开发的。 来自Google Research,通过低于7%的top-5错误率,赢得了ILSVRC 2014的挑战赛。 这个伟大的表现很大程度上因为它比以前的CNN网络更深(见图13-11)。 这是通过称为初始模块(inception modules)的子网络实现的,这使得GoogLeNet比以前的架构更有效地使用参数:实际上,GoogLeNet的参数比AlexNet少了10倍(约600万而不是6000万)。
​GoogLeNet架构是由Christian Szegedy等人开发的。 来自Google Research,通过低于7%的top-5错误率,赢得了ILSVRC 2014的挑战赛。 这个伟大的表现很大程度上因为它比以前的CNN网络更深(见图13-11)。 这是通过称为初始模块(inception modules)的子网络实现的,这使得GoogLeNet比以前的架构更有效地使用参数:实际上,GoogLeNet的参数比AlexNet少了10倍(约600万而不是6000万)。
![](https://img-blog.csdn.net/20171113192747579?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWtvbl93YW5nX2hrYnU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
初始模块的架构如图13-10所示。 符号“3×3 + 2(S)”表示该层使用3×3内核,步幅2和“SAME"填充。 输入信号首先被复制并馈送到四个不同的层。 所有卷积层都使用ReLU激活功能。 请注意,第二组卷积层使用不同的内核大小(1×1,3×3和5×5),允许它们以不同的比例捕获图案。 还要注意,每一层都使用了跨度为1和SAME填充的(即使是最大的池化层),所以它们的输出全都具有与其输入相同的高度和宽度。这使得将所有输出在最后的深度连接层(depth concat layer)上沿着深度方向堆叠成为可能(即,堆叠来自所有四个顶部卷积层的特征映射)。 这个连接层可以在TensorFlow中使用**concat()**操作实现,其中axis = 3(axis 3是深度)。
​初始模块的架构如图13-10所示。 符号“3×3 + 2(S)”表示该层使用3×3内核,步幅2和“SAME"填充。 输入信号首先被复制并馈送到四个不同的层。 所有卷积层都使用ReLU激活功能。 请注意,第二组卷积层使用不同的内核大小(1×1,3×3和5×5),允许它们以不同的比例捕获图案。 还要注意,每一层都使用了跨度为1和SAME填充的(即使是最大的池化层),所以它们的输出全都具有与其输入相同的高度和宽度。这使得将所有输出在最后的深度连接层(depth concat layer)上沿着深度方向堆叠成为可能(即,堆叠来自所有四个顶部卷积层的特征映射)。 这个连接层可以在TensorFlow中使用**concat()**操作实现,其中axis = 3(axis 3是深度)。
您可能想知道为什么初始模块具有1×1内核的卷积层。 当然这些图层不能捕获任何功能,因为他们一次只能看一个像素? 实际上,这些层次有两个目的:
​您可能想知道为什么初始模块具有1×1内核的卷积层。 当然这些图层不能捕获任何功能,因为他们一次只能看一个像素? 实际上,这些层次有两个目的:
首先,它们被配置为输出比输入少得多的特征映射,所以它们作为瓶颈层,意味着它们降低了维度。 在3×3和5×5卷积之前,这是特别有用的,因为这些在计算上是非常耗费内存的层。
​首先,它们被配置为输出比输入少得多的特征映射,所以它们作为瓶颈层,意味着它们降低了维度。 在3×3和5×5卷积之前,这是特别有用的,因为这些在计算上是非常耗费内存的层。
其次,每一个卷积层对([1 × 1, 3 × 3]和[1 × 1, 5 × 5]表现地像一个强大的卷积层,可以捕捉到更多的复杂的模式。事实上,这一对卷积层不是在图像上扫过一个简单的线性分类器(就像单个卷积层一样),而是在图像上扫描一个双层神经网络。
​其次,每一个卷积层对([1 × 1, 3 × 3]和[1 × 1, 5 × 5]表现地像一个强大的卷积层,可以捕捉到更多的复杂的模式。事实上,这一对卷积层不是在图像上扫过一个简单的线性分类器(就像单个卷积层一样),而是在图像上扫描一个双层神经网络。
简而言之,您可以将整个初始模块视为类固醇卷积层,能够输出捕捉各种尺度复杂模式的特征映射。
​简而言之,您可以将整个初始模块视为类固醇卷积层,能够输出捕捉各种尺度复杂模式的特征映射。
**每个卷积层的卷积核的数量是一个超参数。 不幸的是,这意味着你有六个超参数来调整你添加的每个初始层。**
**每个卷积层的卷积核的数量是一个超参数。 不幸的是,这意味着你有六个超参数来调整你添加的每个初始层。**
![](https://img-blog.csdn.net/20171113195615498?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWtvbl93YW5nX2hrYnU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)现在
让我们来看看GoogLeNet CNN的架构(见图13-11)。 它非常深,我们不得不将它分成三列,但是GoogLeNet实际上是一列,包括九个初始模块(带有旋转顶端的框),每个模块实际上包含三层。每个卷积层和池化层输出的特征映射的数量显示在内核大小前。 初始模块中的六个数字表示模块中每个卷积层输出的特征映射的数量(与图13-10中的顺序相同)。 请注意,所有的卷积层都使用ReLU激活函数。
​让我们来看看GoogLeNet CNN的架构(见图13-11)。 它非常深,我们不得不将它分成三列,但是GoogLeNet实际上是一列,包括九个初始模块(带有旋转顶端的框),每个模块实际上包含三层。每个卷积层和池化层输出的特征映射的数量显示在内核大小前。 初始模块中的六个数字表示模块中每个卷积层输出的特征映射的数量(与图13-10中的顺序相同)。 请注意,所有的卷积层都使用ReLU激活函数。
让我们来过一遍这个网络:
......@@ -269,35 +269,35 @@ Yann LeCun的网站(“LENET”部分)展示了LeNet-5分类数字的很好
* 接下来,平均池化层使用具有”VALID“填充的特征映射的大小的内核,输出1×1特征映射:这种令人惊讶的策略被称为全局平均池化。 它有效地强制以前的图层产生特征映射,这些特征映射实际上是每个目标类的置信图(因为其他类型的功能将被平均步骤破坏)。 这样在CNN的顶部就不必有有几个全连接层(如AlexNet),大大减少了网络中的参数数量,并减少了了过度拟合的风险。
* 最后一层是不言自明的:正则化drop out,然后是具有softmax激活函数的完全连接层来输出估计类的概率。
这个图略有简化:原来的GoogLeNet架构还包括两个插在第三和第六个初始模块之上的辅助分类器。 它们都由一个平均池层,一个卷积层,两个完全连接的层和一个softmax激活层组成。 在训练期间,他们的损失(缩小了70%)加在了整体损失上。 目标是解决消失梯度问题,正则化网络。 但是,结果显示其效果相对小。
​这个图略有简化:原来的GoogLeNet架构还包括两个插在第三和第六个初始模块之上的辅助分类器。 它们都由一个平均池层,一个卷积层,两个完全连接的层和一个softmax激活层组成。 在训练期间,他们的损失(缩小了70%)加在了整体损失上。 目标是解决消失梯度问题,正则化网络。 但是,结果显示其效果相对小。
### **ResNet**
最后是,2015年ILSVRC挑战赛的赢家Kaiming He等人开发的Residual Network(或ResNet),该网络的top-5误率低到惊人的3.6%,它使用了一个非常深的CNN,由152层组成。 能够训练如此深的网络的关键是使用跳过连接(skip connection,也称为快捷连接):一个层的输入信号也被添加到位于下一层的输出。 让我们看看为什么这是有用的。
​最后是,2015年ILSVRC挑战赛的赢家Kaiming He等人开发的Residual Network(或ResNet),该网络的top-5误率低到惊人的3.6%,它使用了一个非常深的CNN,由152层组成。 能够训练如此深的网络的关键是使用跳过连接(skip connection,也称为快捷连接):一个层的输入信号也被添加到位于下一层的输出。 让我们看看为什么这是有用的。
当训练一个神经网络时,目标是使其模拟一个目标函数h(x)。 如果将输入x添加到网络的输出中(即添加跳过连接),那么网络将被迫模拟f(x)= h(x) - x而不是h(x)。 这被称为残留学习(见图13-12)。![](https://img-blog.csdn.net/20171114094419379?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWtvbl93YW5nX2hrYnU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
​当训练一个神经网络时,目标是使其模拟一个目标函数h(x)。 如果将输入x添加到网络的输出中(即添加跳过连接),那么网络将被迫模拟f(x)= h(x) - x而不是h(x)。 这被称为残留学习(见图13-12)。![](https://img-blog.csdn.net/20171114094419379?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWtvbl93YW5nX2hrYnU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
当你初始化一个普通的神经网络时,它的权重接近于零,所以网络只输出接近零的值。 如果添加跳过连接,则生成的网络只输出其输入的副本; 换句话说,它最初对身份函数进行建模。 如果目标函数与身份函数非常接近(常常是这种情况),这将大大加快训练速度。
​当你初始化一个普通的神经网络时,它的权重接近于零,所以网络只输出接近零的值。 如果添加跳过连接,则生成的网络只输出其输入的副本; 换句话说,它最初对身份函数进行建模。 如果目标函数与身份函数非常接近(常常是这种情况),这将大大加快训练速度。
而且,如果添加了许多跳转连接,即使几个层还没有开始学习,网络也可以开始进行(见图13-13)。 由于跳过连接,信号可以很容易地通过整个网络。 深度剩余网络可以看作是一堆剩余单位,其中每个剩余单位是一个有跳过连接的小型神经网络。![](https://img-blog.csdn.net/20171114111640232?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWtvbl93YW5nX2hrYnU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
​而且,如果添加了许多跳转连接,即使几个层还没有开始学习,网络也可以开始进行(见图13-13)。 由于跳过连接,信号可以很容易地通过整个网络。 深度剩余网络可以看作是一堆剩余单位,其中每个剩余单位是一个有跳过连接的小型神经网络。![](https://img-blog.csdn.net/20171114111640232?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWtvbl93YW5nX2hrYnU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
现在让我们看看ResNet的架构(见图13-14)。 这实际上是令人惊讶的简单。 它的开始和结束与GoogLeNet完全一样(除了没有dropout层),而在两者之间只是一堆很简单的残余单位。 每个残差单元由两个卷积层组成,使用3×3的内核和保存空间维度(步幅1,SAME填充),批量归一化(BN)和ReLU激活。
​现在让我们看看ResNet的架构(见图13-14)。 这实际上是令人惊讶的简单。 它的开始和结束与GoogLeNet完全一样(除了没有dropout层),而在两者之间只是一堆很简单的残余单位。 每个残差单元由两个卷积层组成,使用3×3的内核和保存空间维度(步幅1,SAME填充),批量归一化(BN)和ReLU激活。
![](https://img-blog.csdn.net/20171114111852019?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWtvbl93YW5nX2hrYnU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
需要注意的是特征映射的数量每隔几个残差单位会加倍,同时它们的高度和宽度减半(使用步幅2卷积层)。 发生这种情况时,输入不能直接添加到剩余单元的输出中,因为它们不具有相同的形状(例如,此问题影响图13-14中的虚线箭头表示的跳过连接)。 为了解决这个问题,输入通过一个1×1卷积层,步长2和正确数量的输出特征映射(见图13-15)。![](https://img-blog.csdn.net/20171114202902440?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWtvbl93YW5nX2hrYnU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
​需要注意的是特征映射的数量每隔几个残差单位会加倍,同时它们的高度和宽度减半(使用步幅2卷积层)。 发生这种情况时,输入不能直接添加到剩余单元的输出中,因为它们不具有相同的形状(例如,此问题影响图13-14中的虚线箭头表示的跳过连接)。 为了解决这个问题,输入通过一个1×1卷积层,步长2和正确数量的输出特征映射(见图13-15)。![](https://img-blog.csdn.net/20171114202902440?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWtvbl93YW5nX2hrYnU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
ResNet-34是具有34个层(仅计算卷积层和完全连接层)的ResNet,包含3个剩余单元输出64个特征映射,4个剩余单元输出128个特征映射,6个剩余单元输出256个特征映射,3个剩余单元输出512个特征映射。
​ResNet-34是具有34个层(仅计算卷积层和完全连接层)的ResNet,包含3个剩余单元输出64个特征映射,4个剩余单元输出128个特征映射,6个剩余单元输出256个特征映射,3个剩余单元输出512个特征映射。
ResNet-152更深,使用稍微不同的剩余单位。 他们使用三个卷积层,而不是两个256个特征映射的3×3的卷积层,它们使用三个卷积层:第一个卷积层只有64个特征映射(少4倍),这是一个瓶颈层(已经讨论过) ,然后是具有64个特征映射的3×3层,最后是具有256个特征映射(4×64)的另一个1×1卷积层,以恢复原始深度。ResNet-152包含三个这样的剩余单位,输出256个特征映射,然后是8个剩余单位,输出512个特征映射,高达36 个剩余单位,输出1024个特征映射,最后是3个剩余单位,输出2048个特征映射。
​ResNet-152更深,使用稍微不同的剩余单位。 他们使用三个卷积层,而不是两个256个特征映射的3×3的卷积层,它们使用三个卷积层:第一个卷积层只有64个特征映射(少4倍),这是一个瓶颈层(已经讨论过) ,然后是具有64个特征映射的3×3层,最后是具有256个特征映射(4×64)的另一个1×1卷积层,以恢复原始深度。ResNet-152包含三个这样的剩余单位,输出256个特征映射,然后是8个剩余单位,输出512个特征映射,高达36 个剩余单位,输出1024个特征映射,最后是3个剩余单位,输出2048个特征映射。
正如你所看到的,这个领域正在迅速发展,每年都会有各种各样的架构出现。 一个明显的趋势是CNN越来越深入。 他们也越来越轻量,需要越来越少的参数。 目前,ResNet架构既是最强大的,也是最简单的,所以它现在应该是你应该使用的,但是每年都要继续关注ILSVRC的挑战。 2016年获奖者是来自中国的Trimps-Soushen团队,他们的出错率惊人的缩减到2.99%。 为了达到这个目标,他们训练了以前模型的组合,并将它们合并为一个整体。 根据任务的不同,降低的错误率可能会或可能不值得额外的复杂性。
​正如你所看到的,这个领域正在迅速发展,每年都会有各种各样的架构出现。 一个明显的趋势是CNN越来越深入。 他们也越来越轻量,需要越来越少的参数。 目前,ResNet架构既是最强大的,也是最简单的,所以它现在应该是你应该使用的,但是每年都要继续关注ILSVRC的挑战。 2016年获奖者是来自中国的Trimps-Soushen团队,他们的出错率惊人的缩减到2.99%。 为了达到这个目标,他们训练了以前模型的组合,并将它们合并为一个整体。 根据任务的不同,降低的错误率可能会或可能不值得额外的复杂性。
还有其他一些架构可供您参考,特别是VGGNet13(2014年ILSVRC挑战赛的亚军)和Inception-v414(将GoGoLeNet和ResNet的思想融合在一起,实现了接近3%的top-5误差 ImageNet分类率)。
​还有其他一些架构可供您参考,特别是VGGNet13(2014年ILSVRC挑战赛的亚军)和Inception-v414(将GoGoLeNet和ResNet的思想融合在一起,实现了接近3%的top-5误差 ImageNet分类率)。
实施我们刚刚讨论的各种CNN架构真的没什么特别的。 我们之前看到如何构建所有的独立构建模块,所以现在您只需要组装它们来创建所需的构架。 我们将在即将开始的练习中构建ResNet-34,您将在Jupyter笔记本中找到完整的工作代码。
​实施我们刚刚讨论的各种CNN架构真的没什么特别的。 我们之前看到如何构建所有的独立构建模块,所以现在您只需要组装它们来创建所需的构架。 我们将在即将开始的练习中构建ResNet-34,您将在Jupyter笔记本中找到完整的工作代码。
### **TensorFlow Convolution Operations**
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册