吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)1.7-1.8

第四门课 卷积神经网络(Convolutional Neural Networks)

第一周 卷积神经网络(Foundations of Convolutional Neural Networks)

1.7 单层卷积网络(One layer of a convolutional network)

今天我们要讲的是如何构建卷积神经网络的卷积层,下面来看个例子。
在这里插入图片描述
上节课,我们已经讲了如何通过两个过滤器卷积处理一个三维图像,并输出两个不同的4×4 矩阵。假设使用第一个过滤器进行卷积,得到第一个 4×4 矩阵。使用第二个过滤器进行卷积得到另外一个 4×4 矩阵。

在这里插入图片描述
最终各自形成一个卷积神经网络层,然后增加偏差,它是一个实数,通过 Python 的广播机制给这 16 个元素都加上同一偏差。然后应用非线性函数,为了说明,它是一个非线性激活函数 ReLU,输出结果是一个 4×4 矩阵。

对于第二个 4×4 矩阵,我们加上不同的偏差,它也是一个实数,16 个数字都加上同一个实数,然后应用非线性函数,也就是一个非线性激活函数 ReLU,最终得到另一个 4×4 矩阵。然后重复我们之前的步骤,把这两个矩阵堆叠起来,最终得到一个 4×4×2 的矩阵。我们通过计算,从 6×6×3 的输入推导出一个 4×4×2 矩阵,它是卷积神经网络的一层,把它映射到标准神经网络中四个卷积层中的某一层或者一个非卷积神经网络中。

在这里插入图片描述
注意前向传播中一个操作就是 z [ 1 ] = W [ 1 ] a [ 0 ] + b [ 1 ] z^{[1]} = W^{[1]}a^{[0]} + b^{[1]} z[1]=W[1]a[0]+b[1],其中 a [ 0 ] a^{[0]} a[0] = 𝑥,执行非线性函数得到 a [ 1 ] a^[1] a[1],即 a [ 1 ] = g ( z [ 1 ] ) a^[1] = g(z^{[1]}) a[1]=g(z[1])。这里的输入是 a [ 0 ] a^{[0]} a[0],也就是𝑥,这些过滤器用变量 W [ 1 ] W^{[1]} W[1]表示。在卷积过程中,我们对这 27 个数进行操作,其实是 27×2,因为我们用了两个过滤器,我们取这些数做乘法。实际执行了一个线性函数,得到一个 4×4 的矩阵。卷积操作的输出结果是一个4×4 的矩阵,它的作用类似于 W [ 1 ] a [ 0 ] W^{[1]}a^{[0]} W[1]a[0],也就是这两个 4×4 矩阵的输出结果,然后加上偏差。
在这里插入图片描述
这一部分(图中蓝色边框标记的部分)就是应用激活函数 ReLU 之前的值,它的作用类似于 z [ 1 ] z^{[1]} z[1],最后应用非线性函数,得到的这个 4×4×2 矩阵,成为神经网络的下一层,也就是激活层。

这就是 a [ 0 ] a^{[0]} a[0] a [ 1 ] a^{[1]} a[1]的演变过程,首先执行线性函数,然后所有元素相乘做卷积,具体做法是运用线性函数再加上偏差,然后应用激活函数 ReLU。这样就通过神经网络的一层把一个6×6×3 的维度 a [ 0 ] a^{[0]} a[0]演化为一个 4×4×2 维度的 a [ 1 ] a^{[1]} a[1],这就是卷积神经网络的一层。

示例中我们有两个过滤器,也就是有两个特征,因此我们才最终得到一个 4×4×2 的输出。但如果我们用了 10 个过滤器,而不是 2 个,我们最后会得到一个 4×4×10 维度的输出图像,因为我们选取了其中 10 个特征映射,而不仅仅是 2 个,将它们堆叠在一起,形成一个4×4×10 的输出图像,也就是 a [ 1 ] a^[1] a[1]

在这里插入图片描述
为了加深理解,我们来做一个练习。假设你有 10 个过滤器,而不是 2 个,神经网络一层是 3×3×3,那么,这一层有多少个参数呢?我们来计算一下,每一层都是一个 3×3×3 的矩阵,因此每个过滤器有 27 个参数,也就是 27 个数。然后加上一个偏差,用参数𝑏表示,现在参数增加到 28 个。上一页幻灯片里我画了 2 个过滤器,而现在我们有 10 个,加在一起是 28×10,也就是 280 个参数。

