深度学习:卷积神经网络(CNN)

矩阵卷积运算

两个矩阵,一个大矩阵一个小矩阵,将小矩阵在大矩阵中重叠并不断移动,每次重叠时将对应元素相乘并累加,将这个结果作为运算结果矩阵中的一个元素值。
在这里插入图片描述
如上图,一个 6 × 6 6\times 6 6×6的矩阵与 3 × 3 3\times 3 3×3的矩阵做卷积,将小矩阵与大矩阵的左上角重叠,对应元素相乘并累加就得到了结果矩阵左上角元素的值。完整的卷积运算结果为:
在这里插入图片描述
在大部分机器学习框架中都有对应的函数来实现这一运算。

这个 3 × 3 3\times 3 3×3的小矩阵被称为“过滤器”,利用它我们可以在图片中寻找边界。其权值可以是手工确定的,也可以让算法自己学习。
在这里插入图片描述
本来按照数学定义,卷积应该有一个“翻转”的操作,但是对于我们自己定义的滤波器来说,将滤波器中的元素翻转后在运算中再次翻转是没什么必要的,不如就直接按对应位运算,只是在深度学习领域中大家约定俗成都把该运算称为卷积。

有效卷积(valid convolution)

就是上面提到的矩阵卷积,这样运算一次过后,矩阵的大小会缩小。对于 n × m n\times m n×m的矩阵,在与 f × f f\times f f×f的矩阵做有效卷积后,得到的是一个 ( n − f + 1 ) × ( m − f + 1 ) (n-f+1)\times(m-f+1) (nf+1)×(mf+1)的矩阵。对于深度神经网络来说,这样的矩阵“缩水”很可能导致在靠后的隐藏层中矩阵被缩减到一个无法接受的大小,同时边缘元素的信息在运算中的利用率要低于中央的元素。

等大卷积(same convolution)

顾名思义,卷积前后矩阵大小不变,需要在原矩阵边缘填充(padding)空白元素。一般是填充等宽的一周,让原矩阵变成 ( n + 2 p ) × ( m + 2 p ) (n+2p)\times(m+2p) (n+2p)×(m+2p),所以宽度 p = f − 1 2 p=\frac{f-1}{2} p=2f1,因此过滤器矩阵的维度一般都是奇数。

带步长卷积(strided convolution)

就是在普通卷积的基础上,每次移动小矩阵的时候不止移动1格,而是另一个设定的步长 S S S
在这里插入图片描述
因此 n × m n\times m n×m的矩阵与 f × f f\times f f×f的过滤器卷积的结果是 ⌊ n + 2 p − f s + 1 ⌋ × ⌊ m + 2 p − f s + 1 ⌋ \lfloor\frac{n+2p-f}{s}+1\rfloor\times\lfloor\frac{m+2p-f}{s}+1\rfloor sn+2pf+1×sm+2pf+1的新矩阵。

三维卷积

对于彩色图像而不是灰度图像,图像矩阵将拥有三个维度,因为每个像素点有三个数字表示RGB值,所以我们要做的变成了三维上的卷积。原矩阵大小为 n × m × 3 n\times m\times 3 n×m×3,过滤器大小为 f × f × 3 f\times f\times 3 f×f×3注意在第三维两个矩阵的大小是相等的。之后运算与二维情况几乎一致,把第三个维度上的所有值累加起来,得到的还是一个 ( n − f + 1 ) × ( m − f + 1 ) (n-f+1)\times(m-f+1) (nf+1)×(mf+1)的二维矩阵。

通过将滤波器上的三维设置成不同数值,我们可以实现只检测某个颜色层上的特征或者在不同颜色层上检测不同种类的特征。如果一个滤波器无法满足所有需求,只需要再来几个滤波器,将这些滤波器得到的结果重叠在一起就可以得到一个多维的输出:
在这里插入图片描述
通用的表达式为,原矩阵大小为 n × m × p n\times m\times p n×m×p,过滤器为 q q q个大小 f × f × p f\times f\times p f×f×p的矩阵,那么输出就是 ( n − f + 1 ) × ( m − f + 1 ) × q (n-f+1)\times(m-f+1)\times q (nf+1)×(mf+1)×q的三维矩阵。

