再战机器学习—卷积神经网络

作者: zidea | 来源:发表于2019-10-02 19:31 被阅读0次
卷积神经网络

卷积神经网络

卷积神经网络可能是离我们最近的神经网络,遍布在计算机视觉应用。通常卷积神经网络是由卷积层、池化层和全链接层所组成,所以我们看到卷积层就可以认为这是一个卷积神经网络。

卷积本质

  • 原始信号(输入)
  • 激励信号(特征模板)
    卷积就是根据激励信号对原始信号处理(滤波)的运算,就是对原始信号提取出有用的特征有用信号。

卷积神经网络出现背后的故事

我们在设计普通神经网络结构时候我们希望每一个神经元都是一个分类器来识别一些特征,而且他们是随着神经隐藏层逐渐加深而做更复杂的工作,例如第 1 层用于测试有什么颜色或者条纹出现。第 2 层根据第 1 层输入做更一些复杂事情。

一些简单图形识别,我们完全可以使用普通神经网络来解决,但是使用普通神经网络,计算量是不可想象的。我们以一个 100 * 100 像素小图为例,如果第二个层是一个 1000 神经元,那么每个神经元都接受上一层的神经元作为输入,那么每个神经元就会 100 * 100 * 1000 个权重,我们要计算这么多权重值,计算量可想而值。

什么是过拟合呢?我们从图中最右侧是过拟合,我们从图中可以看出这条弯弯曲曲的线性方程因为参数足够多,方程很好拟合训练集,但是线性方法无法正确反映数据集的规则。所以对于测试集表示就不好。因为参数足够多就会记住每一个样本,虽然精确记住样本。

我们都知道卷积神经网络可以帮助我们化简参数,但是为什么卷积神经网络有可能能够化简参数。

我们看图识物,是通过找出一些特征值(用于区别于其他类别的特征),例如熊猫,我们看看他眼睛周围是不是黑色,身体是不是白色的。然后根据这些我们看到特征来确定我们看到是熊猫而不是狗熊。

所以我们通过卷积(过滤器)来在整张过滤出我们想要信息,用于判断是否存在我们想要物体

还有我们可以将图片奇数行像素抽取后图片不会丢失什么特征。

什么是卷积

卷积是一种数学运算,这种运算本身很复杂,目的简化更复杂的数据表达,过滤掉数据中噪声提取出关键的特征,所以卷积运算也被称为过滤,在计算机视觉中也应用广泛。


卷积操作示意图

$$
\left[
\begin{matrix}
0 & 0 & 0 \
0 & 1 & 1 \
0 & 1 & 2
\end{matrix}
\right]

\cdot

\left[
\begin{matrix}
4 & 0 & 0 \
0 & 0 & 0 \
0 & & -4
\end{matrix}
\right]
= -8 $$

具体计算过程在图右上角可见。

卷积神经网络基础

CNN架构图

卷积神经网络的架构

我们在开始之前先简了解一下卷积神经网络基本结构,他是由那些层组成的。然后在对其分解来讲。

  • 卷积层(卷积核和权重共享)
  • 池化层
    这两卷积层和池化层可以反复多次,具体重复次数根据实际情况决定。然后就是对模型进行 flatten 处理也就是把多维数组压缩为一维数组作为下一层输入 ,最后还需要进行全连接就可以得到结果,这里全连接层与之前的神经网的全连接层没有任何区别。
  • 全连接层

卷积层(CNN)

卷积核

在卷积神经网络中通常会有多个卷积核(过滤器),每一个卷积核负责搜索特征值pattern)中参数也是通过学习得到了。接下来我们通过一个卷积核是如何是如何在图片中获取某个特征为例来解释说明卷积核的机制。

卷积核过程

这里卷积核是 3 x 3 矩阵,然后在图片矩阵的左上角开始进行移动,每一次移动后会和图片像素矩阵做内积,内积就是两个矩阵对应位置做乘法后去和做矩阵内积得到 3

1 * 1 + -1 * 0 + -1 * 0 \cdots -1 * 0 + 1 *1 = 3

卷积核

然后卷积核会向右侧移动,stride 表示每一次移动长度,这个长度是根据实际情况而定,卷积核会从图左上角向图右下角移动,知道走完图所有位置。


