<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>第 4 章 卷积神经网络 on 《从零学AI指南手册》</title>
		<link>https://mlwithme.github.io/dl/chapter04/</link>
		<description>Recent content in 第 4 章 卷积神经网络 on 《从零学AI指南手册》</description>
		<generator>Hugo</generator>
		<language>zh_CN</language>
		
		
		
		
			<atom:link href="https://mlwithme.github.io/dl/chapter04/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>4.1 卷积的概念</title>
				<link>https://mlwithme.github.io/dl/chapter04/102e183e8be94f46/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/dl/chapter04/102e183e8be94f46/</guid>
				<description>&lt;h1 id=&#34;第-4-章-卷积神经网络&#34;&gt;第 4 章 卷积神经网络&lt;a class=&#34;anchor&#34; href=&#34;#%e7%ac%ac-4-%e7%ab%a0-%e5%8d%b7%e7%a7%af%e7%a5%9e%e7%bb%8f%e7%bd%91%e7%bb%9c&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;经过整个第3章内容的介绍，相信各位读者对深度学习已经有了一个基本的概念，对于深层特征提取的重要性以及为什么要“深度”也应该有了一些清晰的认识。在接下来的这章内容中，我们将会开始介绍深度学习中的第1种网络结构——卷积神经网络（Convolutional Neural Network, CNN）。卷积神经网络在深度学习的历史中发挥了重要的作用，它是将生物学理论用于机器学习应用的关键例子，也是第一个表现良好的深度学习模型之一，同时还是第一个解决重要商业应用的神经网络，并且仍旧是当今深度学习商业应用的前沿[1]。在正式介绍卷积神经网络之前，我们先就卷积的相关概念和计算原理进行介绍。&lt;/p&gt;&#xA;&lt;h1 id=&#34;41-卷积的概念&#34;&gt;4.1 卷积的概念&lt;a class=&#34;anchor&#34; href=&#34;#41-%e5%8d%b7%e7%a7%af%e7%9a%84%e6%a6%82%e5%bf%b5&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在正式介绍卷积操作之前，我们将先从一个比较直观的角度来介绍卷积操作背后的思想、作用以及为什么需要用卷积操作来代替全连接操作。同时，为了能使得各位读者对深度学习的理念有更加深刻地认识，这里我们再次回顾一下深度学习的思想。&lt;/p&gt;&#xA;&lt;h2 id=&#34;411-深度学习的思想&#34;&gt;4.1.1 深度学习的思想&lt;a class=&#34;anchor&#34; href=&#34;#411-%e6%b7%b1%e5%ba%a6%e5%ad%a6%e4%b9%a0%e7%9a%84%e6%80%9d%e6%83%b3&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在第3章内容中，我们由线性回归和逻辑回归为基础延伸到了深度学习中的回归和分类模型，并且得出一个结论就是，对于输出层之前的所有层都可以将其看成是一个特征提取的过程，而且越靠后的隐藏层也就意味着提取得到的特征越抽象。在得到这些抽象特征后，我们再通过最后一层来完成特定场景下的任务，这也就是深度学习的核心思想，由此便可以将深度学习抽象成如图4-1所示的形式。&lt;/p&gt;&#xA;&lt;div align=center&gt;&#xA;&lt;img width=&#34;400&#34; src=&#34;https://mlwithme.github.io/images/dl/23021911816.jpg&#34;/&gt;&#xA;&lt;/div&gt;&#xA;&lt;center&gt;&#xA;  图 4-1. 深度学习抽象图&#xA;&lt;/center&gt;&#xA;&lt;p&gt;根据图4-1可知，对于深度学习来说最重要最核心的部分当然就是隐藏层的特征提取过程。经过第3章内容的介绍我们已经熟悉了通过深层前馈网络来对输入进行特征提取。那还有没有其它进行特征提取的方式呢？有，当然有，而且在深度学习中还属于是百花齐放式的有，例如我们接下来就介绍到的卷积操作就是其中之一。所以，进一步，我们还可以用下面这个图来表示深度学习的过程。&lt;/p&gt;&#xA;&lt;div align=center&gt;&#xA;&lt;img width=&#34;400&#34; src=&#34;https://mlwithme.github.io/images/dl/23021949237.jpg&#34;/&gt;&#xA;&lt;/div&gt;&#xA;&lt;center&gt;&#xA;  图 4-2. 深度学习抽象图&#xA;&lt;/center&gt;&#xA;&lt;p&gt;从图4-2中可以看出，我们可以通过不同的方式（技术）来对输入进行特征提取，然后再将提取得到的特征进行下一步的处理。因此，对于如何构造或者组合得到新的特征提取方式，也是深度学习中的一个重要研究方向。接下来，我们就开始对卷积操作进行介绍。&lt;/p&gt;&#xA;&lt;h2 id=&#34;412-卷积操作的作用&#34;&gt;4.1.2 卷积操作的作用&lt;a class=&#34;anchor&#34; href=&#34;#412-%e5%8d%b7%e7%a7%af%e6%93%8d%e4%bd%9c%e7%9a%84%e4%bd%9c%e7%94%a8&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;卷积（Convolution）操作它算得上是深度学习中最重要的技术之一，其最早可以追溯到上世纪八十年代。直到今天，近四十年过去了，而这项技术依然是经久不衰地被用于各类网络模型中。说了这么多，那什么又是卷积呢？很多初学者看到在第一次知晓“卷积”这两个字后，总会陷入到数学概念中的那个卷积里来理解卷积，也就是通常会看到这么一句话来解释什么是卷积：卷积是通过两个函数$f$和$g$ 来导出第3个函数的一种数学运算，即表征函数$f$与$g$经过翻转和平移的重叠部分函数值乘积对重叠长度的积分[2]。&lt;/p&gt;&#xA;&lt;p&gt;看完上面这句定义什么感受呢？如果我们没有猜错那应该是有种看了不如不看，看了反而更加畏惧的感觉。既然概念如此晦涩，那我们就从“卷积能够干什么”的角度来看看卷积到底做了什么。&lt;/p&gt;&#xA;&lt;p&gt;从作用上来讲，卷积操作是用于对图像进行特征提取，并且还是主要用于图像处理领域中的一种技术。不过记性好的读者可能还记得我们在&lt;a href=&#34;https://mlwithme.github.io/dl/chapter03/55967b0f642b4509&#34;&gt;3.6节&lt;/a&gt;内容中曾介绍过如何通过深层全连接网络来对图像进行分类。那既然全连接网络也能对图片进行特征提取那我们为什么还需要卷积操作呢？两者又有什么样的差异呢？&lt;/p&gt;&#xA;&lt;p&gt;通常，从我们人类的思维角度来看，对于任何一个用于图像分类的模型来说其都应该满足如下几点特性：①平移不变性；②旋转不变性；③缩放不变性；④明暗不变性。同时，在生物体中满足这样类似特性的细胞被称之为“祖母细胞”（Grandmother Cell）。当神经元看到他祖母的照片时该神经元被激活，无论此时他的祖母是出现在照片的左边或右边，也无论是处于明处还是暗处[1]。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. 平移不变性&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;所谓平移不变性（Translation Invariance），指的是不管图片中的物体如何移动模型都应该能够将其识别出来，如图4-3所示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&#xA;&lt;img width=&#34;450&#34; src=&#34;https://mlwithme.github.io/images/dl/000213.png&#34;/&gt;&#xA;&lt;/div&gt;&#xA;&lt;center&gt;&#xA;  图 4-3. 平移不变性&#xA;&lt;/center&gt;&#xA;&lt;p&gt;如图4-3所示，对于图中的3种情况来说，在我们人类眼中不管它移动到哪个位置，我们都会认为它是同一个事物，因此希望网络模型也能够具备这样的能力。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2. 旋转不变性&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;所谓旋转不变性（Rotation Invariance），指的是不管图片中物体的角度如何变化，网络模型都应该具有将其视为同一个事物的能力，如图4.4所示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&#xA;&lt;img width=&#34;450&#34; src=&#34;https://mlwithme.github.io/images/dl/000214.png&#34;/&gt;&#xA;&lt;/div&gt;&#xA;&lt;center&gt;&#xA;  图 4-4. 旋转不变性&#xA;&lt;/center&gt;&#xA;&lt;p&gt;&lt;strong&gt;3.  缩放不变性&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;所谓缩放不变性（Size Invariance），指的是不管图片中的物体被放大还是缩小，网络模型也能够具有将其识别出来的能力，如图4.5所示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&#xA;&lt;img width=&#34;450&#34; src=&#34;https://mlwithme.github.io/images/dl/000215.png&#34;/&gt;&#xA;&lt;/div&gt;&#xA;&lt;center&gt;&#xA;  图 4-5. 缩放不变性&#xA;&lt;/center&gt;&#xA;&lt;p&gt;&lt;strong&gt;4. 明暗不变性&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;所谓明暗不变性（Illumination Invariance），指的是不管图片中物体的明暗程度如何变化，网络模型都能够将其识别出来，如图4.6所示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&#xA;&lt;img width=&#34;450&#34; src=&#34;https://mlwithme.github.io/images/dl/000216.png&#34;/&gt;&#xA;&lt;/div&gt;&#xA;&lt;center&gt;&#xA;  图 4-6. 明暗不变性 [3]&#xA;&lt;/center&gt;&#xA;&lt;p&gt;可以看出，对于上述这4点特性也非常符合人类观察事物的直觉。因此，对于图像识别模型来说不能因为物体的位置或者角度发生了改变就需要重写训练模型。那什么样的特征提取方式能够同时满足这4项特性呢？&lt;/p&gt;&#xA;&lt;h2 id=&#34;413-卷积操作的原理&#34;&gt;4.1.3 卷积操作的原理&lt;a class=&#34;anchor&#34; href=&#34;#413-%e5%8d%b7%e7%a7%af%e6%93%8d%e4%bd%9c%e7%9a%84%e5%8e%9f%e7%90%86&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;为了回答上面这个问题，下面我们就来对全连接操作和卷积操作进行一个比较，看看两者在工作原理上有何不同。下面我们以在大小为4x4的图片中识别是否有下图4-7所示的“横折”为例进行介绍。&lt;/p&gt;</description>
			</item>
			<item>
				<title>4.2 卷积的计算过程</title>
				<link>https://mlwithme.github.io/dl/chapter04/5b3e3152e9e54f4f/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/dl/chapter04/5b3e3152e9e54f4f/</guid>
				<description>&lt;h1 id=&#34;42-卷积的计算过程&#34;&gt;4.2 卷积的计算过程&lt;a class=&#34;anchor&#34; href=&#34;#42-%e5%8d%b7%e7%a7%af%e7%9a%84%e8%ae%a1%e7%ae%97%e8%bf%87%e7%a8%8b&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在上一节内容中，我们详细介绍了卷积操作的核心理念与思想，并通过对比全连接操作与卷积操作在识别同一元素的不同方式，进一步介绍了卷积操作的核心思想。但这仅仅只是对卷积操作有了一个总体的认识，其中仍有许多细节的地方没有进行介绍。例如：什么是多卷积核卷积？卷积操作具体是怎么计算的？什么是深度卷积？哪些场景下可以运用卷积操作，仅仅只是图片吗？因此，在接下来的这节内容中，我们将主要从这4个方面来继续卷积操作的工作原理。&lt;/p&gt;&#xA;&lt;h2 id=&#34;421-多卷积核&#34;&gt;4.2.1 多卷积核&lt;a class=&#34;anchor&#34; href=&#34;#421-%e5%a4%9a%e5%8d%b7%e7%a7%af%e6%a0%b8&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. 卷积&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;从本质上讲，卷积的计算过程其实同全连接一样也是各个神经元之间的线性组合并进行非线性变换，只是卷积操作在进行线性组合时选择的是特定位置上的神经元。下面我们首先通过几张示意图来直观感受一下整个卷积的过程，如图4-12所示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&#xA;&lt;img width=&#34;550&#34; src=&#34;https://mlwithme.github.io/images/dl/23022032843.jpg&#34;/&gt;&#xA;&lt;/div&gt;&#xA;&lt;center&gt;&#xA;  图 4-12. 卷积计算示意图&#xA;&lt;/center&gt;&#xA;&lt;p&gt;如图4-12所示从左往右为整个卷积的计算过程，可以发现卷积操作其实就是每次取一个特定大小的矩阵$F$（$5\times5$矩阵中的的阴影部分），然后将其对输入$X$（图中$5\times5$的矩阵）依次扫描并进行内积的运算过程。在图4-12中，阴影部分每移动一个位置就会计算得到一个卷积值（$3\times3$矩阵中的阴影部分），当$F$扫描完成后就得到了整个卷积后的结果$Y$（矩阵）。&lt;/p&gt;&#xA;&lt;p&gt;同时，我们将这个特定大小的矩阵$F$称为卷积核（Convolutional Kernel）或过滤器（Filter）亦或是探测器（Detector），它可以是一个也可以是多个，并且卷积核也可以是一个矩形；将卷积后的结果$Y$称为特征图（Feature Map），并且每一个卷积核卷积后都会得到一个对应的特征图；最后，对于输入$X$的形状，都会用3个维度来进行表示，即宽（Width）、高（High）和通道（Channel），例如图4-12中输入$X$的形状为&lt;code&gt;[5,5,1]&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2. 多卷积核&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;在上面我们提到了卷积核的个数还可以是多个，那我们为什么需要多个卷积核进行卷积呢？在&lt;a href=&#34;https://mlwithme.github.io/dl/chapter04/102e183e8be94f46&#34;&gt;4.1节&lt;/a&gt;内容中我们介绍到，对于一个卷积核可以认为是具有识别某一类元素（特征）的能力，而对于一些复杂结构的数据来说仅仅只是通过一类特征来进行辨识往往是不够的，因此，通常来说我们都会通过多个不同的卷积核来对输入进行特征提取得到多个特征图，然再输入到后续的网络中进行后续任务。&lt;/p&gt;&#xA;&lt;div align=center&gt;&#xA;&lt;img width=&#34;500&#34; src=&#34;https://mlwithme.github.io/images/dl/23022012380.jpg&#34;/&gt;&#xA;&lt;/div&gt;&#xA;&lt;center&gt;&#xA;  图 4-13. 多卷积核特征图&#xA;&lt;/center&gt;&#xA;&lt;p&gt;如图4-13所示，左边为原始的输入图片，右边为通过两个卷积核卷积之后得到的特征图，可以发现对于同一个输入通过两个不同的卷积核对其进行卷积特征提取，最后便能得到两个不同的特征图。从图4-13右侧的特征图可以发现，上面的特征图在锐利度方面明显会强于下面的特征图，而这这也是使用多卷积核进行卷积的意义，探测到多种特征属性以有利于后续的下游任务。&lt;/p&gt;&#xA;&lt;h2 id=&#34;422-卷积的计算过程&#34;&gt;4.2.2 卷积的计算过程&lt;a class=&#34;anchor&#34; href=&#34;#422-%e5%8d%b7%e7%a7%af%e7%9a%84%e8%ae%a1%e7%ae%97%e8%bf%87%e7%a8%8b&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;到此为止， 对于卷积的原理和意义就算是交待完了，并且通过上面这些图示我们也有了更为直观的了解。但所谓数无形时少直觉，形少数时难入微，因此，下面我们就以单通道（灰度图）和三通道的输入来实际示例一下整个卷积的计算过程。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. 单通道单卷积核&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;如图4-14所示，现在有一张形状为&lt;code&gt;[5,5,1]&lt;/code&gt;的灰度图，我们需要用图4-14右边的卷积核对其进行卷积处理，同时再考虑到偏置的作用。那么其计算过程是怎么样的呢？&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;300&#34; src=&#34;https://mlwithme.github.io/images/dl/000239.png&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 4-14. 输入与卷积&lt;/center&gt;&#xA;&lt;p&gt;如图4-15所示，右边为卷积后的特征图，左边为卷积核对输入图片左上方进行卷积时的示意图，其计算过程变为卷积核与对应输入位置上的内积和再加上偏置。&lt;/p&gt;&#xA;&lt;div align=center&gt;&#xA;&lt;img width=&#34;340&#34; src=&#34;https://mlwithme.github.io/images/dl/2108132033335252292.jpg&#34;/&gt;&#xA;&lt;/div&gt;&#xA;&lt;center&gt;&#xA;  图 4-15. 单通道单卷积（一）&#xA;&lt;/center&gt;&#xA;&lt;p&gt;因此，对于这个部分的计算过程有&#xA;&lt;/p&gt;&#xA;$$&#xA;\underbrace{1\cdot0+2\cdot0+0\cdot1-1\cdot0+1\cdot1+0\cdot1+2\cdot1-1\cdot0-2\cdot1}_{\text{kernel}}\underbrace{\;\;+1\;\;}_{\text{bias}}=2\tag{4-1}&#xA;$$&lt;p&gt;&#xA;同理，对于最右下角部分的卷积计算过程为&lt;/p&gt;&#xA;&lt;div align=center&gt;&#xA;&lt;img width=&#34;340&#34; src=&#34;https://mlwithme.github.io/images/dl/2108132034342626546.jpg&#34;/&gt;&#xA;&lt;/div&gt;&#xA;&lt;center&gt;&#xA;  图 4-16. 单通道单卷积（二）&#xA;&lt;/center&gt;&#xA;$$&#xA;2\cdot0+1\cdot0+0\cdot1+0\cdot0+0\cdot1+0\cdot1-1\cdot1+0\cdot0-0\cdot1+1=0\tag{4-2}&#xA;$$&lt;p&gt;&#xA;因此，对于最后卷积的结果我们得到的将是一个如图4-16右侧所示形状为&lt;code&gt;[3,3,1]&lt;/code&gt;的特征图。到此我们就把单通道单卷积的计算过程介绍完了。下面再来看单通道多卷积核的例子。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2. 单通道多卷积核&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;如图4-17所示，左边依旧为输入矩阵，现在要用右边所示的两个卷积核对其进行卷积处理。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;400&#34; src=&#34;https://mlwithme.github.io/images/dl/000243.png&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 4-17. 单通道多卷积（一）&lt;/center&gt;&#xA;&lt;p&gt;同时可以看出，在图4-17中右边的第1个卷积核就是图4-14里的卷积核，因此其计算结果同图4-16中的计算结果。对于旁边的卷积核，其计算过程如图4-18所示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;360&#34; src=&#34;https://mlwithme.github.io/images/dl/23022027323.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 4-18. 单通道多卷积（二）&lt;/center&gt;&#xA;&lt;p&gt;从图4-18可以看出，其计算过程与图4-15中的计算过程并无差异。最后我们便能得到如图4-19右侧所示形状为&lt;code&gt;[3,3,2]&lt;/code&gt;的卷积特征图，其中2表示两个特征通道。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;340&#34; src=&#34;https://mlwithme.github.io/images/dl/23022046711.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 4-19. 单通道多卷积结果&lt;/center&gt;&#xA;&lt;p&gt;到此，对于单通道的卷积计算过程就介绍完了。但通常情况下，我们遇到更多的是对多通道输入进行卷积处理，例如包含有RGB三个通道的彩色图片等。接下来，我们就开始介绍多通道的卷积计算过程。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;3. 多通道单卷积核&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;对于多通道的卷积过程，总体上还是还是同之前的一样，都是每次选取特定位置上的神经元进行卷积，然后依次移动直到卷积结束。下面先来看看多通道单卷积核的计算过程。&lt;/p&gt;</description>
			</item>
			<item>
				<title>4.3 填充和池化</title>
				<link>https://mlwithme.github.io/dl/chapter04/762f60de801a4ccd/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/dl/chapter04/762f60de801a4ccd/</guid>
				<description>&lt;h1 id=&#34;43-填充和池化&#34;&gt;4.3 填充和池化&lt;a class=&#34;anchor&#34; href=&#34;#43-%e5%a1%ab%e5%85%85%e5%92%8c%e6%b1%a0%e5%8c%96&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在前面两节内容中，我们分别介绍了卷积的思想与原理以及卷积操作在各类场景下的具体计算过程。在本节内容中，我们将主要围绕着卷积后形状的计算、卷积中的池化操作以及PyTorch中卷积操作的用法这三方面来进行介绍。在介绍完本节内容后，对于卷积的基础知识就算介绍完了，后面我们将开始对一些经典的卷积网络进行介绍。&lt;/p&gt;&#xA;&lt;h2 id=&#34;431-填充操作&#34;&gt;4.3.1 填充操作&lt;a class=&#34;anchor&#34; href=&#34;#431-%e5%a1%ab%e5%85%85%e6%93%8d%e4%bd%9c&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在&lt;a href=&#34;https://mlwithme.github.io/dl/chapter04/5b3e3152e9e54f4f&#34;&gt;4.2节&lt;/a&gt;内容中，我们详细介绍了卷积操作中的卷积计算过程，可以发现原始输入在经过卷积操作之后形状都不约而同地变小了，如果我们不想在卷积之后改变特征图的大小又该怎么做呢？为了保持卷积后特征图的大小与输入时一致，通常来说可以通过填充（Padding）输入特征图的方式实现，也就是把输入的形状变大，这样卷积后的大小便可以与原始输入的特征图保持一致。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;350&#34; src=&#34;https://mlwithme.github.io/images/dl/000272.png&#34;/&gt;&lt;/div&gt;&lt;div style=&#34;text-align: center;&#34;&gt; 图 4-26. 卷积填充图&lt;/div&gt;&#xA;&lt;p&gt;如图4-26所示，左边是形状为$[5,5]$的原始特征图 ，右边为填充后的特征图，其大小变成了$[7,7]$。对左右两边均用大小为$[3,3]$的卷积核进行卷积操作，那么卷积后左边的大小为$[3,3]$，右边的大小为$[5,5]$。可以发现，经过填充处理后便能够使得卷积后特征图的大小与输入时的大小保持一致。同时，根据图4-26可以看出，如果使用越大的卷积核进行卷积操作那么将会得到越小的输出特征图，最终则需要对原始输入填充更大的范围来保持输出特征图的大小不变。当然，如果是多通道的话，则对应在每个通道都这样填充即可。&lt;/p&gt;&#xA;&lt;p&gt;进一步，对于卷积后特征图的形状该如何计算呢？&lt;/p&gt;&#xA;&lt;h2 id=&#34;432-形状计算&#34;&gt;4.3.2 形状计算&lt;a class=&#34;anchor&#34; href=&#34;#432-%e5%bd%a2%e7%8a%b6%e8%ae%a1%e7%ae%97&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;现在用$W$来表示输入特征图的宽度，$F$表示卷积核的宽度，$S$表示卷积核每移动一次的步长，$P$表示填充的范围（即多少圈），那么此时卷积后特征图的宽度为&#xA;&lt;/p&gt;&#xA;$$&#xA;H=\lceil\frac{W+2P-F+1}{S}\rceil=\lfloor\frac{W+2P-F}{S}\rfloor+1\tag{4-4}&#xA;$$&lt;p&gt;&#xA;其中$\lceil x\rceil$表示对$x$向上取整， $\lfloor x\rfloor$表示对$x$向下取整。公式(4-4)中的两种计算方法都行，记住其中一种即可。&lt;/p&gt;&#xA;&lt;p&gt;例如，对于图4-26中的示例来说，$W=5$，$F=3$，$S=1$，$P=1$，则卷积后输出特征图的大小为&#xA;&lt;/p&gt;&#xA;$$&#xA;H=\lceil\frac{5+2\cdot1-3+1}{1}\rceil=5\tag{4-5}&#xA;$$&lt;p&gt;&#xA;如果有输入形状为$[32,32,3]$的特征图，卷积核的形状为$[5,5,3,64]$，步长为$S=2$，$P=2$那么卷积后的形状则为&#xA;&lt;/p&gt;&#xA;$$&#xA;H=\lceil\frac{32+2\cdot2-5+1}{2}\rceil=16\tag{4-6}&#xA;$$&lt;p&gt;&#xA;即$[16,16,64]$的特征图。&lt;/p&gt;&#xA;&lt;p&gt;当然，这里有一个快速计算的技巧，如果输入$W=w$，填充范围$P=p$，卷积核的宽度$F=2p+1$，步长$S=s$，则输出$H=\lfloor\frac{w}{s}\rfloor$。&lt;/p&gt;&#xA;&lt;h2 id=&#34;433-卷积示例代码&#34;&gt;4.3.3 卷积示例代码&lt;a class=&#34;anchor&#34; href=&#34;#433-%e5%8d%b7%e7%a7%af%e7%a4%ba%e4%be%8b%e4%bb%a3%e7%a0%81&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在PyTorch中，我们可以借助卷积层&lt;code&gt;nn.Conv2d()&lt;/code&gt;模块来快速完成一次卷积操作的计算过程，示例代码如下所示：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#0e84b5;font-weight:bold&#34;&gt;torch&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#0e84b5;font-weight:bold&#34;&gt;torch.nn&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#0e84b5;font-weight:bold&#34;&gt;nn&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#bb60d5&#34;&gt;__name__&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt;     inputs &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;randn([&lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;32&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;32&lt;/span&gt;], dtype&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;torch&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;float32)  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;     cnn_op &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; nn&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;Conv2d(in_channels&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;, out_channels&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;10&lt;/span&gt;, &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;6&lt;/span&gt;                         kernel_size&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;, stride&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;, padding&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;7&lt;/span&gt;     result &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; cnn_op(inputs)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;8&lt;/span&gt;     &lt;span style=&#34;color:#007020&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;输入数据的形状为:&amp;#34;&lt;/span&gt;, inputs&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;shape)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;9&lt;/span&gt;     &lt;span style=&#34;color:#007020&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;结果的形状:&amp;#34;&lt;/span&gt;, result&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;shape)  &lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# width: 32/1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第4行是定义一个4维输入张量，形状为&lt;code&gt;[batch_size,in_channels,high,width]&lt;/code&gt;，其中&lt;code&gt;in_channels&lt;/code&gt;表示输入特征图的通道数。这里需要注意的是，对于不同的深度学习框架来说类似&lt;code&gt;Conv2d&lt;/code&gt;这样操作其接受的输入的形状可能不尽相同，例如TensorFlow中&lt;code&gt;Conv2d&lt;/code&gt;所模型的形状便是&lt;code&gt;[batch_size,high,width,in_channels]&lt;/code&gt;，即将通道数放到了最后一个维度。第5~6行则是指定相应的参数来实例化类&lt;code&gt;Conv2d&lt;/code&gt;，其中&lt;code&gt;out_channels&lt;/code&gt;表示卷积核的个数，&lt;code&gt;kernel_size&lt;/code&gt;表示卷积核的大小（也可以通过&lt;code&gt;[high,width]&lt;/code&gt;来分别指定卷积核的高和宽），&lt;code&gt;stride&lt;/code&gt;表示步长，&lt;code&gt;padding&lt;/code&gt;表示填充范围。&lt;/p&gt;&#xA;&lt;p&gt;最后上述代码运行结束后便可以得到如下所示结果：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; 输入数据的形状为: torch&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;Size([&lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;32&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;32&lt;/span&gt;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt; 结果的形状: torch&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;Size([&lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;10&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;32&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;32&lt;/span&gt;])&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;根据上述输出结果可知，原始数量5、宽度为32、通道数为3的输入特征图，经过卷积操作后变成了数量5、宽度为32、通道数为10的输入特征图。&lt;/p&gt;&#xA;&lt;p&gt;以上完整示例代码可以参见&lt;code&gt;Code/Chapter04/C02_PaddingPooling/main.py&lt;/code&gt;文件。&lt;/p&gt;&#xA;&lt;h2 id=&#34;434-池化操作&#34;&gt;4.3.4 池化操作&lt;a class=&#34;anchor&#34; href=&#34;#434-%e6%b1%a0%e5%8c%96%e6%93%8d%e4%bd%9c&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;池化操作对于卷积神经网络来说可以算得上是一个必不可少的步骤，几乎绝大多数卷积网络都用到了池化来提升网络模型的精度，而所谓池化可以将其看作是一个信息筛选或者过滤的操作。 池化操作可以看作是使用某一位置的相邻输出的总体统计特征来代替网络在该位置的输出。例如最大池化（Max Pooling）会给出相邻矩形区域内的最大值作为该位置的输出。除此之外还有最小池化（Min Pooling）和平均池化（Average Pooling）等。下面我们来对池化操作的具体计算步骤进行介绍。&lt;/p&gt;</description>
			</item>
			<item>
				<title>4.4 LeNet5网络</title>
				<link>https://mlwithme.github.io/dl/chapter04/c8af5d84174b4420/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/dl/chapter04/c8af5d84174b4420/</guid>
				<description>&lt;h1 id=&#34;44-lenet5网络&#34;&gt;4.4 LeNet5网络&lt;a class=&#34;anchor&#34; href=&#34;#44-lenet5%e7%bd%91%e7%bb%9c&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在介绍完卷积、池化技术的基本思想和原理后，下面开始介绍本书中第一个基于卷积运算的卷积神经网络LeNet5网络模型 [1]。&lt;/p&gt;&#xA;&lt;h2 id=&#34;441-lenet5动机&#34;&gt;4.4.1 LeNet5动机&lt;a class=&#34;anchor&#34; href=&#34;#441-lenet5%e5%8a%a8%e6%9c%ba&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;LeNet5网络模型是20世纪90年代AT&amp;amp;T神经网络小组中杨立昆等人所提出的，其最初的目的是用于读取支票上的手写体数字 [2]。在&lt;a href=&#34;https://mlwithme.github.io/dl/chapter03/381bbd56509e4a6f&#34;&gt;3.7节&lt;/a&gt;内容中，我们介绍过如何通过多层感知机来完成手写体识别这一分类任务，但这样做的缺点在于利用全连接层来对图片进行特征提取会严重丢失其在相邻位置上的空间信息。在&lt;a href=&#34;https://mlwithme.github.io/dl/chapter04/5b3e3152e9e54f4f&#34;&gt;4.2节&lt;/a&gt;内容中我们也谈到，利用全连接层来对图像进行特征提取：一是不能满足平移不变性、旋转不变性等，二是模型中会包含有大量的冗余参数。基于这样的问题，人们开始尝试通过卷积神经网络来进行解决，而LeNet5模型在当时达到了手写字数字识别的最先进水平 [3]。&lt;/p&gt;&#xA;&lt;h2 id=&#34;442-lenet5结构&#34;&gt;4.4.2 LeNet5结构&lt;a class=&#34;anchor&#34; href=&#34;#442-lenet5%e7%bb%93%e6%9e%84&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;如图4-30所示便是LeNet5网络的模型结构图，需要注意的是这里的5是指包含有5个网络权重层（不含参数的层不计算在内，这一点我们在&lt;a href=&#34;https://mlwithme.github.io/dl/chapter03/75c5fa7839174c16&#34;&gt;3.1.7节&lt;/a&gt;中也提到过）的网络层，即2个卷积层和3个全连接层。&lt;/p&gt;&#xA;&lt;div align=center&gt;&#xA;&lt;img width=&#34;750&#34; src=&#34;https://mlwithme.github.io/images/dl/23022557778.jpg&#34;/&gt;&#xA;&lt;/div&gt;&#xA;&lt;div style=&#34;text-align: center;&#34;&gt;&#xA;    图 4-30. LeNet5网络结构图&#xA;&lt;/div&gt;&#xA;&lt;p&gt;由图4-30可知，原始输入的形状为&lt;code&gt;[1,32,32]&lt;/code&gt;，经过第1个卷积层处理后的形状为&lt;code&gt;[6,28,28]&lt;/code&gt;，接着经过最大池化处理后的形状为&lt;code&gt;[6,14,14]&lt;/code&gt;，进一步第2次卷积处理的形状为&lt;code&gt;[16,10,10]&lt;/code&gt;，然后再最大池化后的形状为&lt;code&gt;[16,5,5]&lt;/code&gt;，最后是连续的3个全连接层，其维度分别是120、84和10。虽然图4-30最后一层写的是高斯层，即对最后输出的每个类别采用了欧式径向基函数来衡量其与真实标签之间的损失，但是这里我们直接使用一个全连接层并通过交叉熵损失来代替即可。&lt;/p&gt;&#xA;&lt;p&gt;进一步，根据图4-30中各层输出的结果，我们可以推算得到其各层对应的超参数及卷积核形状应如表1所示。&lt;/p&gt;&#xA;&lt;div style=&#34;text-align: center;&#34;&gt;&#xA;    表 4-1. LeNet5模型参数表&#xA;&lt;/div&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;网络层&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;输入形状&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;参数&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;输出形状&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;参数量&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;①卷积层&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,1,32,32]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;kernel=[1,5,5,6]&lt;/code&gt;,&lt;code&gt;S=1&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,6,28,28]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;$1\times5\times5\times6+6=156$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;池化层&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,6,28,28]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;kernel=[2,2]&lt;/code&gt;,&lt;code&gt;S=2&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,6,14,14]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;$0$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;②卷积层&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,6,14,14]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;kernel=[6,5,5,16]&lt;/code&gt;,&lt;code&gt;S=1&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,16,10,10]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;$6\times5\times5\times16+16=2416$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;池化层&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,16,10,10]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;kernel=[2,2]&lt;/code&gt;,&lt;code&gt;S=2&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,16,5,5]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;$0$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;③全连接层&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,400]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;weight=[400,120]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,120]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;$400\times120+120=48120$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;④全连接层&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,120]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;weight=[120,84]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,84]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;$120\times84+84=10164$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;⑤全连接层&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,84]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;weight=[84,10]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,10]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;$84\times10+10=850$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;从表4-1可以看出每层权重参数的具体情况，包括参数的形状和数量等。因此，对于整个LeNet5网络来说，其参数量约为$156+2416+48120+10164+850\approx62000$。假如每个权重参数均使用32位浮点数进行表示，则每个权重参数将占用4个字节，则LeNet5模型的总字节为248000字节，即约0.24MB。&lt;/p&gt;&#xA;&lt;p&gt;LeNet5的网络结构总体上来说比较简单，它通过多次卷积和池化的组合来对输入进行特征提取，最后再以全连接网络进行分类。这种多次卷积加池化的组合看似简单粗暴，但在实际问题中却有着不错的效果，以至于后续出现了比它更深的卷积网络，后续我们也将会陆续进行介绍。&lt;/p&gt;&#xA;&lt;h2 id=&#34;443-lenet5实现&#34;&gt;4.4.3 LeNet5实现&lt;a class=&#34;anchor&#34; href=&#34;#443-lenet5%e5%ae%9e%e7%8e%b0&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在介绍完了LeNet5的网络结构后，下面我们开始介绍如何通过PyTorch框架来快速对其进行实现。首先需要明白的是在利用框架实现一个网络模型时，只需要写出网络对应的前向传播过程即可，剩余其它部分的编码基本上只需要按部就班大部分可以进行通用。以下完整示例代码可以参见&lt;code&gt;Code/Chapter04/C03_LeNet5/LeNet5.py&lt;/code&gt;文件。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. 前向传播&lt;/strong&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>4.5 AlexNet网络</title>
				<link>https://mlwithme.github.io/dl/chapter04/de007462967e4701/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/dl/chapter04/de007462967e4701/</guid>
				<description>&lt;h1 id=&#34;45-alexnet网络&#34;&gt;4.5 AlexNet网络&lt;a class=&#34;anchor&#34; href=&#34;#45-alexnet%e7%bd%91%e7%bb%9c&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在第3章及本章开篇内容中，我们多次提及如何有效地对输入数据进行特征提取，然后再将提取得到的特征输入到下游任务模型是深度学习中的一个重要研究方向，而这又尤其体现在图像处理领域中。自卷积操作问世以来，如何设计一个有效的网络结构就成为了一个热门的研究方向。研究者们通过设计不同网络结构来对输入的图像进行特征提取，并且都希望设计出的模型能够表现出强大的学习能力，以此来提高下游任务的精度。&lt;/p&gt;&#xA;&lt;p&gt;2012年AlexNet[1]模型在ImageNet图像识别（关于该数据集的介绍见&lt;a href=&#34;https://mlwithme.github.io/dl/chapter05/211b26bdd8f248ac&#34;&gt;5.4.1节&lt;/a&gt;内容）大赛中一战成名，在1000分类的测试集上分别取得了$62\%$的Top-1准确率和$83\%$的Top-5（即预测概率最大的前5个中包含有正确标签）的成绩，其名称也取自于第一作者的名字Alex Krizhevsky。在本节内容中我们将会详细介绍AlexNet网络模型的原理及其实现过程。&lt;/p&gt;&#xA;&lt;h2 id=&#34;451-alexnet动机&#34;&gt;4.5.1 AlexNet动机&lt;a class=&#34;anchor&#34; href=&#34;#451-alexnet%e5%8a%a8%e6%9c%ba&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;虽然传统的机器学习模型可以通过扩充数据集来提升模型在图像识别这方面的效果，但是在现实环境中物体的呈现形式变化多样，因此想要模型有一个较好的效果则需要使用更大的数据集。同时，为了使得模型能够从数百万张图片中学习识别上千个类别我们就需要一个具有强大学习能力的模型。然而，在这样一个复杂的任务场景中即使是使用像ImageNet这样大规模的数据集也无法完全解决这个问题，因此模型还应该具有相应的先验知识来弥补在数据上的不足。&lt;/p&gt;&#xA;&lt;p&gt;基于这样的想法，论文作者采用了卷积作为基础模块来构建网络，并通过增加卷积层的深度和宽度来控制模型的学习能力。此外，AlexNet模型的设计还包括使用了GPU来加速网络训练，这也是该模型成功的一个关键因素。AlexNet的提出标志着深度学习在计算机视觉领域的应用开始得到广泛的认可和使用。&lt;/p&gt;&#xA;&lt;h2 id=&#34;452-alexnet结构&#34;&gt;4.5.2 AlexNet结构&lt;a class=&#34;anchor&#34; href=&#34;#452-alexnet%e7%bb%93%e6%9e%84&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;简单来说，AlexNet的整体网络结构可以看做是以LeNet5模型为基础的改进版本。AlexNet采用了5层卷积加3层全连接的网络结构，如图4-31所示便是论文中AlexNet模型的网络结构图。&lt;/p&gt;&#xA;&lt;div align=center&gt;&#xA;&lt;img width=&#34;750&#34; src=&#34;https://mlwithme.github.io/images/dl/000302.png&#34;/&gt;&#xA;&lt;/div&gt;&#xA;&lt;center&gt;&#xA;    图 4-31. 原始AlexNet网络结构图&#xA;&lt;/center&gt;&#xA;&lt;p&gt;从图4-31可以发现，整个网络结构分为了上下两层，其原因在于受限于当时GPU显存的大小不得已而为之。但现在就大可不必这样做，直接将两者合并在一起即可，因此可以重新将其画成如图4-32所示的形式。&lt;/p&gt;&#xA;&lt;div align=center&gt;&#xA;&lt;img width=&#34;750&#34; src=&#34;https://mlwithme.github.io/images/dl/23032330785.jpg&#34;/&gt;&#xA;&lt;/div&gt;&#xA;&lt;center&gt;&#xA;    图 4-32. AlexNet网络结构图&#xA;&lt;/center&gt;&#xA;&lt;p&gt;如图4-32所示便是重画后的网络结构图，其中网络结构上面的标识表示各个操作之后结果的维度信息，下面的标识表示各个操作对应的参数信息。根据图4-32可知，虽然AlexNet与LeNet的设计理念非常相似，但也有着显著的区别。AlexNet第1层中卷积窗口的大小是11，这是因为ImageNet数据集中图片的大小是MNIST的近10倍，所以需要更大的卷积窗口来进行特征提取。第2层中的卷积窗口大小减小到5，之后全采用大小为3的卷积窗口进行卷积。此外，第1、第2和第5个卷积层之后都使用了窗口大小为3、步幅为2的最大池化层，紧接着最后一个卷积层的是2个输出个数为$4096$的全连接层。最后，据图4-32所示的网络结构可以得出表4-2中所示的参数信息。&lt;/p&gt;&#xA;&lt;center&gt;&#xA;  表 4-2. AlexNet模型参数表&#xA;&lt;/center&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;网络层&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;输入形状&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;参数&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;输出形状&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;参数量&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;①卷积层&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,3,224,224]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;kernel=[3,11,11,96]&lt;/code&gt;,&lt;code&gt;S=4&lt;/code&gt;,&lt;code&gt;P=2&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,96,55,55]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;$34944$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;池化层&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,96,55,55]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;kernel=[3,3]&lt;/code&gt;,&lt;code&gt;S=2&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,96,27,27]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;$0$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;②卷积层&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,96,27,27]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;kernel=[96,5,5,256]&lt;/code&gt;,&lt;code&gt;S=1&lt;/code&gt;，&lt;code&gt;P=2&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,256,27,27]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;$614656$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;池化层&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,256,27,27]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;kernel=[3,3]&lt;/code&gt;,&lt;code&gt;S=2&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,256,13,13]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;$0$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;③卷积层&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,256,13,13]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;kernel=[256,3,3,384]&lt;/code&gt;,&lt;code&gt;S=1&lt;/code&gt;，&lt;code&gt;P=1&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,384,13,13]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;$885120$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;④卷积层&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,384,13,13]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;kernel=[384,3,3,384]&lt;/code&gt;,&lt;code&gt;S=1&lt;/code&gt;，&lt;code&gt;P=1&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,384,13,13]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;$1327488$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;⑤卷积层&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,384,13,13]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;kernel=[384,3,3,256]&lt;/code&gt;,&lt;code&gt;S=1&lt;/code&gt;，&lt;code&gt;P=1&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,256,13,13]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;$884992$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;池化层&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,256,13,13]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;kernel=[3,3]&lt;/code&gt;,&lt;code&gt;S=2&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,256,6,6]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;$0$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;⑥全连接层&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,256,6,6]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;weight=[256*6*6,4096]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,4096]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;$37752832$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;⑦全连接层&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,4096]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;weight=[4096,4096]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,4096]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;$16781312$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;⑧全连接层&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,4096]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;weight=[4096,1000]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;[1,1000]&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;$4097000$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;其中输入形状和输出形状的4个维度分别为&lt;code&gt;[batch_size,in_channels,width,height]&lt;/code&gt;，卷积核形状的4个维度分别为&lt;code&gt;[in_channels,w,w,out_channels]&lt;/code&gt;。从表4-2可以看出，AlexNet网络结构的参数量大约在6千万左右，而倒数第1个全连接几乎就占了$60\%$左右。假如每个权重参数均使用32位浮点数进行表示，则每个权重参数将占用4个字节，则AlexNet模型的大小约为230MB。&lt;/p&gt;</description>
			</item>
			<item>
				<title>4.6 VGG网络</title>
				<link>https://mlwithme.github.io/dl/chapter04/f084f181c3554082/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/dl/chapter04/f084f181c3554082/</guid>
				<description>&lt;h1 id=&#34;46-vgg网络&#34;&gt;4.6 VGG网络&lt;a class=&#34;anchor&#34; href=&#34;#46-vgg%e7%bd%91%e7%bb%9c&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;经过&lt;a href=&#34;https://mlwithme.github.io/dl/chapter04/c8af5d84174b4420&#34;&gt;4.4节&lt;/a&gt;和&lt;a href=&#34;https://mlwithme.github.io/dl/chapter04/de007462967e4701&#34;&gt;4.5节&lt;/a&gt;内容的介绍我们已经了解了LeNet5和AlexNet这两种卷积网络模型，但是总体上来说两者的网络结构几乎并没有太大的差别。在接下来的这节内容中，我们将会介绍卷积网络中的第3个经典模型VGG[1]。&lt;/p&gt;&#xA;&lt;h2 id=&#34;461-vgg动机&#34;&gt;4.6.1 VGG动机&lt;a class=&#34;anchor&#34; href=&#34;#461-vgg%e5%8a%a8%e6%9c%ba&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;随着卷积网络在计算机视觉领域的快速发展，越来越多的研究人员开始通过改变模型的网络结构在提高在图像识别任务中的精度，例如使用更小的卷积核和步长[2]。基于类似的想法，论文作者提出可以尝试通过改变卷积网络深度来提高模型的分类精度。VGG模型于2014年诞生于Visual Geometry Group 实验室，而这3个单词的首字母也代表了VGG的含义。VGG网络总体上一共有5种网络架构，但是从本质上来说这5种网络架构都是一样的，仅仅只是在卷积的深度上有所差别，因此VGG也可以看作是不同卷积深度对模型效果影响的一次探索。&lt;/p&gt;&#xA;&lt;p&gt;在论文中，作者对卷积网络卷积深度的设计进行了探索，并且通过尝试逐步加深网络的深度来提高模型的整体性能，这使得VGG在当年的ILSVRC任务中以稳定的优势分别取得了两项比赛的第1名和第2名。下面，我们将开始一步一步地来介绍VGG模型的网络结构。&lt;/p&gt;&#xA;&lt;h2 id=&#34;462-vgg结构&#34;&gt;4.6.2 VGG结构&lt;a class=&#34;anchor&#34; href=&#34;#462-vgg%e7%bb%93%e6%9e%84&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;如图4-36所示一共有6列，其中第2列是在第1列的基础上加入了LRN标准化操作，网络最少有11层，最多有19层。在整个网络的训练过中，VGG会固定输入图片的大小为$224\times224$的RGB图像，并且在预处理中仅仅只是做了去均值化，即在训练集中每个像素值都会减去整体像素的一个平均值。接着，预处理后的图片将会被输入到一系列仅仅只由窗口大小为$3\times3$的卷积核堆叠而成的卷积网络中。并且从图4-36中的模型C可以看出，其还使用了窗口大小为$1\times1$的卷积核，这是因为$1\times1$的卷积既可以增加模型的非线性拟合能力，同时还不会改变卷积层的可视野。&lt;/p&gt;&#xA;&lt;div align=center&gt;&#xA;&lt;img width=&#34;550&#34; src=&#34;https://mlwithme.github.io/images/dl/23032658448.jpg&#34;/&gt;&#xA;&lt;/div&gt;&#xA;&lt;center&gt;&#xA;    图 4-36. VGG网络架构图&#xA;&lt;/center&gt;&#xA;&lt;p&gt;同时，在这5种网络架构中，所有卷积运算的步长都被设置成了固定的$1$，并且为了使得卷积后特征图的大小同输入时保持一致，网络在每次卷积之前均做了对应的填充处理，即特征图的大小只会在池化后产生变化。在池化方面，5种网络模型均使用了5次最大池化操作，其窗口大小均为$2\times2$，移动步长均为$2$。从图4-36可以看出，VGG-19网络结构的参数量大约在1亿1千4百万左右，假如每个权重参数均使用32位浮点数进行表示，则每个权重参数将占用4个字节，则VGG-19模型的大小约为550MB。&lt;/p&gt;&#xA;&lt;p&gt;在完成一系列的卷积处理后，VGG会将卷积得到的特征图再输入到全连接网络中，其中前两个全连接层均包含有$4096$个神经元，而最后一个全连接层神经元的个数则是对应的分类数$1000$，紧接着再是一个Softmax的分类层。对于所有的5种网络结构来说，这部分都采用了相同的配置。最后，在VGG中所有的隐藏层（所有卷积层和前两个全连接层）都使用了ReLU非线性变换。&lt;/p&gt;&#xA;&lt;p&gt;从图4-36所示的网络结构可以看出，在整个过程中VGG都仅仅只使用了$3\times3$大小的卷积核，而摒弃了诸如$5\times5$或者是$7\times7$这类更大的卷积核。因为论文作者研究发现，连续2次（中间没有池化）使用窗口为$3$的卷积核卷积后的可视野等同于一次窗口大小为$5$的卷积过程；而连续3次（中间同样没有池化）使用$3\times3$卷积，其效果等价于1次窗口大小为$7$的卷积过程。&lt;/p&gt;&#xA;&lt;div align=center&gt;&#xA;&lt;img width=&#34;550&#34; src=&#34;https://mlwithme.github.io/images/dl/000318.png&#34;/&gt;&#xA;&lt;/div&gt;&#xA;&lt;center&gt;&#xA;    图 4-37. 不同窗口大小卷积对比图&#xA;&lt;/center&gt;&#xA;&lt;p&gt;如图4-37所示，左右两边均是大小为$5\times5$的输入，左边通过连续两次$3\times3$大小的卷积核进行卷积后能够实现$5\times5$的可视野；而右边仅用一次$5\times5$大小的卷积核进行卷积后同样也能够实现$5\times5$的可视野。那这样做的好处是什么呢？以窗口大小为$7$和连续3个窗口大小为$3$的卷积过程为例，作者认为：①连续3次卷积的同时也进行非线性变化得到的模型，比仅仅只进行一次卷积和非线性变换得到的模型要更具有泛化能力，尽管两者能够获得同样大小的可视野，而这也可以看作是对$7\times7$的卷积核施加了一次正则化的结果；②可以有效减少参数量，假设卷积时输入输出的通道数均为$C$，则一次$7\times7$的卷积需要的参数量为$7^2C^2=49C^2$，而3次$3\times3$的卷积需要的参数量为$(3^2C^2)3=27C^2$，前者比后者多了$81\%$的参数量。&lt;/p&gt;&#xA;&lt;h2 id=&#34;463-vgg实现&#34;&gt;4.6.3 VGG实现&lt;a class=&#34;anchor&#34; href=&#34;#463-vgg%e5%ae%9e%e7%8e%b0&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;从图4-36可以看出VGG有多种不同类型的网络配置，如果是按照之前的实现思路那么就得写多份代码，但显然这里面有很多代码是可以复用。所以首先需要实现一个通用模块，然后只需要传入对应的配置参数就能够实现对应的网络结构。以下完整示例代码可以参见&lt;code&gt;Code/Chapter04/C05_VGG/&lt;/code&gt;文件。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. 辅助模块&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;如下代码所示就是A、B、D和E这4种网络结构的配置参数，其中&lt;code&gt;&#39;M&#39;&lt;/code&gt;表示该层为最大池化层，而其它的数字则表示对应的卷积核个数。至于网络结构C这里就不进行示例了，有兴趣的读者可以自己修改。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; vgg_config&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;A&amp;#39;&lt;/span&gt;:[&lt;span style=&#34;color:#40a070&#34;&gt;64&lt;/span&gt;,&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;M&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;128&lt;/span&gt;,&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;M&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;256&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;256&lt;/span&gt;,&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;M&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;512&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;512&lt;/span&gt;,&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;M&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;512&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;512&lt;/span&gt;,&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;M&amp;#39;&lt;/span&gt;],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;B&amp;#39;&lt;/span&gt;:[&lt;span style=&#34;color:#40a070&#34;&gt;64&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;64&lt;/span&gt;,&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;M&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;128&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;128&lt;/span&gt;,&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;M&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;256&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;256&lt;/span&gt;,&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;M&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;512&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;512&lt;/span&gt;,&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;M&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;512&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;512&lt;/span&gt;,&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;M&amp;#39;&lt;/span&gt;],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;D&amp;#39;&lt;/span&gt;:[&lt;span style=&#34;color:#40a070&#34;&gt;64&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;64&lt;/span&gt;,&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;M&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;128&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;128&lt;/span&gt;,&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;M&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;256&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;256&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;256&lt;/span&gt;,&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;M&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;512&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;512&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;512&lt;/span&gt;,&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;M&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;512&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;512&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;512&lt;/span&gt;,&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;M&amp;#39;&lt;/span&gt;],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;E&amp;#39;&lt;/span&gt;[&lt;span style=&#34;color:#40a070&#34;&gt;64&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;64&lt;/span&gt;,&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;M&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;128&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;128&lt;/span&gt;,&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;M&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;256&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;256&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;256&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;256&lt;/span&gt;,&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;M&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;512&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;512&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;512&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;512&lt;/span&gt;,&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;M&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;512&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;512&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;512&lt;/span&gt;,&lt;span style=&#34;color:#40a070&#34;&gt;512&lt;/span&gt;,&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;M&amp;#39;&lt;/span&gt;]}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;进一步，在定义完这个配置字典后便可以实现构造网络结构的辅助函数，示例代码如下所示：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;make_layers&lt;/span&gt;(config):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;     layers &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; []&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;     in_channels &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; config&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;in_channels&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt;     cfg &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; vgg_config[config&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;vgg_type]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;for&lt;/span&gt; v &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;in&lt;/span&gt; cfg:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;6&lt;/span&gt;         &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;if&lt;/span&gt; v &lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;M&amp;#39;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;7&lt;/span&gt;             layers &lt;span style=&#34;color:#666&#34;&gt;+=&lt;/span&gt; [nn&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;MaxPool2d(kernel_size&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;, stride&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;)]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;8&lt;/span&gt;         &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;else&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;9&lt;/span&gt;             conv2d &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; nn&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;Conv2d(in_channels, v, kernel_size&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;, padding&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;10&lt;/span&gt;             layers &lt;span style=&#34;color:#666&#34;&gt;+=&lt;/span&gt; [conv2d, nn&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;ReLU(inplace&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;True&lt;/span&gt;)]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;11&lt;/span&gt;             in_channels &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; v&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;12&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;return&lt;/span&gt; nn&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;Sequential(&lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt;layers)  &lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# *号的作用解包这个list&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第1行是传入的模型配置信息。第2行用来保存所有的网络层。第4行用于根据传入的参数返回VGG中对应的网络结构。第5~11行是依次遍历每个配置参数来构建对应的VGG网络结构。第12行则是将列表中的所有网络层放入到&lt;code&gt;nn.Sequential()&lt;/code&gt;中。&lt;/p&gt;</description>
			</item>
			<item>
				<title>4.7 NIN网络</title>
				<link>https://mlwithme.github.io/dl/chapter04/911b961cc5d949b6/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/dl/chapter04/911b961cc5d949b6/</guid>
				<description>&lt;h1 id=&#34;47-nin网络&#34;&gt;4.7 NIN网络&lt;a class=&#34;anchor&#34; href=&#34;#47-nin%e7%bd%91%e7%bb%9c&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在&lt;a href=&#34;https://mlwithme.github.io/dl/chapter04/f084f181c3554082&#34;&gt;4.6节&lt;/a&gt;内容中，我们详细介绍了一种可复用的网络模型VGG，它通过一个个小的网络块来堆叠形成整个网络结构。在接下来的这节内容中，我们将向大家介绍另外一种也是基于这种“块”思想的网络模型——网络中的网络（Network in Network, NiN）[1]。&lt;/p&gt;&#xA;&lt;h2 id=&#34;471-nin动机&#34;&gt;4.7.1 NIN动机&lt;a class=&#34;anchor&#34; href=&#34;#471-nin%e5%8a%a8%e6%9c%ba&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;网络中的网络是新加坡国立大学2014年于ICLR会议上所提出的一种模型。论文作者认为，传统的卷积神经网络都是通过卷积和池化操作来提取特征并且使用全连接层进行分类，一方面传统的卷积操作本质上也仅仅只是一种泛化的线性模型，它并不足以提取得到更加高级且抽象的特征，尤其是当下游任务中特征类别是非线性可分的情况；另一方面全连接层的参数量较大导致模型过于复杂，容易使得模型出现过拟合的现象。&lt;/p&gt;&#xA;&lt;p&gt;因此，作者提出了另外一种微型网络块来代替卷积操作并以此来构建整个网络模型，同时也摒弃了全连接层直接通过全局平均池化来完成最后的维度转换过程，以此来提高模型的特征表达能力和泛化性能。&lt;/p&gt;&#xA;&lt;h2 id=&#34;472-nin结构&#34;&gt;4.7.2 NIN结构&lt;a class=&#34;anchor&#34; href=&#34;#472-nin%e7%bb%93%e6%9e%84&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在正式介绍整个NIN的网络结构前我们先弄清楚其中的两个核心部分：多层感知机卷积（Multilayer Perceptron Convolution）和全局平均池化（Global Average Pooling）。在理解了这两部分内容之后，整个网络结构就非常容易理解了。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. 多层感知机卷积&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;如图4-39所示，左侧为原始的卷积操作，右侧为论文中所提出的多层感知机卷积操作。相较于普通的卷积结构，多层感知机卷积结构是在原有的卷积基础上又增加了一个多层感知机来进一步提高模型的特征表达能力。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;450&#34; src=&#34;https://mlwithme.github.io/images/dl/23040102296.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt;    图 4-39. 线性卷积与多层感知机卷积对比结构图&lt;/center&gt;&#xA;&lt;p&gt;在多层感知机卷积结构中，卷积操作后的两个全连接层并不是传统意义上的全连接层，而是采用了卷积核大小为$1\times1$的卷积操作进行代替。因为$1\times1$的卷积操作相当于卷积核在执行卷积的过程中对不同通道上同一位置处的特征值进行了一次线性组合，这类似于传统全连接层的计算方式。同时，使用$1\times1$的卷积操作一方面能够根据训练得到的权重参数来确定每个特征通道的重要性占比（这也类似于注意力机制的思想）并融合形成一个通道，使得模型具有跨特征图交互的能力；另一方面也能够很方便地与前后层的卷积操作进行转换。最后，在多层感知机卷积结构中，每个卷积层之后都通过ReLU激活函数进行了一次非线性变换。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2. 全局平均池化操作&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;在传统的卷积神经网络中，卷积结构均被视为一个特征提取器，在对原始输入进行深度特征提取后通常会通过多个全连接层来完成最后的分类任务，而这种做法的弊端便是引入了大量的权重参数并且模型容易出现过拟合现象。在论文中，作者提出通过平均池化操作来解决这一个问题。具体地，在最后一个卷积层操作中为每个分类类别均生成一个特征图，然后取整个特征图的平均值来作为对应类别的置信度预测输出，这样既降低了模型的参数量同时也充分利用了特征图空间信息。因此，这也就意味着如果下游任务具有$K$个分类类别，那么模型最后的卷积输出一定是有$K$个通道数。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;3. 整体网络结构&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;在介绍完多层感知机卷积块和全局平均池化这两项技术后再来看整个NIN的网络结构就比较清晰了。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;600&#34; src=&#34;https://mlwithme.github.io/images/dl/23040118967.jpg&#34;/&gt;&lt;/div&gt; &lt;center&gt;图 4-40. NIN网络结构图&lt;/center&gt;&#xA;&lt;p&gt;如图4-40所示便是NINI网络模型的结构图，可以明显地发现整个网络是由多个多层感知机卷积块所构成，而最右侧则是进行全局平均池化并通过Softmax层完成分类。&lt;/p&gt;&#xA;&lt;h2 id=&#34;473-nin实现&#34;&gt;4.7.3 NIN实现&lt;a class=&#34;anchor&#34; href=&#34;#473-nin%e5%ae%9e%e7%8e%b0&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在介绍完整个网络结构后我们再来看如何通过PyTorch进行实现。根据&lt;a href=&#34;https://mlwithme.github.io/dl/chapter04/911b961cc5d949b6&#34;&gt;4.7.2节&lt;/a&gt;内容的介绍，我们需要先实现最基础的多层感知机卷积块，然后再以此为基础来构建整个网络模型。以下完整示例代码可以参见&lt;code&gt;Code/Chapter04/C06_NIN/&lt;/code&gt;文件。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. 辅助模块&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;首先需要实现一个辅助函数来完成多层感知机卷积块的计算过程，实现代码如下所示：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;nin_block&lt;/span&gt;(in_chs, out_chs&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;None&lt;/span&gt;, k_size&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;, s&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;, p&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;     nin_seq &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; nn&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;Sequential(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;         nn&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;Conv2d(in_chs, out_chs[&lt;span style=&#34;color:#40a070&#34;&gt;0&lt;/span&gt;], k_size, s, p),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt;         nn&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;ReLU(inplace&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;True&lt;/span&gt;),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;         nn&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;Conv2d(out_chs[&lt;span style=&#34;color:#40a070&#34;&gt;0&lt;/span&gt;], out_chs[&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;], &lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;6&lt;/span&gt;         nn&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;ReLU(inplace&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;True&lt;/span&gt;),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;7&lt;/span&gt;         nn&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;Conv2d(out_chs[&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;], out_chs[&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;], &lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;8&lt;/span&gt;         nn&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;ReLU(inplace&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;True&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;9&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;return&lt;/span&gt; nin_seq&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第1行用于传入对应块的超参数信息，其中&lt;code&gt;in_chs&lt;/code&gt;表示第1个卷积层的输入通道数，&lt;code&gt;out_chs&lt;/code&gt;为一个列表表示3个卷积层各自的输出通道数，&lt;code&gt;s&lt;/code&gt;和&lt;code&gt;p&lt;/code&gt;分别表示第1个卷积层的步长和填充数。第3~4行为多层感知机卷积块中的第1个正常卷积层。第5~8行则是对应的两个$1\times1$卷积操作。&lt;/p&gt;</description>
			</item>
			<item>
				<title>4.8 GoogLeNet网络</title>
				<link>https://mlwithme.github.io/dl/chapter04/47da186baf3e4a0b/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/dl/chapter04/47da186baf3e4a0b/</guid>
				<description>&lt;h1 id=&#34;48-googlenet网络&#34;&gt;4.8 GoogLeNet网络&lt;a class=&#34;anchor&#34; href=&#34;#48-googlenet%e7%bd%91%e7%bb%9c&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在前面两节内容中我们分别介绍了VGG和NIN模型中基于自定义块来构建网络的思想，其核心观点均是认为传统的单一卷积操作很难提取到高级的抽象特征，因此需要重新构造新的基模块，例如VGG块和多层感知机卷积块。在接下来的这节内容中，我们将再次介绍另外一种同样也是基于“块”思想的网络模型——GoogLeNet模型[1]。&lt;/p&gt;&#xA;&lt;h2 id=&#34;481-googlenet动机&#34;&gt;4.8.1 GoogLeNet动机&lt;a class=&#34;anchor&#34; href=&#34;#481-googlenet%e5%8a%a8%e6%9c%ba&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;从&lt;a href=&#34;https://mlwithme.github.io/dl/chapter04/c8af5d84174b4420&#34;&gt;4.4节&lt;/a&gt;开始介绍的第1个卷积神经网络LeNet5模型到&lt;a href=&#34;https://mlwithme.github.io/dl/chapter04/911b961cc5d949b6&#34;&gt;4.7节&lt;/a&gt;中的NIN网络模型，这4个模型除了在深度上有着明显的区别，另一个明显的差异之处就在于卷积核大小的变化以及与池化层的组合方式。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;400&#34; src=&#34;https://mlwithme.github.io/images/dl/23040220772.jpg&#34;/&gt;&lt;/div&gt; &lt;center&gt;图 4-41. LeNet5、AlexNet、VGG和NIN网络局部对比图&lt;/center&gt;&#xA;&lt;p&gt;如图4-41所示，在LeNet5模型中作者仅仅只是采用了窗口大小为$5\times5$的卷积核进行特征提，而到了AlexNet中则引入了窗口大小为$3\times3$卷积操作，进一步在VGG和NIN模型中还出现了$1\times1$大小的卷积操作并同时摒弃了$5\times5$的卷积核。同时，不同的网络模型对于池化层的位置也有不同的处理方式。因此，对于某个网络层来说到底是应该使用卷积层还是池化层呢？如果使用卷积层该选择什么样的窗口大小呢？&lt;/p&gt;&#xA;&lt;p&gt;基于这样的动机，谷歌公司在2015年的一篇论文中提出了一种并行的网络结构块Inception来解决这一问题，并以Inception块为基础构建得到了整个GoogLeNet网络模型。&lt;/p&gt;&#xA;&lt;h2 id=&#34;482-googlenet结构&#34;&gt;4.8.2 GoogLeNet结构&lt;a class=&#34;anchor&#34; href=&#34;#482-googlenet%e7%bb%93%e6%9e%84&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在正式介绍GoogLeNet模型的网络结构之前，我们先来介绍其中的核心部分Inception模块和$1\times1$卷积的作用。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. 理解Inception模块&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;如图4-42所示便是Inception块的构成元素。从图中可以看出，对于任意Inception块的输入来说从左到右并行有a、b、c和d共4条路径选择，分别对应了不同大小卷积核的卷积操作和池化操作。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;420&#34; src=&#34;https://mlwithme.github.io/images/dl/23040241903.jpg&#34;/&gt;&lt;/div&gt; &lt;center&gt; 图 4-42. Inception模块结构图&lt;/center&gt;&#xA;&lt;p&gt;进一步，将不同路径下运算得到的结果在通道这一维度上进行堆叠便得到了Inception块的输出。最终，通过以Inception块来代替传统卷积的方式便能够在同一层获取得到不同卷积尺度的计算结果，这便是Inception块的核心思想。可以看出GoogLeNet这个名字和LetNet并没有任何关系，仅仅只是在向后者致敬。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2. $1\times1$卷积的作用&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;此时可能有读者会问，为什么Inception块的中间两条路径也会有$1\times1$大小的卷积操作？&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;330&#34; src=&#34;https://mlwithme.github.io/images/dl/23040208700.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 4-43. $1\times1$卷积作用图&lt;/center&gt;&#xA;&lt;p&gt;如图4-43所示，现有特征图的形状为$28\times28\times192$，如果直接使用32个窗口大小为$5\times5$的卷积核进行卷积操作，那么此时一共有153600个权重参数；而如果先用16个窗口大小为$1\times1$的卷积核对原始特征图进行降维，然后再进行窗口大小为$5\times5$的卷积操作，那么此时一共有15872个权重参数。可以看出，后者的参数量仅仅只有前者的约十分之一，同时整个计算量也变成了前者的十分之一。因此，Inception模块中间两个$1\times1$卷积操作的目的便是降低模型的参数量。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;3. 整体网络结构&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;在介绍完Inception结构的思想原理后我们再来看GoogLeNet的整个网络结构。总的来说，除了传统的3个卷积运算之外，GoogLeNet一共由9个Inception块所构成，而这9个Inception块又可以分为三个阶段，前两个阶段结束之后特征图的大小均变成了之前的一半，最后一个阶段结束后便是一个全局池化层并通过一个全连接层来完成分类任务。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;450&#34; src=&#34;https://mlwithme.github.io/images/dl/23040208701.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 4-44. GoogLeNet网络结构图&lt;/center&gt;&#xA;&lt;p&gt;如图4-44所示便是GoogLeNet的网络结构图。以原始输入大小为3通道$224\times224$的图像为例，在经过前面两个卷积层和池化层之后特征图的形状变成了&lt;code&gt;[28,28,192]&lt;/code&gt;。进一步，在经过模块Inception(3a)时，4个分支路径的特征图形状分别为&lt;code&gt;[28,28,64]&lt;/code&gt;、&lt;code&gt;[28,28,128]&lt;/code&gt;、&lt;code&gt;[28,28,32]&lt;/code&gt;和&lt;code&gt;[28,28,32]&lt;/code&gt;，然后在通道这个维度上进行堆叠得到形状为&lt;code&gt;[28,28,256]&lt;/code&gt;的特征图。从这里可以看出，在Inception模块的4个路径中$3\times3$大小的卷积核最多，并且后续也一直保持了这个规律，一定程度上反映出$3\times3$大小的卷积核更具有优势。紧接着便是Inception(3b)、Inception(4a)、Inception(4b)、Inception(4c)、Inception(4d)、Inception(4e)、Inception(5a)和Inception(5b)这8个Inception块，输出形状为&lt;code&gt;[7,7,1024]&lt;/code&gt;。最后，再通过一个维度为1024的全连接层完成分类任务。具体每个Inception块计算后特征图的形状可以参见图4-44中的对应标注。&lt;/p&gt;&#xA;&lt;p&gt;当然，GoogLeNet除了图4-44所示的网络结构外，作者认为处于网络模型中间层的特征往往具有更强的判别能力，因此GoogLeNet的另一个版本还在网络的中间部分额外的添加了两个分类器，即在分别再取Inception(4a)和Inception(4d)的输出结果进行后续的分类任务。&lt;/p&gt;&#xA;&lt;h2 id=&#34;483-googlenet实现&#34;&gt;4.8.3 GoogLeNet实现&lt;a class=&#34;anchor&#34; href=&#34;#483-googlenet%e5%ae%9e%e7%8e%b0&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在介绍完GoogLeNet模型的网络结构之后我们再来看如何一步步实现整个模型。类似于实现NIN模型一样，这里需要先定义实现Inception模块，然后再以此为基础来实现GoogLeNet模型。以下完整示例代码可以参见&lt;code&gt;Code/Chapter04/C07_GoogLeNet/&lt;/code&gt;文件。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. 辅助模块&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;首先需要实现两个辅助类来完成Inception块的计算过程，实现代码如下所示：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#0e84b5;font-weight:bold&#34;&gt;BasicConv2d&lt;/span&gt;(nn&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;Module):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;__init__&lt;/span&gt;(&lt;span style=&#34;color:#007020&#34;&gt;self&lt;/span&gt;, in_channels, out_channels, kernel_size, stride&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;, padding&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;0&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;         &lt;span style=&#34;color:#007020&#34;&gt;super&lt;/span&gt;(BasicConv2d, &lt;span style=&#34;color:#007020&#34;&gt;self&lt;/span&gt;)&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#06287e&#34;&gt;__init__&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt;         &lt;span style=&#34;color:#007020&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;conv &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; nn&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;Conv2d(in_channels, out_channels,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;                               kernel_size, stride, padding)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;6&lt;/span&gt;         &lt;span style=&#34;color:#007020&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;relu &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; nn&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;ReLU(inplace&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;True&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;7&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;8&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;forward&lt;/span&gt;(&lt;span style=&#34;color:#007020&#34;&gt;self&lt;/span&gt;, x):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;9&lt;/span&gt;         x &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#007020&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;conv(x)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;10&lt;/span&gt;         &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#007020&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;relu(x)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，类&lt;code&gt;BasicConv2d&lt;/code&gt;的作用便是同时完成一个卷积操作和一次非线性变换。因为是继承自&lt;code&gt;nn.Module&lt;/code&gt;，所以后续可以将&lt;code&gt;BasicConv2d&lt;/code&gt;整体作为一个网络层进行使用。&lt;/p&gt;&#xA;&lt;p&gt;&lt;subscribe&gt;55&lt;/subscribe&gt;&lt;/p&gt;&#xA;&lt;br&gt;&#xA;&lt;br&gt;&#xA;&lt;br&gt;</description>
			</item>
			<item>
				<title>4.9 ResNet网络</title>
				<link>https://mlwithme.github.io/dl/chapter04/da16c61397454b2c/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/dl/chapter04/da16c61397454b2c/</guid>
				<description>&lt;h1 id=&#34;49-resnet网络&#34;&gt;4.9 ResNet网络&lt;a class=&#34;anchor&#34; href=&#34;#49-resnet%e7%bd%91%e7%bb%9c&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在前面节内容中我们陆续介绍了几种不同的卷积网络模型，并且整体上来看随着模型的发展其对应的网络深度也在逐渐加深。不过随着模型网络层数的加深，模型的训练难度却变得越来越大，而其根本原因就在于神经网络的退化问题（Degradation Problem）。在接下来的这节内容中，我们将介绍一种新的网络结构”残差“块来解决这一问题[1]。&lt;/p&gt;&#xA;&lt;h2 id=&#34;491-resnet动机&#34;&gt;4.9.1 ResNet动机&lt;a class=&#34;anchor&#34; href=&#34;#491-resnet%e5%8a%a8%e6%9c%ba&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;随着神经网络的发展，通过加大网络深度来提高模型精度已经成为了一种常见的做法，但这是否意味着学习更好的网络仅仅只需要通过堆叠网络层数就足以实现呢？虽然梯度裁剪、批归一化[2]（相关介绍可参见第6章内容）等方法已经在一定程度上解决了深度模型的梯度爆炸（Gradient Exploding）和梯度消失（Gradient Vanishing）的问题，但实验表明随着网络层数的加深模型效果在达到一个饱和状态后便开始急剧下降了，而这便被称为神经网络的退化问题。&lt;/p&gt;&#xA;&lt;p&gt;同时，作者认为只需要将新增加的网络层做恒等映射（Identity Mapping）那么从理论上讲，相较于原模型新模型最终效果至少也应该不会变差，但最终结果证明新增加的网络层不仅没有给模型带来好的效果反而变得更差了。基于这样的想法，何凯明等人于2015年提出了一种“残差学习”（Residual Learning）的思想来解决网络的退化问题，并凭借基于残差模块构建的残差网络ResNet一举赢得了2015年ImageNet大规模视觉识别挑战赛。&lt;/p&gt;&#xA;&lt;h2 id=&#34;492-resnet结构&#34;&gt;4.9.2 ResNet结构&lt;a class=&#34;anchor&#34; href=&#34;#492-resnet%e7%bb%93%e6%9e%84&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在正式ResNet模型的网络结构之前，我们先来介绍其中的核心部分残差结构和维度对齐。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1.理解残差结构&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;残差学习的核心思想在于，与其直接学习整个模型潜在的函数映射关系不如逐步分层来进行学习，因为后者相比于前者容易很多。如图4-45所示，左侧为原始逐层简单叠加的网络局部结构图，右侧为残差模块结构示意图，其中$X$均表示未画出的浅层网络，$\mathcal{F}(X)$表示局部的两层网络。&lt;/p&gt;&#xA;&lt;div align=center&gt;&#xA;&lt;img width=&#34;450&#34; src=&#34;https://mlwithme.github.io/images/dl/23041099419.jpg&#34;/&gt;&#xA;&lt;/div&gt;&#xA;&lt;div style=&#34;text-align: center;&#34;&gt;&#xA;    图 4-45. 普通结构（左）和残差结构（右）对比图&#xA;&lt;/div&gt;&#xA;&lt;p&gt;假设现在图4-45中的两个网络结构均需完成同样一个分类任务，即两者均需要学习同样一个潜在的函数映射关系$\mathcal{H}(X)$。此时对于左侧的普通结构来说，如果需要学习得到到$\mathcal{H}(X)=\mathcal{F}(X)$这一潜在映射那就必须从上到下逐层学习；而对于右侧的残差结构来说，由于其多增加了一个快捷连接（Shortcut Connection）使得$\mathcal{H}(X)=\mathcal{F}(X)+X$，则此时有$\mathcal{F}(X)=\mathcal{H}(X)-X$。由此可以发现，在残差结构中模型只需要学习到$\mathcal{F}(X)=\mathcal{H}(X)-X$便可以得到最终的潜在函数映射$\mathcal{H}(X)$，而在普通结构中模型则需要学习完整的$\mathcal{F}(X)=\mathcal{H}(X)$映射，因此残差模块在训练过程总相比于普通模块更容易拟合。&lt;/p&gt;&#xA;&lt;p&gt;同时，从直观的角度来看，使用快捷连接后浅层网络的输出便能够跳跃部分网络层而直接作用于更深的部分，这使得残差模块能够在不断提高模型性能同时还能够保持模型的精度至少不会降低，因为此时只需要$\mathcal{F}(X)$做恒等映射$\mathcal{F}(X)=0$便能实现。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2. 残差结构中的反向传播&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;从图4-45（右）中的结构可以看出，残差模块的核心也是唯一部分就是这个快捷连接，让它除了具备解决网络退化的问题同时还使得深层网络在训练过程中不容易出现梯度消失或爆炸的情况进而可以加快网络的收敛速度。&lt;/p&gt;&#xA;&lt;p&gt;根据图4-45可知，对于左边的普通结构来说输出层$\mathcal{H}(X)$关于输入层$X$的梯度为&#xA;&lt;/p&gt;&#xA;$$&#xA;\frac{\partial \mathcal{H}}{\partial X}=\frac{\partial \mathcal{H}}{\partial F}\frac{\partial \mathcal{F}}{\partial X}&#xA;\tag{4-7}&#xA;$$&lt;p&gt;&#xA;而对于右边的残差结构来说，其对应的梯度为&#xA;&lt;/p&gt;&#xA;$$&#xA;\frac{\partial \mathcal{H}}{\partial X}=\frac{\partial \mathcal{H}}{\partial F}\frac{\partial \mathcal{F}}{\partial X}+\frac{\partial \mathcal{H}}{\partial X}&#xA;\tag{4-8}&#xA;$$&lt;p&gt;&#xA;从式(4-7)和式(4-8)可以看出，在残差结构中由于快捷连接的存在所以多了一项直接由$\mathcal{H}(X)$到$X$的梯度，所以相比于普通的连接方式更不出现梯度消失或爆炸的问题。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;3. 残差结构中的维度对齐&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;根据上述内容的介绍我们已经了解了残差结构的核心思想和原理，但现在有一个问题便是不同通道数和不同大小的特征图之间如何进行快捷连接。通常来说，随着网络层数的加深卷积核的个数也会成倍地进行增加同时特征图的大小会成倍的缩小，而这就导致在残差结构中如果两个网络层输出特征图大小或通道数不一致便不能使用快捷连接。因此，在这种情况下会通过一个窗口大小为$1\times1$的卷积层来调整特征图大小和通道数。&lt;/p&gt;&#xA;&lt;div align=center&gt;&#xA;&lt;img width=&#34;650&#34; src=&#34;https://mlwithme.github.io/images/dl/23041399020.jpg&#34;/&gt;&#xA;&lt;/div&gt;&#xA;&lt;div style=&#34;text-align: center;&#34;&gt;&#xA;    图 4-46. 维度对齐对比图&#xA;&lt;/div&gt;&#xA;&lt;p&gt;如图4-46所示，对于相同维度的输入来说，左侧的残差结构经过两个卷积层之后输出特征图的维度依旧没有发生变化，因此可以直接相加实现快捷连接；而右侧的残差结构在经过两个卷积层之后输出特征的大小和通道数分别变成了原来的一半和两倍，所以在进行快捷连接之前需要将原始输入经过一个$1\times1$的卷积层来实现维度对齐。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;4. 整体网络结构&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;在介绍完整个残差结构的相关原理后，我们再来看如何通过残差结构来构建整个ResNet网络模型。整体来说ResNet一共有5种网络结构，分别是ResNet18、ResNet34、ResNet50、ResNet101和ResNet152，但它们均是由残差结构搭建而来。下面以ResNset18为例进行介绍，其网络结构信息如表4-3所示。&lt;/p&gt;&#xA;&lt;center&gt;&#xA;  表 4-3 ResNet18网络结构信息表&#xA;&lt;/center&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th style=&#34;text-align: center&#34;&gt;网络层&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th style=&#34;text-align: center&#34;&gt;输出形状&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th style=&#34;text-align: center&#34;&gt;18-layer&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;Layer0&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$112\times112$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$\begin{bmatrix}7\times7,&amp;64\end{bmatrix}\times1$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;Layer0&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$56\times56$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;Max Pooling&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;Layer1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$56\times56$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$\begin{bmatrix}3\times3,&amp;64\\ 3\times3,&amp;64\end{bmatrix}\times2$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;Layer2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$28\times28$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$\begin{bmatrix}3\times3,&amp;128\\ 3\times3,&amp;128\end{bmatrix}\times2$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;Layer3&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$14\times14$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$\begin{bmatrix}3\times3,&amp;256\\ 3\times3,&amp;256\end{bmatrix}\times2$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;Layer4&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$7\times7$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$\begin{bmatrix}3\times3,&amp;512\\ 3\times3,&amp;512\end{bmatrix}\times2$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;Classifier&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$1\times1$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;Global Average Pooling, softmax&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;如表4-3所示，从上到下ResNet18一共有6个部分，其中第2列表示每个部分特征图输出的形状；第3列表示各层对应的参数信息，以Layer1这一行为例，其表示一共使用了2个残差结构且每个残差结构由两个卷积层构成。由此，根据表4-3中的结构信息便可以得到如图4-47所示的网络结构图。&lt;/p&gt;</description>
			</item>
			<item>
				<title>4.10 DenseNet网络</title>
				<link>https://mlwithme.github.io/dl/chapter04/1c24468824274650/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/dl/chapter04/1c24468824274650/</guid>
				<description>&lt;h1 id=&#34;410-densenet网络&#34;&gt;4.10 DenseNet网络&lt;a class=&#34;anchor&#34; href=&#34;#410-densenet%e7%bd%91%e7%bb%9c&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在&lt;a href=&#34;https://mlwithme.github.io/dl/chapter04/da16c61397454b2c&#34;&gt;4.9节&lt;/a&gt;内容中，我们详细介绍了ResNet模型的原理和实现方法，它的成功不仅解决了深度神经网络的退化问题而且在ImageNet等大型数据集上有着很好的表现，成为了深度学习领域的重要成果之一。因此，ResNet也为后续的网络设计提供了一种新的思考方向，启发了后续许多网络结构的设计，例如在本节内容中将要介绍的DenseNet模型。&lt;/p&gt;&#xA;&lt;h2 id=&#34;4101-densenet动机&#34;&gt;4.10.1 DenseNet动机&lt;a class=&#34;anchor&#34; href=&#34;#4101-densenet%e5%8a%a8%e6%9c%ba&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在传统的卷积神经网络中每一层的输入只来自于上一层的输出，这导致了每一层的特征图只能连接到相邻的下一层而无法跨层连接，这使得随着网络深度增加不仅出现了梯度消失或爆炸的现象，而且还出现了网络退化的问题。虽然残差网络的出现使得这两个问题在很大程度上得到了缓解，但是随着网络模型加深依旧存在着梯度消失的问题；其次，在传统的卷积神经网络中需要通过增加网络深度的方式来提高特征的表达能力从而导致模型参数急剧增加；最后，由于每一层的特征只能连接到近邻的后一层，使得浅层的特征可能无法充分传递到深层网络中导致特征传递不充分[1]。&lt;/p&gt;&#xA;&lt;p&gt;受到ResNet残差结构连接方式的启发，作者提出了一种基于密集连接的网络结构DenseNet[1]。DenseNet通过将上一层和前面所有层的输出拼接起来并作为当前层的输入，从而实现：①允许梯度更加直接地传递到浅层网络有助于缓解梯度消失的问题；②通过特征共享的方式来增加特征的表达能力从而降低了模型的参数量；③使得特征能在网络层中更加自由地传递有助于特征的充分利用。&lt;/p&gt;&#xA;&lt;h2 id=&#34;4102-densenet结构&#34;&gt;4.10.2 DenseNet结构&lt;a class=&#34;anchor&#34; href=&#34;#4102-densenet%e7%bb%93%e6%9e%84&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;整体来说，DenseNet模型主要由密集连接层和迁移层所构成，而两者的核心也都是由卷积层所构成，后续整个DenseNet网络也将基于这两个部分来进行构建。下面开始分别就这两部分进行介绍。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. 理解密集连接层&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;对于密集连接层来说，它是由一个个密集块所构成，而密集块则是由两个基础的卷积层所构成，整个密集块的结构如图4-48所示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;280&#34; src=&#34;https://mlwithme.github.io/images/dl/23041884319.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 4-48. 密集块结构图&lt;/center&gt;&#xA;&lt;p&gt;在图4-48中，首先是一个卷积核大小为$1\times1$的卷积层，其卷积核的个数为$4K$，$K$为论文中所指的增长率（Growth Rate）用于控制密集块输出的特征通道数，4可以理解为控制系数用于调节两个卷积层之间的特征通道数，紧接着最后便是一个$3\times3$的卷积层。同时从这里可以看出，对于每个卷积层来说其先进行了归一化，然后是非线性变换操作，最后才是线性变换，即“BN+ReLU+Conv”的顺序；而在ResNet中这一顺序为“Conv+BN+ReLU”。&lt;/p&gt;&#xA;&lt;p&gt;进一步，由多个密集块便可以构造得到一个密集连接层，如图4-49所示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;280&#34; src=&#34;https://mlwithme.github.io/images/dl/23041929520.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 4-49. 密集连接层（含3个密集块）图&lt;/center&gt;&#xA;&lt;p&gt;如图4-49所示，对于传统的网络结构来说$L$层网络便有$L$条连接，而在密集连接层中则有$\frac{L}{2}(L+1)$条连接，而这一连接方式也DenseNet名字的由来。在图4-49中，对于第1个密集块来说，假定其输入形状的长、宽和通道数分别为$m$、$n$和$c$则其输出形状便是$m\times n\times K$；对于第2个密集块来说其输入便是第1个密集块的输入和第1个密集块输出的组合，即形状为$m\times n\times (K+c)$，且其输出同样为$m\times n\times K$；以此类推，第3个密集块的输入形状便是$m\times n\times (2\cdot K+c)$，其输出形状依然为$m\times n\times K$。&lt;/p&gt;&#xA;&lt;p&gt;由此可以得出，对于第$l$个密集块来说，其输入通道数为$(l-1)\cdot K+c$，其中$l=1,2...,L$，这个递推公式在模型实现时还会用到。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2. 理解迁移层&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;根据图4-49可知，对于每个密集连接层来说其输出特征图的通道数和长宽均没有发生改变，因此作者提出了迁移层（Transition Layer）的概念来逐一对密集连接层的输出特征进行压缩，其结构如图4-50所示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;280&#34; src=&#34;https://mlwithme.github.io/images/dl/23041878420.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 4-50. 迁移层图&lt;/center&gt;&#xA;&lt;p&gt;在图4-50中，首先同样是一个卷积核大小为$1\times1$的卷积层，其卷积核的个数为$\theta m$，其中$m$表示输入通道数，$\theta$表示通道压缩率（ Compression Factor），默认为0.5即通道数减半；最后是一个窗口大小为$2\times 2$的平均池化层。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;3. 整体网络结构&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;在清楚密集连接层和迁移层的构造原理后，我们便可以构造得到最终的DenseNet网络模型。同ResNet一样，我们可以通过配置不同的密集连接数量返回得到不同的DenseNet结构，如论文中给出的DenseNet121、DenseNet169、DenseNet201和DenseNet264。为了方便后续介绍以及与ResNet18大致保持一致，下面我们将以DenseNet21为例进行介绍，其网络结构信息如表4-4所示。&lt;/p&gt;&#xA;&lt;center&gt;&#xA;  表 4-4 DenseNet18网络结构信息表&#xA;&lt;/center&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th style=&#34;text-align: center&#34;&gt;网络层&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th style=&#34;text-align: center&#34;&gt;输出形状&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th style=&#34;text-align: center&#34;&gt;18-layer&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;Convolution&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$112\times112$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$\begin{bmatrix}7\times7,&amp;64\end{bmatrix}\times1$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;Pooling&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$56\times56$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;Max Pooling&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;DenseLayer1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$56\times56$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$\begin{bmatrix}1\times1\\ 3\times3\end{bmatrix}\times2$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;Transition1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$28\times28$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$1\times1$ Conv,  $2\times2$ Average Pooling&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;DenseLayer2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$28\times28$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$\begin{bmatrix}1\times1\\ 3\times3\end{bmatrix}\times2$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;Transition2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$14\times14$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$1\times1$ Conv,  $2\times2$ Average Pooling&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;DenseLayer3&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$14\times14$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$\begin{bmatrix}1\times1\\ 3\times3\end{bmatrix}\times2$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;Transition3&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$7\times7$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$1\times1$ Conv,  $2\times2$ Average Pooling&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;DenseLayer4&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$7\times7$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$\begin{bmatrix}1\times1\\ 3\times3\end{bmatrix}\times2$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;ClassificatinLayer&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$1\times1$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$7\times7$ Global Average Pooling, softmax&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;如表4-4所示，从上到下ResNet21一共有10个部分，其中第2列表示每个部分特征图输出的形状；第3列表示各层对应的参数信息，以DenseLayer1这一行为例，其表示一共使用了2个密集块结构且每个密集层由两个卷积层构成。由此，根据表4-4中的结构信息便可以得到如图4-51所示的网络结构图。&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