tips:在专业术语中,一般将第三维称之为“通道(channel)”或“深度”。

卷积层

类比一下,过滤器充当了之前神经网络上 W [ l ] W^{[l]} W[l]的功能,因此剩下的就是添加偏置与非线性激活函数。在下面的示意中,每个过滤器在完成卷积运算后,加上了各自的偏置,之后通过非线性激活函数,再组合在一起就得到了这一层的运算结果:在这里插入图片描述
这样的好处在于,不管输入的矩阵有多大,我们用 q q q f × f × p f\times f\times p f×f×p个过滤器运算的时候需要的参数永远只有 q × ( f × f × p + 1 ) q\times (f\times f\times p+1) q×(f×f×p+1)个,不太容易过拟合。而且,即使图像的大小改变,同样的运算依然可以直接适用。

现定义一些神经网络中的符号表达:
滤波器大小为 f [ l ] f^{[l]} f[l]
填充宽度为 p [ l ] p^{[l]} p[l]
卷积步长为 s [ l ] s^{[l]} s[l]
过滤器数目为 n C [ l ] n^{[l]}_C nC[l]
过滤器矩阵大小为 f [ l ] × f [ l ] × n C [ l − 1 ] f^{[l]}\times f^{[l]}\times n_C^{[l-1]} f[l]×f[l]×nC[l1]
输入矩阵大小为 n H [ l − 1 ] × n W [ l − 1 ] × n C [ l − 1 ] n^{[l-1]}_H\times n^{[l-1]}_W\times n^{[l-1]}_C nH[l1]×nW[l1]×nC[l1],分别表示高、宽、通道数;
同理输出矩阵大小就是 n H [ l ] × n W [ l ] × n C [ l ] n^{[l]}_H\times n^{[l]}_W\times n^{[l]}_C nH[l]×nW[l]×nC[l]

输入输出矩阵的高和宽有如下关系:
n H [ l ] = ⌊ n H [ l − 1 ] + 2 p [ l ] − f [ l ] s [ l ] + 1 ⌋ n W [ l ] = ⌊ n W [ l − 1 ] + 2 p [ l ] − f [ l ] s [ l ] + 1 ⌋ n^{[l]}_H=\lfloor\frac{n^{[l-1]}_H+2p^{[l]}-f^{[l]}}{s^{[l]}}+1\rfloor\\ n^{[l]}_W=\lfloor\frac{n^{[l-1]}_W+2p^{[l]}-f^{[l]}}{s^{[l]}}+1\rfloor nH[l]=s[l]nH[l1]+2p[l]f[l]+1nW[l]=s[l]nW[l1]+2p[l]f[l]+1

对于批次训练,该层的激活矩阵 A [ l ] A^{[l]} A[l]则是四维的,大小为 m × n H [ l ] × n W [ l ] × n C [ l ] m\times n^{[l]}_H\times n^{[l]}_W\times n^{[l]}_C m×nH[l]×nW[l]×nC[l]
权重矩阵 W [ l ] W^{[l]} W[l]同理,大小是 f [ l ] × f [ l ] × n C [ l − 1 ] × n C [ l ] f^{[l]}\times f^{[l]}\times n_C^{[l-1]}\times n^{[l]}_C f[l]×f[l]×nC[l1]×nC[l]
偏置矩阵 b [ l ] b^{[l]} b[l]大小则是 1 × 1 × 1 × n C [ l ] 1\times 1\times 1\times n_C^{[l]} 1×1×1×nC[l]

下面展示一个典型的卷积网络运算过程,随着网络深度增加,矩阵的高和宽逐渐缩减而通道数逐渐增多。在最后一层,高维矩阵被展开成一维向量,输入到诸如softmax的分类器中,得到最终结果。
在这里插入图片描述