根据 stride = 1 长度我们卷积核在图上进行游走,最后得到 4 x 4 的矩阵,这样好处就是现在隐藏层神经元不必和全部的输入相连接。


我们发现原来 6 x 6 矩阵经过卷积核就变成了 4 x 4 矩阵,然后我们看这里卷积核工作就是找一条斜线出现(如图),图中卷积后矩阵为 3 表示出现了我们要找的特征。可以所搜到两处符合特征(pattern)


完成第一个卷积核(Filter)我们可以开始第二个卷积核,方法和定义卷积核相同。从图中看最大值 3 分别出现在左上角和左下角,我们这里用一个 Filter(卷积核)就将这个 pattern 检测出来。所以也就是说我们不需要不同 filter 就可以将其检查出来。

接下来我们用另一个卷积核做同样事情。

多个卷积核

通过多个卷积核后我们会形成 Feature Map 每一个卷积核对应一个特征。

对于多通道的图片,那么我们使用卷积核也应该为一个多维矩阵组合来对应通道数

多通道
对于多通道分别进行特征处理,对于 3 通道的图片响应卷积核可以是 3 通道的,那么我们想象以问题就是一个卷积核 3 * 3 的具有 192 特征的神经网层会有多少参数,计算下 (33)3 * 192 这就是一共参数数量。 多通道

其实通过卷积层我们就得到比较小但是有深度(深度是由卷积核数量)决定的。

局部感知野

第一层卷积核比较好理解
第二层中卷积核输入是第一层做完一次卷积核池化后范围,那么我们怎么分析卷积核在第二层的做了什么

a^k = \sum_{i=1}^11 \sum_{j=1}^11 a_ij^k
x^* arg \max_x a^k

x^* = arg \max_x(y^i - \sum_{i,j}|x_{i,j}|)

共享参数

因为我们卷积核矩阵可以看做之前全连接中权重,所以我们不难发现这样出现了参数共享,这是因为我们一次计算内积都是使用相同的参数。这样从而减少参数。

多卷积核

我们需要对一张图片提取多个特征,不同卷积核用于提取不同特征,

池化

训练

池化层反向传播

我们之前已经学习到池化层有两种类型分别是平均池化最大池化

  • 平均池化层的残差传播
    输入是一个 4 x 4 矩阵池化后就是 2 x 2 矩阵,然后我们反向时候保持总和不变将每一值均摊就会
    \left[ \begin{matrix} 1 & 2 \\ 6 & 3 \end{matrix} \right]

    \left[ \begin{matrix} 0.25 & 0.25 & 1 & 1 \\ 0.25 & 0.25 & 1 & 1 \\ 1.5 & 1.5 & 0.75 & 0.75 \\ 1.5 & 1.5 & 0.75 & 0.75 \end{matrix} \right]

  • 最大池化层的残差传播
    \left[ \begin{matrix} 1 & 2 \\ 6 & 3 \end{matrix} \right]

    \left[ \begin{matrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 2 & 0 \\ 0 & 0 & 0 & 3 \\ 0 & 6 & 0 & 0 \end{matrix} \right]

卷积层反向传播

  • 卷积前的矩阵
    \left[ \begin{matrix} x_{00} & x_{01} & x_{02} \\ x_{11} & x_{11} & x_{12} \\ x_{22} & x_{21} & x_{22} \end{matrix} \right]

  • 卷积核矩阵
    \left[ \begin{matrix} k_{00} & k_{01} \\ k_{12} & k_{11} \end{matrix} \right]

  • 卷积之后矩阵
    \left[ \begin{matrix} y_{00} & y_{01} \\ y_{12} & y_{11} \end{matrix} \right]
    python neural_style.py --content examples/cat.jpg --styles examples/2-style1.jpg --output y-output.jpg

  • 卷积后的残差矩阵
    \left[ \begin{matrix} \delta^{l+1}_{00} & \delta^{l+1}_{01} \\ \delta^{l+1}_{12} & \delta^{l+1}_{11} \end{matrix} \right]

相关文章

网友评论

    本文标题:再战机器学习—卷积神经网络

    本文链接:https://www.haomeiwen.com/subject/nijrpctx.html