卷积神经网络通俗理解( 六 )


记住 , 我们要做的事情是把卷积核中的权重和输入图片中的像素值相乘 。
(译者注:图中最下方应是由于很多都是0所以把0略过不写了 。)
基本上 , 如果输入图像中有与卷积核代表的形状很相似的图形 , 那么所有乘积的和会很大 。现在我们来看看 , 如果我们移动了卷积核呢?
可以看到 , 得到的值小多了!这是因为感知域中没有与卷积核表示的相一致的形状 。还记得吗 , 卷积层的输出是一张激活图 。所以 , 在单卷积核卷积的简单情况下 , 假设卷积核是一个曲线识别器 , 那么所得的激活图会显示出哪些地方最有可能有曲线 。在这个例子中 , 我们所得激活图的左上角的值为6600 。这样大的数字表明很有可能这片区域中有一些曲线 , 从而导致了卷积核的激活 (译者注:也就是产生了很大的数值 。) 而激活图中右上角的数值是0 , 因为那里没有曲线来让卷积核激活(简单来说就是输入图像的那片区域没有曲线) 。
但请记住 , 这只是一个卷积核的情况 , 只有一个找出向右弯曲的曲线的卷积核 。我们可以添加其他卷积核 , 比如识别向左弯曲的曲线的 。卷积核越多 , 激活图的深度就越深 , 我们得到的关于输入图像的信息就越多 。
在传统的CNN结构中 , 还会有其他层穿插在卷积层之间 。我强烈建议有兴趣的人去阅览并理解他们 。但总的来说 , 他们提供了非线性化 , 保留了数据的维度 , 有助于提升网络的稳定度并且抑制过拟合 。一个经典的CNN结构是这样的:
网络的最后一层很重要 , 我们稍后会讲到它 。
现在 , 然我们回头看看我们已经学到了什么 。
我们讲到了第一层卷积层的卷积核的目的是识别特征 , 他们识别像曲线和边这样的低层次特征 。但可以想象 , 如果想预测一个图片的类别 , 必须让网络有能力识别高层次的特征 , 例如手、爪子或者耳朵 。让我们想想网络第一层的输出是什么 。假设我们有5个5 × 5 × 3的卷积核 , 输入图像是32 × 32 × 3的 , 那么我们会得到一个28 × 28 × 5的数组 。来到第二层卷积层 , 第一层的输出便成了第二层的输入 。这有些难以可视化 。第一层的输入是原始图片 , 可第二层的输入只是第一层产生的激活图 , 激活图的每一层都表示了低层次特征的出现位置 。如果用一些卷积核处理它 , 得到的会是表示高层次特征出现的激活图 。这些特征的类型可能是半圆(曲线和边的组合)或者矩形(四条边的组合) 。随着卷积层的增多 , 到最后 , 你可能会得到可以识别手写字迹、粉色物体等等的卷积核 。
如果 , 你想知道更多关于可视化卷积核的信息 , 可以看这篇 研究报告  , 以及这个 视频。
还有一件事情很有趣 , 当网络越来越深 , 卷积核会有越来越大的相对于输入图像的感知域 。这意味着他们有能力考虑来自输入图像的更大范围的信息(或者说 , 他们对一片更大的像素区域负责) 。
到目前为止 , 我们已经识别出了那些高层次的特征吧 。网络最后的画龙点睛之笔是全连层 。
简单地说 , 这一层接受输入(来自卷积层 , 池化层或者激活函数都可以) , 并输出一个N维向量 , 其中 , N是所有有可能的类别的总数 。例如 , 如果你想写一个识别数字的程序 , 那么N就是10 , 因为总共有10个数字 。N维向量中的每一个数字都代表了属于某个类别的概率 。打个比方 , 如果你得到了[0 0.1 0.1 0.75 0 0 0 0 0 0.05] , 这代表着这张图片是1的概率是10% , 是2的概率是10% , 是3的概率是75% , 是9的概率5%(小贴士:你还有其他表示输出的方法 , 但现在我只拿softmax (译者注:一种常用于分类问题的激活函数) 来展示) 。全连层的工作方式是根据上一层的输出(也就是之前提到的可以用来表示特征的激活图)来决定这张图片有可能属于哪个类别 。例如 , 如果程序需要预测哪些图片是狗 , 那么全连层在接收到一个包含类似于一个爪子和四条腿的激活图时输出一个很大的值 。同样的 , 如果要预测鸟 , 那么全连层会对含有翅膀和喙的激活图更感兴趣 。