请注意一点,不论输入图片有多大,1000×1000 也好,5000×5000 也好,参数始终都是280 个。用这 10 个过滤器来提取特征,如垂直边缘,水平边缘和其它特征。即使这些图片很大,参数却很少,这就是卷积神经网络的一个特征,叫作“避免过拟合”。你已经知道到如何提取 10 个特征,可以应用到大图片中,而参数数量固定不变,此例中只有 28 个,相对较少。

最后我们总结一下用于描述卷积神经网络中的一层(以𝑙层为例),也就是卷积层的各种标记。

在这里插入图片描述
这一层是卷积层,用 f [ l ] f^{[l]} f[l]表示过滤器大小,我们说过过滤器大小为𝑓 × 𝑓,上标[𝑙]表示𝑙层中过滤器大小为𝑓 × 𝑓。通常情况下,上标[𝑙]用来标记𝑙层。用 p [ l ] p^{[l]} p[l]来标记 padding 的数量,padding 数量也可指定为一个 valid 卷积,即无 padding。或是 same 卷积,即选定 padding,如此一来,输出和输入图片的高度和宽度就相同了。用 s [ l ] s^{[l]} s[l]标记步幅。这一层的输入会是某个维度的数据,表示为 n × n × n c n × n × n_c n×n×nc n c n_c nc某层上的颜色通道数。我们要稍作修改,增加上标[l − 1],即 n [ l − 1 ] × n [ l − 1 ] × n c [ l − 1 ] n^{[l−1]} × n^{[l−1]} × n_c^{[l−1]} n[l1]×n[l1]×nc[l1],因为它是上一层的激活值。

此例中,所用图片的高度和宽度都一样,但它们也有可能不同,所以分别用上下标𝐻和𝑊来标记,即 n H [ l − 1 ] × n W [ l − 1 ] × n c [ l − 1 ] n_H^{[l−1]} × n_W^{[l−1]} × n_c^{[l−1]} nH[l1]×nW[l1]×nc[l1]。那么在第𝑙层,图片大小为 n H [ l − 1 ] × n W [ l − 1 ] × n c [ l − 1 ] n_H^{[l−1]} × n_W^{[l−1]} × n_c^{[l−1]} nH[l1]×nW[l1]×nc[l1],𝑙层的输入就是上一层的输出,因此上标要用[𝑙 − 1]。神经网络这一层中会有输出,它本身会输出图像。其大小为 n H [ l ] × n W [ l ] × n c [ l ] n_H^{[l]} × n_W^{[l]} × n_c^{[l]} nH[l]×nW[l]×nc[l],这就是输出图像的大小。

前面我们提到过,这个公式给出了输出图片的大小,至少给出了高度和宽度,⌊ n + 2 p − f s + 1 \frac{n+2p−f}{s}+1 sn+2pf+1⌋(注意:( n + 2 p − f s + 1 \frac{n+2p−f}{s}+1 sn+2pf+1)直接用这个运算结果,也可以向下取整)。在这个新表达式中,𝑙层输出图像的高度,即 n H [ l ] n_H^{[l]} nH[l] = ⌊ n H [ l − 1 ] + 2 p [ l ] − f [ l ] s [ l ] + 1 \frac{n_H^{[l−1]}+2p^{[l]}−f^{[l]}}{s[l]}+ 1 s[l]nH[l1]+2p[l]f[l]+1⌋,同样我们可以计算出图像的宽度,用𝑊替换参数𝐻,即 n W [ l ] n_W^{[l]} nW[l] = ⌊ n W [ l − 1 ] + 2 p [ l ] − f [ l ] s [ l ] + 1 \frac{n_W^{[l−1]}+2p^{[l]}−f^{[l]}}{s[l]}+ 1 s[l]nW[l1]+2p[l]f[l]+1⌋,公式一样,只要变化高度和宽度的参数我们便能计算输出图像的高度或宽度。这就是由 n H [ l − 1 ] n_H^{[l-1]} nH[l1]推导 n H [ l ] n_H^{[l]} nH[l]以及 n W [ l − 1 ] n_W^{[l-1]} nW[l1]推导 n W [ l ] n_W^{[l]} nW[l]的过程。

