From 9877eda5f5925e8550d387901876f58b0effa1aa Mon Sep 17 00:00:00 2001 From: xiaotinghe Date: Fri, 1 Jan 2021 05:10:04 +0800 Subject: [PATCH] ch7 --- chapter_convolutional-modern/alexnet.md | 82 ++++++++++++----------- chapter_convolutional-modern/googlenet.md | 34 +++++----- 2 files changed, 62 insertions(+), 54 deletions(-) diff --git a/chapter_convolutional-modern/alexnet.md b/chapter_convolutional-modern/alexnet.md index 0603be83..804910de 100644 --- a/chapter_convolutional-modern/alexnet.md +++ b/chapter_convolutional-modern/alexnet.md @@ -1,72 +1,78 @@ -# 深度卷积神经网络(AlexNet) +# 深度卷积神经网络之AlexNet :label:`sec_alexnet` -在LeNet提出后,卷积神经网络在计算机视觉和机器学习领域中很有名气。但卷积神经网络并没有主导这些领域。这是因为虽然 LeNet 在小数据集上取得了很好的效果,但是在更大、更真实的数据集上训练卷积神经网络的性能和可行性还有待研究。事实上,在上世纪90年代初到2012年之间的大部分时间里,神经网络往往被其他机器学习方法超越,如支持向量机(support vector machines)。 +尽管在LeNet的到来后,卷积神经网络在计算机视觉和机器学习领域中很有名。但卷积神经网络并没有主导这个领域。这是因为虽然 LeNet 在小数据集上取得了很好的效果,但是在更大、更真实的数据集上训练卷积神经网络的性能和可行性还有待研究。事实上,在上世纪90年代初到2012年之间的大部分时间里,神经网络往往被其他机器学习方法所超越,如支持向量机(support vector machines)。 + +在计算机视觉中,直接将神经网络与其他机器学习方法进行比较也许不公平。这是因为,卷积神经网络的输入是由原始像素值或是经过简单预处理(例如居中、缩放)的像素值组成的。但在使用传统机器学习方法时,从业者永远不会将原始像素作为输入。在传统机器学习方法中,计算机视觉管道是由经过人的手工精心设计的特征管道组成的。对于这些传统方法,大部分的进展都来自于对特征有了更聪明的想法,并且学习算法往往归于事后的解释。 -在计算机视觉中,直接将神经网络与其他机器学习方法进行比较也许不公平。这是因为,卷积神经网络的输入是由原始像素值或是经过简单预处理(例如居中、缩放)的像素值组成的。但在使用传统机器学习方法时,从业者永远不会将原始像素作为输入。在传统机器学习方法中,计算机视觉工作流是由经过人的手工精心设计的特征工作流组成的。对于这些传统方法,大部分的进展都来自于对特征有了更聪明的想法,并且学习到的算法往往归于事后的解释。 虽然上世纪90年代就有了一些神经网络加速器,但仅靠它们还不足以开发出有大量参数的深层多通道多层卷积神经网络。此外,当时的数据集仍然相对较小。除了这些障碍,训练神经网络的一些关键技巧仍然缺失,包括启发式参数初始化、随机梯度下降的巧妙变体、非挤压激活函数和有效的正则化技术。 -因此,与训练*端到端*(从像素到分类结果)系统不同,经典机器学习的工作流看起来更像下面这样: +因此,与训练*端到端*(从像素到分类结果)系统不同,经典管道看起来更像下面这样: + +1. 获取一个有趣的数据集。在早期,这些数据集需要昂贵的传感器(在当时100万像素的图像是最先进的)。 +2. 根据光学、几何学和其他的一些知识,以及偶然的幸运发现,手工对特征数据集进行预处理。 +3. 通过标准的特征提取算法(如SIFT(尺度不变特征变换) :cite:`Lowe.2004` 、SURF(加速鲁棒特征) :cite:`Bay.Tuytelaars.Van-Gool.2006` 或任何数量的其他手动调节的管道来输入数据。 +4. 将提取的特征放到你最喜欢的分类器中(例如线性模型或其它核方法),以训练分类器。 + +如果你和机器学习研究人员交谈,你会发现他们相信机器学习既重要又美丽:优雅的理论证明了各种模型的性质。机器学习是一个蓬勃发展、严谨且非常有用的领域。然而,如果你和计算机视觉研究人员交谈,你会听到一个完全不同的故事。他们会告诉你图像识别的诡异事实————推动领域进步的是数据特征,而不是学习算法。计算机视觉研究人员相信,从对最终模型精度的影响来说,更大或更干净的数据集、或是稍微改进的特征提取,比任何学习算法的进步要大得多。 -1. 获取一个有趣的数据集。在早期,收集这些数据集需要昂贵的传感器(在当时最先进的图像也就100万像素)。 -2. 根据光学、几何学、其他知识以及偶然的发现,手工对特征数据集进行预处理。 -3. 通过标准的特征提取算法(如SIFT(尺度不变特征变换) :cite:`Lowe.2004` 、SURF(加速鲁棒特征) :cite:`Bay.Tuytelaars.Van-Gool.2006` 或其他手动调整的工作流来输入数据。 -4. 将提取的特征放到最喜欢的分类器中(例如线性模型或其它核方法),以训练分类器。 -如果你和机器学习研究人员交谈,你会发现他们相信机器学习既重要又美丽:优雅的理论去证明各种模型的性质。机器学习是一个正在蓬勃发展、严谨且非常有用的领域。然而,如果你和计算机视觉研究人员交谈,你会听到一个完全不同的故事。他们会告诉你图像识别的诡异事实————推动领域进步的是数据特征,而不是学习算法。计算机视觉研究人员相信,从对最终模型精度的影响来说,更大或更干净的数据集、或是稍微改进的特征提取,比任何学习算法带来的进步要大得多。 ## 学习表征 -另一种预测这个领域发展的方法————观察图像特征的提取方法。在2012年前,图像特征都是机械地计算出来的。事实上,设计一套新的特征函数、改进结果,并撰写论文是盛极一时的潮流。SIFT :cite:`Lowe.2004`、SURF :cite:`Bay.Tuytelaars.Van-Gool.2006`、HOG(定向梯度直方图) :cite:`Dalal.Triggs.2005` 、[bags of visual words](https://en.wikipedia.org/wiki/Bag-of-words_model_in_computer_vision) 和类似的特征提取方法占据了主导地位。 +另一种预测这个领域发展的方法————观察图像特征的提取方法。在2012年前,图像特征都是机械地计算出来的。事实上,设计一套新的特征函数,改进结果,并撰写论文是盛极一时的潮流。SIFT :cite:`Lowe.2004`、SURF :cite:`Bay.Tuytelaars.Van-Gool.2006`、HOG(定向梯度直方图) :cite:`Dalal.Triggs.2005` 、[bags of visual words](https://en.wikipedia.org/wiki/Bag-of-words_model_in_computer_vision) 和类似的特征提取方法占据了主导地位。 另一组研究人员,包括Yann LeCun、Geoff Hinton、Yoshua Bengio、Andrew Ng、Shun ichi Amari和Juergen Schmidhuber,想法则与众不同:他们认为特征本身应该被学习。此外,他们还认为,在合理地复杂性前提下,特征应该由多个共同学习的神经网络层组成,每个层都有可学习的参数。在机器视觉中,最底层可能检测边缘、颜色和纹理。事实上,Alex Krizhevsky、Ilya Sutskever和Geoff Hinton提出了一种新的卷积神经网络变体*AlexNet*。在2012年ImageNet挑战赛中取得了轰动一时的成绩。AlexNet 以 Alex Krizhevsky 的名字命名,他是论文 :cite:`Krizhevsky.Sutskever.Hinton.2012` 的第一作者。 -有趣的是,在网络的最底层,模型学习到了一些类似于传统滤波器的特征抽取器。 :numref:`fig_filters` 是从AlexNet论文 :cite:`Krizhevsky.Sutskever.Hinton.2012` 复制的,描述了底层图像特征。 +有趣的是,在网络的最底层,模型学习到了一些类似于传统滤波器的特征抽取器。 :numref:`fig_filters` 是从AlexNet论文 :cite:`Krizhevsky.Sutskever.Hinton.2012` 复制的,描述了低级图像特征。 ![AlexNet第一层学习到的特征抽取器。](../img/filters.png) :width:`400px` :label:`fig_filters` -AlexNet的更高层建立在这些底层表示的基础上,以表示更大的特征,如眼睛、鼻子、草叶等等。而更高的层可以检测整个物体,如人、飞机、狗或飞盘。最终的隐藏神经元可以学习图像的综合表示,从而使属于不同类别的数据易于区分。尽管一直有一群执着的研究者不断钻研,试图学习视觉数据的逐级表征,然而很长一段时间里这些尝试都未有突破。深度卷积神经网络的突破出现在2012年。突破可归因于两个关键因素。 +AlexNet的更高层建立在这些表示的基础上,以表示更大的特征,如眼睛、鼻子、草叶等等。而更高的层可以检测整个物体,如人、飞机、狗或飞盘。最终的隐藏神经元可以学习图像的综合表示,从而使属于不同类别的数据易于区分。尽管一直有一群执着的研究者不断钻研,试图学习视觉数据的逐级表征,然而很长一段时间里这些尝试都未有突破。深度卷积神经网络的突破出现在2012年,可归因于两个关键因素。 ### 缺少的成分:数据 包含许多特征的深度模型需要大量的有标签数据,才能显著优于基于凸优化的传统方法(如线性方法和核方法)。 -然而,限于早期计算机有限的存储和90年代有限的研究预算,大部分研究只基于小的公开数据集。例如,不少研究论文基于加州大学欧文分校(UCI)提供的若干个公开数据集,其中许多数据集只有几百至几千张在非自然环境下以低分辨率拍摄的图像。这一状况在2010年前后兴起的大数据浪潮中得到改善。2009年,ImageNet数据集发布,并发起ImageNet挑战赛:要求研究人员从100万个样本中训练模型,以区分1000个不同类别的对象。ImageNet数据集由斯坦福教授李飞飞小组的研究人员开发,利用谷歌图像搜索(Google Image Search)对每一类图像进行预筛选,并利用亚马逊众包(Amazon Mechanical Turk)来标注每张图片的相关类别。这种规模是前所未有的。这项被称为ImageNet的挑战赛推动了计算机视觉和机器学习研究的发展,挑战研究人员确定哪些模型能够在更大的数据规模下表现最好。 +然而,限于早期计算机有限的存储和90年代有限的研究预算,大部分研究只基于小的公开数据集。例如,不少研究论文基于加州大学欧文分校(UCI)提供的若干个公开数据集,其中许多数据集只有几百至几千张在非自然环境下以低分辨率拍摄的图像。这一状况在2010年前后兴起的大数据浪潮中得到改善。2009年,ImageNet数据集发布,并发起ImageNet挑战赛:要求研究人员从100万个样本中训练模型,以区分1000个不同类别的对象。ImageNet数据集由斯坦福教授李飞飞(Fei-Fei-Li)小组的研究人员开发,利用谷歌图像搜索(Google Image Search)对每一类图像进行预筛选,并利用亚马逊众包(Amazon-Mechanical-Turk)来标注每张图片的相关类别。这种规模是前所未有的。这项被称为ImageNet的挑战赛推动了计算机视觉和机器学习研究的发展,同时推动计算机视觉和机器学习的研究进入新的阶段,而此前的传统方法不再有优势。 ### 缺少的成分:硬件 -深度学习对计算资源要求很高,训练可能需要数百个迭代周期,每次迭代都需要通过代价高昂的许多线性代数层传递数据。这也是为什么在20世纪90年代至21世纪初,优化凸目标的简单算法是研究人员的首选。然而,用GPU训练神经网络改变了这一格局。*图形处理器* (Graphics Processing Unit,GPU)早年用来加速图形处理,使电脑游戏玩家受益。GPU可优化高吞吐量的 $4 \times 4$ 矩阵和向量乘法,从而服务于基本的图形任务。幸运的是,这些数学运算与卷积层的计算惊人地相似。由此,英伟达(NVIDIA)和ATI已经开始为通用计算操作优化gpu,甚至把它们作为 *通用GPU*(general-purpose GPUs,GPGPU)来销售。 +深度学习对计算资源要求很高,训练可能需要数百个迭代周期,每次迭代都需要通过代价高昂的许多线性代数层传递数据。这也是为什么在20世纪90年代至21世纪初,优化凸目标的简单算法是研究人员的首选。然而,用GPU训练神经网络改变了这一格局。*图形处理器* (Graphics Processing Unit,GPU)早年用来加速图形处理,使电脑游戏玩家受益。GPU可优化高吞吐量的 $4 \times 4$ 矩阵和向量乘法,从而服务于基本的图形任务。幸运的是,这些数学运算与计算卷积层惊人地相似。由此,英伟达(NVIDIA)和ATI会把它们作为 *通用GPU* 来销售。 那么GPU比CPU强在哪里呢? -首先,我们深度理解一下中央处理器(Central Processing Unit,CPU)的*核心*。 -CPU的每个核心都拥有高时钟频率的运行能力,和高达数MB的三级缓存(L3 Cache)。 -它们非常适合执行各种指令,具有分支预测器、深层流水线和其他使CPU能够运行各种程序的功能。 +首先,我们深度理解一下中央处理器(Central Processing Unit,CPU)的核心。 +CPU的每个核心都拥有高时钟频率的运行能力,和高达数兆字节三级缓存(L3 Cache)。 +它们非常适合执行各种指令,具有分支预测器、深层流水线和其他各种各样的功能。 然而,这种明显的优势也是它的致命弱点:通用核心的制造成本非常高。 它们需要大量的芯片面积、复杂的支持结构(内存接口、内核之间的缓存逻辑、高速互连等等),而且它们在任何单个任务上的性能都相对较差。 现代笔记本电脑最多有4核,即使是高端服务器也很少超过64核,因为它们的性价比不高。 -相比于CPU,GPU由 $100 \sim 1000$ 个小的处理单元组成(NVIDIA、ATI、ARM和其他芯片供应商之间的细节稍有不同),通常被分成更大的组(NVIDIA称之为warps)。 +相比CPU,GPU由 $100 \sim 1000$ 个小的内核组成(NVIDIA、ATI、ARM和其他芯片供应商之间的细节稍有不同),通常被分成更大的组(NVIDIA称之为warps)。 虽然每个GPU核心都相对较弱,有时甚至以低于1GHz的时钟频率运行,但庞大的核心数量使GPU比CPU快几个数量级。 -例如,NVIDIA最近一代的Ampere GPU架构为每个芯片提供了高达312 TFlops的浮点性能,而CPU的浮点性能到目前为止还没有超过1 TFlops。 +例如,对于计算FP32 输入/输出数据,NVIDIA最近一代的Ampere GPU架构为每个芯片提供了高达312 TFlops的浮点性能,而CPU的浮点性能到目前为止还没有超过1 TFlops。 之所以有如此大的差距,原因其实很简单:首先,功耗往往会随时钟频率呈二次方增长。 -对于一个CPU核心,假设它的运行速度比GPU快4倍,你可以使用16个GPU内核取代,那么GPU的综合性能就是CPU的 $16 \times 1/4 = 4$ 倍。 +对于一个CPU核心,假设它的运行速度比GPU快4倍,您可以使用16个GPU内核取代,那么GPU的综合性能就是CPU的 $16 \times 1/4 = 4$ 倍。 其次,GPU内核要简单得多,这使得它们更节能。 -此外,深度学习中的许多操作需要相对较高的内存带宽,而GPU拥有10倍于CPU的带宽。 +此外,深度学习中的许多操作需要相对较高的内存带宽,而GPU拥有CPU 10倍的带宽。 + +回到2012年的重大突破,很大原因出于研究人员实现了在GPU上运行的深度卷积神经网络。 +当年,Alex Krizhevsky和Ilya Sutskever意识到卷积神经网络中的计算瓶颈:卷积和矩阵乘法,都是可以在硬件上并行化的操作的。 +于是,他们使用两个NVIDIA GTX580和3GB内存,实现了快速卷积运算。他们的创新[cuda-convnet](https://code.google.com/archive/p/cuda-convnet/)几年来它一直是行业标准,并推动了深度学习热潮。 + -回到2012年的重大突破,当Alex Krizhevsky和Ilya Sutskever实现了可以在GPU硬件上运行的深度卷积神经网络时,一个重大突破出现了。他们意识到卷积神经网络中的计算瓶颈:卷积和矩阵乘法,都是可以在硬件上并行化的操作。 -于是,他们使用两个显存为3GB的NVIDIA GTX580 GPU实现了快速卷积运算。他们的创新[cuda-convnet](https://code.google.com/archive/p/cuda-convnet/)几年来它一直是行业标准,并推动了深度学习热潮。 ## AlexNet -2012年,AlexNet横空出世。它首次证明了学习到的特征可以超越手工设计的特征。它一举了打破计算机视觉研究的现状。 +2012年,AlexNet横空出世。它首次证明了学习到的特征可以超越手工设计的特征,从而一举打破计算机视觉研究的现状。 AlexNet使用了8层卷积神经网络,并以很大的优势赢得了2012年ImageNet图像识别挑战赛。 AlexNet和LeNet的架构非常相似,如 :numref:`fig_alexnet` 所示。 -注意,这里我们提供了一个稍微精简版本的AlexNet,去除了当年需要两个小型GPU同时运算的设计特点。 +请注意,这里我们提供了一个稍微精简版本的AlexNet,去除了当年需要两个小型GPU同时运算的设计特点。 ![从LeNet(左)到AlexNet(right)](../img/alexnet.svg) :label:`fig_alexnet` @@ -88,8 +94,8 @@ AlexNet由八层组成:五个卷积层、两个全连接隐藏层和一个全 在最后一个卷积层后有两个全连接层,分别有4096个输出。 这两个巨大的全连接层拥有将近1GB的模型参数。 -由于早期GPU显存有限,原版的AlexNet采用了双数据流设计,使得每个GPU只负责存储和计算模型的一半参数。 -幸运的是,现在GPU显存相对充裕,所以我们现在很少需要跨GPU分解模型(因此,我们的AlexNet模型在这方面与原始论文稍有不同)。 +由于早期GPU内存有限,原版的AlexNet采用了双数据流设计,使得每个GPU只负责存储和计算模型的一半参数。 +幸运的是,现在GPU内存相对充裕,所以我们现在很少需要跨GPU分解模型参数(因此,我们的AlexNet模型在这方面与原始论文稍有不同)。 ### 激活函数 @@ -102,8 +108,8 @@ AlexNet由八层组成:五个卷积层、两个全连接隐藏层和一个全 ### 容量控制和预处理 -AlexNet通过dropout( :numref:`sec_dropout` )控制全连接层的模型复杂度,而LeNet只使用了权重衰减。 -为了进一步扩充数据,AlexNet在训练时增加了大量的图像增强数据,如翻转、裁切和变色。 +AlexNet通过dropout(:numref:`sec_dropout`)控制全连接层的模型复杂度,而LeNet只使用权重衰减。 +为了进一步扩充数据,AlexNet的训练增加了大量的图像增强数据,如翻转、裁切和变色。 这使得模型更健壮,更大的样本量有效地减少了过拟合。 我们将在 :numref:`sec_image_augmentation` 中更详细地讨论数据扩充。 @@ -208,7 +214,7 @@ def net(): ]) ``` -我们构造了一个高度和宽度都为224的单通道数据,来观察每一层输出的形状。 +我们构造了一个高度和宽度都为224的单通道数据,来观察每一层的输出形状。 它与 :numref:`fig_alexnet` 中的AlexNet架构相匹配。 ```{.python .input} @@ -237,9 +243,9 @@ for layer in net().layers: ## 读取数据集 -尽管本文中AlexNet是在ImageNet上进行训练的,但我们在这里使用的是Fashion-MNIST数据集。因为即使在现代GPU上,训练ImageNet模型,同时使其收敛可能需要数小时或数天的时间。 -将AlexNet直接应用于Fashion-MNIST的一个问题是,Fashion-MNIST的图像分辨率($28 \times 28$像素)低于ImageNet图像。 -为了解决这个问题,我们将它们增加到 $224 \times 224$(通常来讲这不是一个明智的做法,但我们在这里这样做是为了有效使用AlexNet结构)。 +尽管本文中AlexNet是在ImageNet上进行训练的,但我们在这里使用的是Fashion-MNIST数据集,因为即使在现代GPU上,训练ImageNet模型以使其收敛可能需要数小时或数天的时间。 +将AlexNet直接应用于Fashion MNIST的一个问题是,它的图像分辨率($28 \times 28$像素)低于ImageNet图像。 +为了解决这个问题,我们将它们增加到 $224 \times 224$(通常来讲这不是一个明智的做法,但我们在这里这样做是为了有效使用AlexNet架构)。 我们使用 `d2l.load_data_fashion_mnist` 函数中的 `resize` 参数执行此调整。 ```{.python .input} @@ -250,7 +256,7 @@ train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=224) ## 训练AlexNet -现在,我们可以开始训练AlexNet了。与 :numref:`sec_lenet` 中的LeNet相比,这里的主要变化是使用更小的学习速率训练,这是因为网络更深更广、图像分辨率更高,训练卷积神经网络就更昂贵。 +现在,我们可以开始训练AlexNet了。与 :numref:`sec_lenet` 中的LeNet相比,这里的主要变化是使用更小的学习速率训练,这是因为网络越深越广,图像分辨率越高,训练卷积就越昂贵。 ```{.python .input} #@tab all @@ -261,7 +267,7 @@ d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr) ## 小结 * AlexNet的结构与LeNet相似,但使用了更多的卷积层和更多的参数来拟合大规模的ImageNet数据集。 -* 今天,AlexNet已经被更有效的结构所超越,但它是从浅层网络到深层网络的关键一步。 +* 今天,AlexNet已经被更有效的体系结构所超越,但它是从浅层网络到深层网络的关键一步。 * 尽管AlexNet的代码只比LeNet多出几行,但学术界花了很多年才接受深度学习这一概念,并应用其出色的实验结果。这也是由于缺乏有效的计算工具。 * Dropout、ReLU和预处理是提升计算机视觉任务性能的其他关键步骤。 @@ -271,11 +277,11 @@ d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr) 1. AlexNet对于Fashion-MNIST数据集来说可能太复杂了。 1. 尝试简化模型以加快训练速度,同时确保准确性不会显著下降。 1. 设计一个更好的模型,可以直接在 $28 \times 28$ 图像上工作。 -1. 修改批量大小,并观察模型精度和GPU显存变化。 +1. 修改批量大小,并观察模型精度和GPU内存变化。 1. 分析了AlexNet的计算性能。 - 1. 在AlexNet中主要是哪部分占用显存? + 1. 在AlexNet中主要是哪部分占用内存? 1. 在AlexNet中主要是哪部分需要更多的计算? - 1. 计算结果时显存带宽如何? + 1. 计算结果时内存带宽如何? 1. 将dropout和ReLU应用于LeNet-5,效果有提升吗?再试试预处理会怎么样? :begin_tab:`mxnet` diff --git a/chapter_convolutional-modern/googlenet.md b/chapter_convolutional-modern/googlenet.md index 19f21026..6050eb1f 100644 --- a/chapter_convolutional-modern/googlenet.md +++ b/chapter_convolutional-modern/googlenet.md @@ -1,17 +1,17 @@ # 含并行连结的网络(GoogLeNet) :label:`sec_googlenet` -在2014年的ImageNet图像识别挑战赛中,一个名叫*GoogLeNet* :cite:`Szegedy.Liu.Jia.ea.2015` 的网络结构大放异彩。 -GoogLeNet吸收了NiN中串联网络的思想,并在此基础上做了改进。 +在2014年的ImageNet图像识别挑战赛中,一个名叫GoogLeNet :cite:`Szegedy.Liu.Jia.ea.2015` 的网络结构大放异彩。 +GoogLeNet吸收了NiN中网络串联网络的思想,并在此基础上做了很大改进。 这篇论文的一个重点是解决了什么样大小的卷积核最合适的问题。 毕竟,以前流行的网络使用小到 $1 \times 1$ ,大到 $11 \times 11$ 的卷积核。 本文的一个观点是,有时使用不同大小的卷积核组合是有利的。 -在本节中,我们将介绍一个稍微简化的GoogLeNet版本:我们省略了一些为稳定训练而添加的特殊特性,但是现在有了更好的训练算法,这些特性不是必要的。 +在本节中,我们将介绍个稍微简化的GoogLeNet版本:我们省略了一些为稳定训练而添加的特殊特性,但是现在有了更好的训练算法,这些特性不是必要的。 ## Inception块 -在GoogLeNet中,基本的卷积块被称为*Inception块*(Inception block)。这很可能得名于电影《盗梦空间》(Inception),因为电影中的一句话“我们需要走得更深”(“We need to go deeper”)。 +在GoogLeNet中,基本的卷积块被称为*Inception块*(Inception block),很可能得名于电影《盗梦空间》(Inception)。 ![Inception块的结构。](../img/inception.svg) :label:`fig_inception` @@ -19,8 +19,9 @@ GoogLeNet吸收了NiN中串联网络的思想,并在此基础上做了改进 如 :numref:`fig_inception` 所示,Inception块由四条并行路径组成。 前三条路径使用窗口大小为 $1\times 1$、$3\times 3$ 和 $5\times 5$ 的卷积层,从不同空间大小中提取信息。 中间的两条路径在输入上执行 $1\times 1$ 卷积,以减少通道数,从而降低模型的复杂性。 -第四条路径使用 $3\times 3$ 最大池化层,然后使用 $1\times 1$ 卷积层来改变通道数。 -这四条路径都使用合适的填充来使输入与输出的高和宽一致,最后我们将每条线路的输出在通道维度上连结,并构成Inception块的输出。在Inception块中,通常调整的超参数是每层输出通道的数量。 +第四条路径使用 $3\times 3$ 最大池化层,然后是 $1\times 1$ 卷积层来改变通道数。 +这四条路径都使用合适的填充来使输入与输出的高和宽一致,最后我们将每条线路的输出在通道维度上连结,并构成Inception块的输出。初始块的通常调整的超参数是每层输出通道的数量。 +在Inception块中,通常调整的超参数是每层输出通道的数量。 ```{.python .input} from d2l import mxnet as d2l @@ -121,19 +122,19 @@ class Inception(tf.keras.Model): ``` 那么为什么GoogLeNet这个网络如此有效呢? -首先我们考虑一下滤波器(filter)的组合,它们可以用各种滤波器尺寸探索图像,这意味着不同大小的滤波器可以有效地识别不同范围的图像细节。 +首先我们考虑一下滤波器(filter)的组合,他们可以探索各种滤波器尺寸的图像,这意味着不同大小的滤波器可以有效地识别不同范围的细节。 同时,我们可以为不同的滤波器分配不同数量的参数。 ## GoogLeNet 模型 如 :numref:`fig_inception_full` 所示,GoogLeNet 一共使用 9 个Inception块和全局平均池化层的堆叠来生成其估计值。Inception块之间的最大池化层可降低维度。 -第一个模块类似于 AlexNet 和 LeNet,Inception块的栈从VGG继承,全局平均池化层避免了在最后使用全连接层。 +第一个模块类似于 AlexNet 和 LeNet,Inception块的栈从VGG继承,全局平均池化层避免在最后使用全连接层。 ![GoogLeNet结构。](../img/inception-full.svg) :label:`fig_inception_full` -现在,我们逐一实现GoogLeNet的每个模块。第一个模块使用 64 个通道、 $7\times 7$ 卷积层。 +我们现在可以一块一块地实现GoogLeNet的模块。第一个模块使用 64 个通道、 $7\times 7$ 卷积层。 ```{.python .input} b1 = nn.Sequential() @@ -251,7 +252,7 @@ def b4(): ``` 第五模块包含输出通道数为 $256+320+128+128=832$ 和 $384+384+128+128=1024$ 的两个Inception块。 -其中每条路径通道数的分配思路和第三、第四模块中的一致,只是在具体数值上有所不同。 +其中每条路径的通道数的分配思路和第三、第四模块中的一致,只是在具体数值上有所不同。 需要注意的是,第五模块的后面紧跟输出层,该模块同 NiN 一样使用全局平均池化层,将每个通道的高和宽变成1。 最后我们将输出变成二维数组,再接上一个输出个数为标签类别数的全连接层。 @@ -293,7 +294,8 @@ def net(): ``` GoogLeNet 模型的计算复杂,而且不如 VGG 那样便于修改通道数。 -为了在Fashion-MNIST上有一个合理的训练时间,我们将输入的高和宽从 224 降到 96,这简化了计算。下面演示各个模块输出的形状变化。 +本节里我们将输入的高和宽从 224 降到 96 来简化计算。下 +面演示各个模块之间的输出的形状变化。 ```{.python .input} X = np.random.uniform(size=(1, 1, 96, 96)) @@ -319,9 +321,9 @@ for layer in net().layers: print(layer.__class__.__name__, 'output shape:\t', X.shape) ``` -## 训练 +## 训练模型 -和以前一样,我们使用 Fashion-MNIST 数据集来训练我们的模型。在训练之前,我们将图片转换为 $96 \times 96$ 分辨率。 +和以前一样,我们使用 Fashion-MNIST 数据集来训练我们的模型。在训练过程之前,我们将其图片转换为 $96 \times 96$ 分辨率。 ```{.python .input} #@tab all @@ -334,19 +336,19 @@ d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr) * Inception 块相当于一个有4条路径的子网络。它通过不同窗口形状的卷积层和最大池化层来并行抽取信息,并使用 $1×1$ 卷积层减少每像素级别上的通道维数从而降低模型复杂度。 -* GoogLeNet将多个设计精细的Inception块与其他层(卷积层、全连接层)串联起来。其中Inception块的通道数分配之比是在 ImageNet 数据集上通过大量的实验得来的。 +* GoogLeNet将多个设计精细的 Inception 块和其他层连接起来。其中 Inception 块的通道数分配之比是在ImageNet 数据集上通过大量的实验得来的。 * GoogLeNet 和它的后继者们一度是 ImageNet 上最有效的模型之一:它以较低的计算复杂度提供了类似的测试精度。 ## 练习 1. GoogLeNet 有数个后续版本。尝试实现并运行它们,然后观察实验结果。这些后续版本包括: - * 添加批量归一化层 :cite:`Ioffe.Szegedy.2015`(batch normalization),在 :numref:`sec_batch_norm`中将介绍)。 + * 添加批量归一化层 :cite:`Ioffe.Szegedy.2015`,(下一节将介绍)。 * 对 Inception 模块进行调整。 * 使用标签平滑(label smoothing)进行模型正则化 :cite:`Szegedy.Vanhoucke.Ioffe.ea.2016`。 * 加入残差连接 :cite:`Szegedy.Ioffe.Vanhoucke.ea.2017` ,(:numref:`sec_resnet`一节将介绍)。 1. 使用 GoogLeNet 的最小图像大小是多少? -1. 将 AlexNet、VGG 和 NiN 的模型参数大小与 GoogLeNet 进行比较。后两个网络结构是如何显著减少模型参数大小的? +1. 将 AlexNet、VGG 和 NiN 的模型参数大小与 GoogLeNet 进行比较。后两个网络架构是如何显著减少模型参数大小的? :begin_tab:`mxnet` [Discussions](https://discuss.d2l.ai/t/81) -- GitLab