池化层(pooling layer)

字面翻译是池化,有些地方意译为汇合层。

最大池化(max pooling)

跟卷积的重叠-移动过程差不多,但是把按位相乘求和改为求最大值。
在这里插入图片描述
f , s , p f,s,p f,s,p之类的参数,但是在三维情况下,我们不会在三维中求最大,而是在每个通道内求最大,所以输入输出矩阵的通道数是相等的,也用不上多个池化矩阵。笼统地讲,该运算的作用是检测特征值,如果检测到了特征值,那么对应元素的激励值会很大,因此在池化后矩阵中的元素就很大,而如果激励较小,则池化后元素相较别的元素同样较小。

平均池化(average pooling)

取最大值操作变成取均值。

在池化层中,一般没有填充( p [ l ] = 0 p^{[l]}=0 p[l]=0),所以输入 n H [ l − 1 ] × n W [ l − 1 ] × n C [ l − 1 ] n^{[l-1]}_H\times n^{[l-1]}_W\times n^{[l-1]}_C nH[l1]×nW[l1]×nC[l1]的矩阵最后会得到 ⌊ n H [ l − 1 ] − f [ l ] s [ l ] + 1 ⌋ × ⌊ n W [ l − 1 ] − f [ l ] s [ l ] + 1 ⌋ × n C [ l − 1 ] \lfloor\frac{n^{[l-1]}_H-f^{[l]}}{s^{[l]}}+1\rfloor\times \lfloor\frac{n^{[l-1]}_W-f^{[l]}}{s^{[l]}}+1\rfloor\times n^{[l-1]}_C s[l]nH[l1]f[l]+1×s[l]nW[l1]f[l]+1×nC[l1]。而 f [ l ] f^{[l]} f[l] s [ l ] s^{[l]} s[l]都是超参数,在人工或者验证集中设定好了以后就不用学习了。

全连接层

跟普通的神经网络层一致,即前后两层之间的每个节点都相互连接,见这篇博客

有了这三种基本层,我们就可以构造一个比较完备的卷积神经网络,以下是一个数字识别网络的大致架构示意:在这里插入图片描述
因为池化层没有需要学习的参数,所以常常与之前的卷积层绑定在一起,视为同一层。而网络中的矩阵高度与宽度也会逐渐缩减,通道数不断增加,最后变成全连通,然后得到唯一的输出。
在这里插入图片描述
参数数目更正:
Here are the 5 typos:

  1. 208 should be (553 + 1) * 8 = 608

  2. 416 should be (558 + 1) * 16 = 3216

  3. In the FC3, 48001 should be 400*120 + 120 = 48120, since the bias should have 120 parameters, not 1

  4. Similarly, in the FC4, 10081 should be 120*84 + 84 (not 1) = 10164
    (Here, the bias is for the fully connected layer. In fully connected layers, there will be one bias for each neuron, so the bias become In FC3 there were 120 neurons so 120 biases.)

  5. Finally, in the softmax, 841 should be 84*10 + 10 = 850

卷积的优势

参数共享

捕捉特征的过滤器矩阵(如边缘检测器)可以在整张图片上上通用,所以我们只需要保存一个过滤器矩阵大小的参数。而如果是全连通层,输入输出矩阵之间的每个节点都相互连接,需要的参数数量会非常惊人。

联系稀疏

在卷积运算中,输出矩阵的元素值只跟当时与过滤器矩阵重合的那几个元素有关,其他元素任意改变不影响其值,所以输入输出矩阵之间的联系是稀疏的,不想全连通矩阵输入矩阵每个元素都会影响输出矩阵每个元素。

以上这两点,就使得卷积网络需要的参数非常的少,面对图片这种(尤其是高清图片)特征值非常多的情况,我们仍然可以快速的学习并优化模型。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShadyPi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值