那么通道数量又是什么?这些数字从哪儿来的?我们来看一下。输出图像也具有深度,通过上一个示例,我们知道它等于该层中过滤器的数量,如果有 2 个过滤器,输出图像就是4×4×2,它是二维的,如果有 10 个过滤器,输出图像就是 4×4×10。输出图像中的通道数量就是神经网络中这一层所使用的过滤器的数量。如何确定过滤器的大小呢?我们知道卷积一个 6×6×3 的图片需要一个 3×3×3 的过滤器,因此过滤器中通道的数量必须与输入中通道的数量一致。因此,输出通道数量就是输入通道数量,所以过滤器维度等于 f [ l ] × f [ l ] × n c [ l − 1 ] f[l] × f[l] × n_c[l−1] f[l]×f[l]×nc[l1]

在这里插入图片描述
应用偏差和非线性函数之后,这一层的输出等于它的激活值 a [ l ] a^{[l]} a[l],也就是这个维度(输出维度)。 a [ l ] a^{[l]} a[l]是一个三维体,即 n H [ l ] × n W [ l ] × n c [ l ] n_H^{[l]} × n_W^{[l]} × n_c^{[l]} nH[l]×nW[l]×nc[l]。当你执行批量梯度下降或小批量梯度下降时,如果有𝑚个例子,就是有𝑚个激活值的集合,那么输出 A [ l ] = m × n H [ l ] × n W [ l ] × n c [ l ] A^[l] = m × n_H^{[l]} × n_W^{[l]} × n_c^{[l]} A[l]=m×nH[l]×nW[l]×nc[l]。如果采用批量梯度下降,变量的排列顺序如下,首先是索引和训练示例,然后是其它三个变量。

该如何确定权重参数,即参数 W 呢?过滤器的维度已知,为 f [ l ] × f [ l ] × n c [ l − 1 ] f^{[l]} × f^{[l]} × n_c^{[l−1]} f[l]×f[l]×nc[l1],这只是一个过滤器的维度,有多少个过滤器,这( n c [ l ] n_c^{[l]} nc[l])是过滤器的数量,权重也就是所有过滤器的集合再乘以过滤器的总数量,即 f [ l ] × f [ l ] × n c [ l − 1 ] × n c [ l ] f^{[l]} × f^{[l]} × n_c^{[l−1]}× n_c^{[l]} f[l]×f[l]×nc[l1]×nc[l],损失数量 L 就是𝑙层中过滤器的个数。

最后我们看看偏差参数,每个过滤器都有一个偏差参数,它是一个实数。偏差包含了这些变量,它是该维度上的一个向量。后续课程中我们会看到,为了方便,偏差在代码中表示为一个 1 × 1 × 1 × n c [ l ] 1×1×1×n_c[l] 1×1×1×nc[l]的四维向量或四维张量。

在这里插入图片描述
卷积有很多种标记方法,这是我们最常用的卷积符号。大家在线搜索或查看开源代码时,关于高度,宽度和通道的顺序并没有完全统一的标准卷积,所以在查看 GitHub 上的源代码或阅读一些开源实现的时候,你会发现有些作者会采用把通道放在首位的编码标准,有时所有变量都采用这种标准。实际上在某些架构中,当检索这些图片时,会有一个变量或参数来标识计算通道数量和通道损失数量的先后顺序。只要保持一致,这两种卷积标准都可用。很遗憾,这只是一部分标记法,因为深度学习文献并未对标记达成一致,但课上我会采用这种卷积标识法,按高度,宽度和通道损失数量的顺序依次计算。

在这里插入图片描述
我知道,忽然间接触到这么多新的标记方法,你可能会说,这么多怎么记呢?别担心,不用全都记住,你可以通过本周的练习来熟悉它们。而这节课我想讲的重点是,卷积神经网络的某一卷积层的工作原理,以及如何计算某一卷积层的激活函数,并映射到下一层的激活值。了解了卷积神经网络中某一卷积层的工作原理,我们就可以把它们堆叠起来形成一个深度卷积神经网络,我们下节课再讲。

1.8 简 单 卷 积 网 络 示 例 ( A simple convolution network example)

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值