13 卷积神经网络(基础)

卷积神经网络

  这篇博客主要介绍卷积神经网络(Convolutional Neural Network),简称 CNN。
  
  我们在上一篇博客中介绍了全连接的神经网络,如果一个网络中全都是由线性层串联起来,那么我们称这个网络为全连接网络,下图就是在上篇博客中介绍的全连接网络。

在这里插入图片描述
  
  下面我们来探讨一下处理图像的时候经常用到的二维卷积神经网络。首先我们来看一下它的工作方式是怎样的?
  
  之前说过我们输入的 MNIST数据集中的图像是 1x28x28( C C Cx W W Wx H H H) 的张量,然后我们的图像要通过一个卷积层,这个卷积层的作用是保留图像的空间特征。之前我们在全连接的时候,我们图像直接转换成了一个 1x N N N 的向量,就可能会导致原本在空间中距离很近的点转变成向量之后相隔的距离就会很远,破坏了原本图像的空间特征。而我们使用一个卷积神经网络,就可以很好的保留空间特征。比如下图,将一个 1x28x28 的图像卷积成了一个 4 个通道,然后每个通道的大小都是 24x24。

在这里插入图片描述
  
  接下来我们做一个 2x2 的 Subsampling(下采样),之后就变成了 4 个通道,像素变成了12x12。所以我们发现在使用下采样的时候,通道数是不变的,但是图像的宽度和高度会发生改变。下采样的目的就是减少数据量,降低运算需求。

在这里插入图片描述
  
  之后再做一个 5x5 的卷积,再做一个 2x2 的下采样,我们最后形成的一个三阶的向量,但是我们最终输出的是一个一阶的张量,所以我们需要做一次转换,转换之后我们再使用全连接层映射到10 维的一个向量上,再接上交叉熵损失,利用 Softmax 去计算它的分布,最终我们就可以去解决分类问题。

在这里插入图片描述
  
  所以,我们在构建一个神经网络的时候,首先需要明确的是输入的张量的维度是多少?输出的张量的维度是多少?
  
  在这样的网络中,我们把卷积和下采样的工作叫做 Feature Extraction(特征提取),把后面全连接的部分叫做 Classification。

在这里插入图片描述
  
  当我们拿到一个图像,肯定要分成红绿蓝三个通道。

在这里插入图片描述
  
  之后在进行卷积的时候,我们要取一个 Patch,这个 Patch 就是我们每个通道里面都取宽和高相同的块,所以这个 Patch 就是一个 3xWxH 的张量。
  
在这里插入图片描述
  
  然后我们将 Patch 抽离出来做卷积,卷积之后通道可能会变,宽和高也可能会变。
  
  接下来我们看一下卷积的运算过程。我们的输入是一个 1x5x5 的单通道图像,我们所用的卷积核是一个 3x3 的。

在这里插入图片描述
  
  首先我们要在 Input 中画出与卷积核相同大小的窗口。

在这里插入图片描述
  
  然后与卷积核做数乘(对应位置元素相乘)。注意,不是矩阵乘法。然后将结果填入 Output 第一个位置上。

在这里插入图片描述
  
  接下来,我们将窗口往右移动一格,然后再与卷积核做数乘,将结果填入 Output 第二个位置上。

在这里插入图片描述
  
  以此类推,这个窗口不断在 Input 中进行遍历,然后将最后的结果填入 Output 框中。

在这里插入图片描述
  

  这个过程就是一个单通道的卷积。但是我们在做卷积的时候,通常都是多个通道,比如说,输入一个图像就有 3 个通道。下面我就以 3 通道为例,展示它的卷积是怎样做的?
  

  如下,红色的通道和一个卷积核做数乘得到一个 Output,绿色的通道和另一个卷积核做数乘得到一个 Output,蓝色的通道又和另一个卷积核做数乘得到一个 Output。

  
在这里插入图片描述
  
  换句话说,我们的每一个通道都要配一个核,即核数量要等于输入的通道数。我们在得到 3 个 Output 之后,就需要对 3 个矩阵做加法,加完之后就得到一个矩阵。
  
在这里插入图片描述
  
  那么我们将下面的过程叫做 Convolution(卷积运算)。

在这里插入图片描述
  
  如果我们把刚才的过程从平面变成立体的,那么该过程如下:
  
在这里插入图片描述
  
  我们也可以用另一种形式表示:

在这里插入图片描述
  
  我们再把通道数加上:

在这里插入图片描述
  
  这里有一个结论,如果我们是一个 3x3 的卷积核,那么我们最后得到的 Output 的宽和高等于 Input 的宽和高上减 2如果我们是一个 5x5 的卷积核,那么我们最后得到的 Output 的宽和高等于 Input 的宽和高上减 4。所以,如果你的输入是 n n n 个通道,那么卷积核的通道会变成 n n n ,它们是一致的,那么卷积核就是一个 n n nx3x3 的张量,输入的结果是一个 1x3x3 的张量。

