渔人张 發表於 2025-12-10 19:14:00

吴恩达深度学习课程四:计算机视觉 第一周:卷积基础知识(三)简单卷积网络

<p>此分类用于记录吴恩达深度学习课程的学习笔记,目前已完结,点击进入全集目录<br>
课程相关信息链接如下:</p>
<ol>
<li>原课程视频链接:[双语字幕]吴恩达深度学习deeplearning.ai</li>
<li>github课程资料,含课件与笔记:吴恩达深度学习教学资料</li>
<li>课程配套练习(中英)与答案:吴恩达深度学习课后习题与答案</li>
</ol>
<p>本篇为第四课的第一周内容,1.6到1.8的内容。</p>
<hr>
<p>本周为第四课的第一周内容,这一课所有内容的中心只有一个:<strong>计算机视觉</strong>。应用在深度学习里,就是专门用来进行图学习的模型和技术,是在之前全连接基础上的“特化”,也是相关专业里的一个重要研究大类。<br>
<strong>这一整节课都存在大量需要反复理解的内容和机器学习、数学基础。</strong> 因此我会尽可能的补足基础,用比喻和实例来演示每个部分,从而帮助理解。<br>
本篇的内容关于简单卷积网络,是对之前知识的一次简单整合应用,篇幅较长,但理解上的难度并不大。</p>
<h1 id="1-多维卷积通道数">1. 多维卷积:通道数</h1>
<p>我们在基础部分里提到过,一张“亮度表”只能表示灰度图,而彩色图像都是是三维表格。<br>
到目前为止,我们一直在用灰度图来进行演示,也就是 <span class="math inline">\(M \times N\)</span> 的二维表格。但真实世界的图片不是二维的,而是三维的:</p>
<p></p><div class="math display">\[M \times N \times 3
\]</div><p></p><p>我们称之为 <strong>RGB 三通道</strong>。<br>
对于多通道,我们可以把它想象成一个“分层蛋糕”:<br>
上层是红色信息(R),<br>
中层是绿色信息(G),<br>
下层是蓝色信息(B) 。<br>
每一层都是一张 2D 图,但三层叠在一起,才构成完整的彩色图像,就像这样:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251210190908142-922905378.png" alt="myplot2222222222222.png" loading="lazy"></p>
<p>现在继续按我们之前的符号规范引入通道数:<br>
<strong>我们用 <span class="math inline">\(n_c\)</span> 来表示通道数的多少,现在一幅图像就要表示为:</strong>$$n \times n \times n_c$$下面就展开一下多维卷积的过程。</p>
<h2 id="11-卷积核如何应对多通道图像">1.1 卷积核如何应对多通道图像?</h2>
<p>现在,我们输入的图像“亮度表”从二维变成了多维,你认为卷积核要怎么修改才能适应这个变化?<br>
<strong>答案很符合直觉:你变成几维,我也变成几维就好了。</strong><br>
对彩色图片进行卷积时,一个卷积核不再是 <span class="math inline">\(f \times f\)</span>,<strong>它同样增加了通道数</strong>:</p>
<p></p><div class="math display">\[f \times f \times n_c
\]</div><p></p><p>表示它对 R、G、B 三个通道各自有一块小卷积核。<br>
打个比方:<strong>卷积核就像海绵,随着图像维度增加,卷积核也不是一层海绵,而是“叠了三层的海绵”,每层负责吸收一层颜色的信息,做对应层的“清洁处理”工作。</strong><br>
就像这样:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251210190908033-180191755.png" alt="image.png" loading="lazy"><br>
我们继续,看看在这样的改变下如何进行卷积操作。</p>
<h2 id="12-多维卷积如何进行">1.2 多维卷积如何进行?</h2>
<p>先来看看结果:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251210191243380-396968593.png" alt="image.png" loading="lazy"><br>
你发现,<strong>三通道的输入图像经过三通道的卷积核,变成了一张单通道图</strong>。<br>
这是一个比较反直觉的部分,为什么结果不是三通道而是变成了单通道?<br>
我们先介绍一下多维卷积的运算步骤,再从原理上回答这个问题。<br>
<strong>卷积步骤如下:</strong></p>
<ol>
<li>对 R 通道卷积核的 R 部分做卷积。</li>
<li>对 G 通道卷积核的 G 部分做卷积。</li>
<li>对 B 通道卷积核的 B 部分做卷积。</li>
<li>把<strong>三份结果相加</strong>,得到一个单独的数,这就是输出特征图的一个像素。</li>
</ol>
<p>再按照课程内容演示一下:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251210191243512-1061723617.png" alt="image.png" loading="lazy"><br>
现在,我们从原理上说说:<strong>为什么非要把三层结果相加成一层,而不是让结果也是三通道?</strong></p>
<p>我们先回到卷积核的基本作用:提取局部特征。<br>
就像我们之前的边缘检测部分,我们用人工设计的一个固定卷积核来提取图像的竖直边缘。<br>
应用到这个例子中,<strong>首先要明确的一点是:我们只是把一个样本用三个通道来表示,这并不是三个样本。</strong><br>
如果我们对三个通道进行竖直边缘检测,实际上也只是在检测一幅图像的竖直边缘。<strong>当卷积核要在这一幅图像上判断“有没有竖直边缘”这种特征时,它必须综合这三个通道的共同表现,而不是分别给出三个答案。</strong><br>
所以结果自然是一张<strong>单通道的特征图</strong>,表示“这幅图像这个特征的强弱”。</p>
<p>再打个比方:<br>
你佩戴红色、绿色、蓝色的滤光镜,看同一个苹果,想知道“苹果轮廓在哪里”。<br>
这时,你不可能给出三个轮廓,而是把三次看到的轮廓信息综合,得到唯一一个真正的轮廓。</p>
<p>如果你还比较纠结这个问题,没关系,我们下面就来看看,<strong>什么情况下,输出是多通道的</strong>。</p>
<h2 id="13-多特征提取">1.3 多特征提取</h2>
<p>很显然,如果我们想让计算机“认识”某些物体,比如猫,就不能像上面一样,对应一个样本,只检测它的竖直边缘,<strong>对于这种低层特征,我们需要更多内容</strong>,比如水平边缘,倾斜边缘,光亮程度,纹理变化等等·····<br>
只有这样,我们才让一步步拼出猫眼睛,猫耳朵,猫嘴巴,身体等<strong>高层特征</strong>,最终让机器学习到:什么是猫,对其他东西也是同理。<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251210191252003-1809910772.png" alt="image.png" loading="lazy"><br>
<strong>所以,在卷积中,对一个或者一批次样本,一次提取多个特征,才是更合理的做法。</strong><br>
如何实现这一点?<br>
同样很符合直觉:<strong>我用这个卷积核提取竖直边缘,那我再来一个卷积核提取水平边缘,再来几个卷积核提取别的特征不就好了?</strong><br>
当然,要提前强调的是,在深度学习领域里,我<strong>们不会明确的得知哪个卷积核对应哪个特征,这些是模型自己学习和更新的,但是,每一个卷积核,一定代表一个不同的角度。</strong></p>
<p>现在,重点来了,每一个卷积核对图像进行卷积操作就会生成一个特征图,那你觉得这些不同的特征图会如何组织呢?<br>
<strong>答案就是通道数。</strong><br>
来进行演示:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251210190921588-1637840404.png" alt="image.png" loading="lazy"><br>
现在,我们就得到了输出图像的通道规律:<strong>输出图像的通道数等于该层卷积核数量</strong>。<br>
下一部分,我们就来正式认识一下卷积网络。</p>
<h1 id="2-卷积层的正向传播过程">2. 卷积层的正向传播过程</h1>
<p>还记得在全连接网络中,数据经过一个全连接层的传播过程是什么样的吗?<br>
这是两个最重要的公式:</p>
<p></p><div class="math display">\[\mathbf{Z^{}} = \mathbf{W^{}} \mathbf{A^{}} + \mathbf{b^{}}
\]</div><p></p><p></p><div class="math display">\[    \mathbf{A^{}} = g(\mathbf{Z^{}})
\]</div><p></p><p>如果你有些忘了它们是干什么的了,它们的总结在这里:深度神经网络的关键概念<br>
<strong>而现在,对于一层中应用卷积操作而不是线性组合的层级,我们称为卷积层。</strong><br>
这里要强调一下,卷积层可以是隐藏层,全连接层也可以是隐藏层。前者是说明层级的<strong>内容</strong>,后者是说明层级的<strong>位置</strong>。<br>
现在就继续用上面的例子,来看看<strong>卷积层是如何进行正向传播</strong>的,先不摆公式,符号的引入让正式的卷积传播公式相当的乱,摆出来反而阻碍理解,我们先用全连接层的公式来类别一下。<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251210190907677-2064004725.png" alt="image.png" loading="lazy"><br>
这一步的类比很容易理解,大致看来,我们就算把线性组合的内容换成了卷积操作。<br>
如果还用全连接网络的内容来类比,我们还可以说,一层中有几个神经元,就有几个卷积核,卷积核数量决定输出的通道数。<br>
但是后面我们就会了解到,<strong>卷积层的表示不会再用全连接那样的“圆圈”来表示,它有一套自己的结构表示方法</strong>,几乎不会再提到“神经元”这个词。</p>
<p>简单了解这点后,我们继续下一步:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251210191243397-631665699.png" alt="image.png" loading="lazy"><br>
对于激活函数这里同样比较直观,就是对特征图中的<strong>每一个像素逐个激活</strong>。<br>
在全连接网络中,我们通过激活函数引入从样本到标签的非线性映射。<br>
而现在,激活函数同样能让网络能够<strong>组合特征、产生“非线性特征”</strong>,如果没有激活函数,我们永远不能从“边缘”组合出“形状”,因为组合是非线性行为。</p>
<p>这就是一个卷积层的正向传播过程了,下面我们就正式引入在网络中,对于卷积层的符号规范。</p>
<h1 id="3-卷积层在网络中的符号规范">3. 卷积层在网络中的符号规范</h1>
<p>一下子列举出来,看起来会很多,但实际上很多都是之前使用的,我们也会在不断使用中越发熟悉。</p>
<h2 id="31-符号规范">3.1 符号规范</h2>
<table>
<thead>
<tr>
<th>符号</th>
<th>含义</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="math inline">\(W^{}\)</span></td>
<td>第 <span class="math inline">\(l\)</span> 层的卷积核参数</td>
<td>形状为 <span class="math inline">\((f, f, n_c^{}, n_c^{})\)</span>,即:核大小 × 输入通道数 × 本层卷积核个数</td>
</tr>
<tr>
<td><span class="math inline">\(b^{}\)</span></td>
<td>第 <span class="math inline">\(l\)</span> 层的偏置</td>
<td>每个卷积核对应一个偏置;形状 <span class="math inline">\((1, 1, 1, n_c^{})\)</span></td>
</tr>
<tr>
<td><span class="math inline">\(A^{}\)</span></td>
<td>上一层的激活值(输入特征图)</td>
<td>形状为 <span class="math inline">\((n_H^{}, n_W^{}, n_c^{})\)</span></td>
</tr>
<tr>
<td><span class="math inline">\(Z^{}\)</span></td>
<td>卷积后的线性输出</td>
<td>还未进入激活函数</td>
</tr>
<tr>
<td><span class="math inline">\(A^{}\)</span></td>
<td>卷积层的激活输出</td>
<td>对 <span class="math inline">\(Z^{}\)</span> 的每个像素逐点激活(ReLU 等)</td>
</tr>
<tr>
<td><span class="math inline">\(f\)</span></td>
<td>卷积核大小</td>
<td>若卷积核是 <span class="math inline">\(3\times 3\)</span>,则 <span class="math inline">\(f=3\)</span></td>
</tr>
<tr>
<td><span class="math inline">\(s\)</span></td>
<td>步幅(stride)</td>
<td>每次卷积核滑动的像素数</td>
</tr>
<tr>
<td><span class="math inline">\(p\)</span></td>
<td>Padding 大小</td>
<td>图像边缘填充的像素数</td>
</tr>
<tr>
<td><span class="math inline">\(n_H^{}\)</span></td>
<td>第 <span class="math inline">\(l\)</span> 层输出特征图的高度</td>
<td>由公式计算得到</td>
</tr>
<tr>
<td><span class="math inline">\(n_W^{}\)</span></td>
<td>第 <span class="math inline">\(l\)</span> 层输出特征图的宽度</td>
<td>由公式计算得到</td>
</tr>
<tr>
<td><span class="math inline">\(n_c^{}\)</span></td>
<td>第 <span class="math inline">\(l\)</span> 层输出通道数</td>
<td><strong>等于卷积核的数量</strong></td>
</tr>
</tbody>
</table>
<p>了解了单个符号后,下面就看看应用这些符号在正向传播中的维度变化。</p>
<h2 id="32-一次正向传播中的维度变化">3.2 一次正向传播中的维度变化</h2>
<p>首先,用符号表示就是这样:</p>
<table>
<thead>
<tr>
<th>阶段</th>
<th>大小</th>
</tr>
</thead>
<tbody>
<tr>
<td>输入大小</td>
<td><span class="math inline">\(n_H^{} \times n_W^{} \times n_C^{}\)</span></td>
</tr>
<tr>
<td>卷积后大小</td>
<td><span class="math inline">\(n_H^{} \times n_W^{} \times n_C^{}\)</span></td>
</tr>
<tr>
<td>激活后大小</td>
<td><span class="math inline">\(n_H^{} \times n_W^{} \times n_C^{}\)</span></td>
</tr>
<tr>
<td>输出大小</td>
<td><span class="math inline">\(n_H^{} \times n_W^{} \times n_C^{}\)</span></td>
</tr>
</tbody>
</table>
<p>再举个实例来来看看:<br>
设置参数:<span class="math inline">\(f=3,\ s=1,\ p=1,\ n_C^{}=8\)</span>,输入为 <span class="math inline">\(32 \times 32 \times 3\)</span><br>
传播过程如下:</p>
<table>
<thead>
<tr>
<th>阶段</th>
<th>大小(维度)</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>输入(Input)</strong></td>
<td><span class="math inline">\(32 \times 32 \times 3\)</span></td>
</tr>
<tr>
<td><strong>Padding 后</strong></td>
<td><span class="math inline">\((32 + 2\cdot 1) \times (32 + 2\cdot 1) \times 3 = 34 \times 34 \times 3\)</span></td>
</tr>
<tr>
<td><strong>卷积核(Filters)</strong></td>
<td>每个卷积核:<span class="math inline">\(3 \times 3 \times 3\)</span>;数量:8</td>
</tr>
<tr>
<td><strong>卷积输出 Z(未激活)</strong></td>
<td>使用公式:<span class="math inline">\(n_H^{} = (34 - 3)/1 + 1 = 32\)</span>,最终:<span class="math inline">\(32 \times 32 \times 8\)</span></td>
</tr>
<tr>
<td><strong>激活 A(逐像素激活)</strong></td>
<td>与 Z 同维度:<span class="math inline">\(32 \times 32 \times 8\)</span></td>
</tr>
<tr>
<td><strong>输出</strong></td>
<td><span class="math inline">\(32 \times 32 \times 8\)</span></td>
</tr>
</tbody>
</table>
<p>我们继续,讨论一下之前提到过的网络参数问题。</p>
<h1 id="4-卷积层的参数量">4. 卷积层的参数量</h1>
<p>还是在第一部分里,我们提到过,大图片输入全连接层会让网络的参数规模巨大,不仅硬件可能跟不上,更有可能出现梯度现象。</p>
<p>那卷积是如何缓解这个问题的呢?卷积层的参数量又是如何组织的呢?<br>
我们还是用上面的例子来进行演示:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251210190907712-1175094467.png" alt="image.png" loading="lazy"></p>
<p>可以发现,对于相同的输入,卷积网络只需要维护 56 个参数,但是全连接网络却需要 218 个。<br>
但这不是重点,218 个参数好像也不是很多。<br>
<strong>重点在于,卷积层的参数量不因输入图像尺寸变化而变化。</strong> 继续往下看:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251210190922981-1180857508.png" alt="image.png" loading="lazy"><br>
<strong>这就是卷积相对于全连接在处理这种大尺寸,多通道且有空间结构的数据时的核心优势所在。</strong></p>
<p>最后,看一个简单的卷积神经网络示例。</p>
<h1 id="5-一个简单的卷积神经网络">5. 一个简单的卷积神经网络</h1>
<p>现在,经过一步步引入,我们来看一个简单的卷积神经网络。<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251210191254223-1263704041.png" alt="image.png" loading="lazy"><br>
<strong>之后,我们就会用这种“立方体”的形式来表示卷积网络,这也是文献中的常用形式。</strong></p>
<p>正向传播的过程不难理解,一步步计算就可以得到,但我想你可能有一个疑惑,那就是<strong>为什么最后的特征图还是要展平输入全连接层?</strong><br>
我们展开一下:</p>
<h2 id="51-卷积网络为什么要这么设计">5.1 卷积网络为什么要这么设计?</h2>
<p>我们通过卷积层和全连接层在这个任务中的作用来解答这个问题。<br>
先说结论:<strong>卷积层负责“看图”,全连接层负责“做决定”。</strong></p>
<h4 id="1卷积层逐步提取特征">(1)卷积层逐步提取特征</h4>
<p>我们知道,图像通过卷积层得到特征图,随着层层卷积,特征也从低级渐渐组合到高级,从边缘,纹理渐渐组成眼睛,耳朵。<br>
因此,我们可以说:<strong>卷积层的作用是提取图像特征,为后续层提供更高层次的语义特征。</strong><br>
这是全连接层做不到的地方,因为它看不到空间结构。</p>
<h4 id="2全连接层依据特征进行决策">(2)全连接层依据特征进行决策</h4>
<p>当然,全连接层也有自己的作用。<br>
当卷积到最后,我们得到的特征图已经相当高级了,这个通道可能识别出了猫耳朵,那个通道可能识别出了猫眼睛。<br>
<strong>但是在当前的任务要求中,我们不能把一幅图作为输出,即使经过激活函数,卷积层输出的仍是特征图而非“结果”。</strong><br>
谁能根据这些信息得出结果?就是全连接层。</p>
<h4 id="3为什么现在又可以展平了">(3)为什么现在又可以展平了?</h4>
<p>我们最开始说展平会破坏空间结构,但是现在的展平,就不再有这么大的破坏性。<br>
为什么?<br>
原因很简单:<strong>卷积层已经把图像的空间结构“消化”得差不多了。</strong><br>
早期卷积层确实非常依赖空间关系,你不能随便打乱像素位置,否则边缘、角点、纹理这种“几何意义”就会被破坏得一干二净。<br>
但到了网络后期,情况变了。在经历了多次卷积之后,特征图已经不再是“边缘弯曲”这种几何信息,而更像是“耳朵是否存在”“眼睛的形状是否明显”“身体轮廓形状”这样的<strong>语义级信息</strong>。<br>
也就是说,<strong>空间结构逐渐被抽象成了“有没有”而不是“在哪儿”。</strong> 它们的位置影响已经远不如它们的出现与否重要。<br>
现在,<strong>全连接层就可以根据这些有什么,没有什么来做出最后的决定。</strong></p>
<p>最后,举一个比较形象的例子:<strong>拼拼图</strong><br>
我们现在有一个非常难的拼图,非常的细碎,卷积层的作用就是把小拼块拼成大拼块,让难度降低。<br>
而全连接层就是以卷积层拼出的大拼块为依据,识别到“原来我在拼一只猫。”</p>
<h1 id="6-总结">6. 总结</h1>
<table>
<thead>
<tr>
<th><strong>概念</strong></th>
<th><strong>原理</strong></th>
<th><strong>比喻</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>多通道卷积核</strong></td>
<td>卷积核也需匹配输入的通道数,尺寸从 <span class="math inline">\(f\times f\)</span> 变为 <span class="math inline">\(f\times f\times n_c\)</span>。</td>
<td>海绵变成“叠三层的海绵”,每层分别处理 R/G/B 信息。</td>
</tr>
<tr>
<td><strong>多维卷积输出为单通道</strong></td>
<td>对 R/G/B 分别卷积后相加,得到一个数 → 输出一个特征图。是对同一图像的“整体特征”判断。</td>
<td>你戴三种颜色滤镜看同一苹果,最后你只能综合得到一个“轮廓”,不会有三个版本。</td>
</tr>
<tr>
<td><strong>特征图数量(输出通道数)</strong></td>
<td>一个卷积核提取一种特征;多个卷积核就得到多个特征图,形成输出的多个通道。</td>
<td>一组侦探同时观察同一画面:一个找边缘、一个找亮度、一个找纹理 → 每人报告一页结果。</td>
</tr>
<tr>
<td><strong>卷积层正向传播</strong></td>
<td>将全连接层的 <span class="math inline">\(W A + b\)</span> 替换为卷积运算,再对每个像素激活。</td>
<td>原来是“数字相乘”,现在换成“贴着图像移动的小窗口扫描”。</td>
</tr>
<tr>
<td><strong>激活函数在卷积层中的作用</strong></td>
<td>对每一个像素位置逐点激活,使特征产生非线性组合。</td>
<td>没有激活就像用直尺拼图;加了激活就像用橡皮泥,可以弯、可以变形,能组合出复杂形状。</td>
</tr>
<tr>
<td><strong>卷积层参数量不随输入尺寸变大</strong></td>
<td>参数只依赖卷积核大小与数量,而不依赖输入宽高。</td>
<td>海绵的孔洞数固定,不管你擦大桌子还是小桌子,海绵“设计参数”都不增加。</td>
</tr>
<tr>
<td><strong>全连接层 vs 卷积层的分工</strong></td>
<td>卷积层负责提取特征;全连接层负责根据特征分类或决策。</td>
<td>卷积层是“眼睛”,全连接层是“裁判”。</td>
</tr>
<tr>
<td><strong>为什么最后要展平?</strong></td>
<td>因为卷积层已经把空间结构提炼得很浓缩、很抽象,这时展平不会破坏太多信息,方便 FC 层决策。</td>
<td>像把猫的五官特征总结成“说明书”,此时把说明书摊平给裁判看就够了。</td>
</tr>
</tbody>
</table><br><br>
来源:https://www.cnblogs.com/Goblinscholar/p/19332938
頁: [1]
查看完整版本: 吴恩达深度学习课程四:计算机视觉 第一周:卷积基础知识(三)简单卷积网络