在这里插入图片描述
  
  但是如果我们想要 m m m 个输出通道,那么怎么得到呢?试想一下,我们用一个 n n nx3x3 的卷积核可以得到 1 个 1x3x3 的输出通道,那么我们想要 m m m 个输出通道,我们是不是需要用 m m m n n nx3x3 的卷积核即可。最后我们将 m m m 个 1x3x3 的输出通道按顺序拼接起来,就形成了 m m mx3x3 的输出通道。

在这里插入图片描述
  
  如果我们要做如下卷积。

在这里插入图片描述
  
  首先我们得知道卷积核的大小,而且我们需要 m m m 个卷积核,那么我们就可以把这 m m m 个卷积核拼成一个张量,把它变成一个四维的张量。

在这里插入图片描述
  
  接下来我们就来看一下具体的代码。

在这里插入图片描述
  
  我们要定义一个卷积层,只要注意这 4 个值,就可以把一个卷积层定义下来。分别是输入通道,输出通道,卷积核大小。注意定义一个卷积层和图像的大小是没有关系的。
  

  另外我们再介绍卷积层中几个常见的参数,第一个是 padding。举个栗子,现在我们有一个 5x5 的单层通道,我们用了一个 3x3 的卷积核,得到的结果是 3x3 的。

在这里插入图片描述
  
  但是现在我们不想要 3x3 的,我们希望得到的依然是一个 5x5 的,那么我们就可以在 Input 外面填充一圈,那么 Input 就变成一个 7x7 的通道,用该通道和 3x3 的卷积核做卷积得到的就是一个 5x5 的 Output,这个过程就叫做 padding。

在这里插入图片描述
  
  如果 Output 想保持与 Input 相同的 Channel,这里面填充的圈数可以这样计算,如果卷积核是 3x3 的,用 3/2=1,就填充一圈;如果卷积核是 5x5 的,用 5/2=2,就填充两圈。padding最常见的的方式就是填充 0。

在这里插入图片描述
  
  上述过程我们用代码表示如下:

在这里插入图片描述
  
  除了 padding 之外,还有一个参数为 stride(步长),假设 stride 为 2,那么 Input 中的窗口每次移动 2 格。

在这里插入图片描述
  
  所以一个 5x5 的 Input 和一个 3x3 的卷积核做卷积就变成了一个 2x2 的 Output。这个可以有效的降低 Output 的宽度和高度。

在这里插入图片描述
  
  用代码表示如下:

在这里插入图片描述
  
  然后来看一下下采样,我们比较常用的下采样就是 MaxPooling(最大池化层),它是没有权重的。比如说我们用一个 2x2 的 MaxPooling,默认 stride=2。所以它做的就是将我们的 Input 分成 2x2 一组的区域,然后在每一个区域中找最大值。它只能够在一个通道上面做,不能在通道与通道之间做,所以 MaxPooling 之后,通道数量是不变的。但是如果用一个 2x2 做 MaxPooling,得到的结果的宽度和高度会是原来的一半。

在这里插入图片描述
  
  MaxPooling 代码如下,当设置 kernel_size=2时,默认的 stride=2:

在这里插入图片描述
  

  最后我们就来实现简单的卷积神经网络处理 MNIST 数据集。假设我们的第一个卷积层是 5x5 的,输入通道是 1,输出通道是 10.。所以我们就能算出第一个 Output 的张量为 (batch, 10, 24, 24),这里为什么是 24 呢?因为卷积核用的是 5x5 的,要在原来的宽度和高度上减去 4.。

在这里插入图片描述
  
  然后我们那拿这个输出再做一个 MaxPooling,batch 和通道数都不会变,宽度和高度减半。

在这里插入图片描述
  

  之后我们再做一次相同的卷积(输入通道变成了 10,输出通道变成了 20)和 MaxPooling。

在这里插入图片描述
  
  在最后一个输出中,有 20x4x4=320 个元素,我们把它变成一个向量,然后再经过一个全连接层映射成 10 个维度的一个向量。

在这里插入图片描述
  
  下面就是整个过程的流程图:

在这里插入图片描述
  
  那么对应的代码如下:

在这里插入图片描述
  

  最后我们说一下怎么使用 GPU 来进行计算,我们要做的就是将运算迁移到 GPU 上,分成如下几步:

  第一步:将模型迁移到 GPU

在这里插入图片描述
在这里插入图片描述
  
  第二步:将计算的张量也迁移到 GPU 上。

在这里插入图片描述
在这里插入图片描述
  
  这样我们就可以利用 GPU 来加速计算过程。
  
  下面是这个过程的输出,我们发现分类准确度达到了 98%,之前使用全连接神经网络时,分类准确度只有 97%。

在这里插入图片描述


  具体代码见 13 卷积神经网络(基础).ipynb

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值