在使用卷积神经网络时,它是一个黑盒。我们完全不用关心里面发生了什么。
但是,作为开发人员,我们必须把盒子打开,看看里面到底有什么!
就像剥洋葱一样,我们需要一层层地剥离。
打开黑盒最外边包装,我们看到,它由两部分组成:
卷积层:负责特征提取
全连接层:负责分类
当然,有些网络已经没有全连接层,是全卷积网络。为了方便说明和理解,这里,我们仍旧以包含全连接为例。
从盒子外边再看看,最后的输出通常是一个小数值,可以简单理解为所属分类的概率。
这些概率值的和是1,概率值越大意味着对应类的可能性越大。
例如,猫的值是0.98,狗的值是0.02。意味着当前的分类极大可能是猫。
我们用一个通俗的例子看一下。
有一个小瓶子,里面可能是(水、氢气、氧气)。那么各部分的功能如下:
卷积层:负责提取特征。简单理解,就是将物质里面的元素提取出来。例如,这里从物体里面提取出来氢元素(H)和氧元素(O)。
全连接层:负责分类。将瓶子中H和O的可能拼接出来。可能是(H2O,O2、H2),不同的值,权重是不一样的。例如,2个H和一个O,构成H2O;两个O,构成O2;两个氢构成H2。
从上述可以看到,不同的权重,意味着有不同的结果。
卷积网络的核心是学到不同物质的不同权重值。
我们进一步明确,神经网络包含两个组成部分(卷积层,全连接层),分别负责(特征提取,分类)。
例如,很多网络在卷积层会得到4096个特征,交给全连接层去分类,最终得到比如5个分类。
另外我们目前可以了解到的是,多个卷积层,分别提取不同的特征:
前面的卷积层:提取的特征比较初级,比如边、角、线等;
中间的卷积层:提取的特征时初级特征的组合,比如形状等;
后面的卷积层:提取的特征是各种形状组合所得到的高级特征,如语义信息等。此时的特征通常具有一定的语义特征,比如人脸、车轮、房屋结构等等;
后面我们会进一步介绍各个层提取特征的差异性。
下面我们关心另外一个问题:为什么卷积能够提取得到特征?
我们想象一下,使用卷积核(convolution kernel,可以理解为要找的特征:眼睛)在一幅图像(image)上不断地滑过。
如果找到了卷积核,就将其标记为100,
如果没有找到卷积核,就将其标注为0。
其过程如下:
图片来源:https://towardsdatascience.com/light-on-math-machine-learning-intuitive-guide-to-convolution-neural-networks-e3f054dd5daa
输出图像中,
数值100对应着高响应;
数值0对应着低响应;
从输出图像中,可以看到白色区域代表着找到的两只眼睛。
接下来,我们看看数值卷积操作是怎么回事。卷积操作是卷积核在输入上滑过,然后将对应位置上的像素进行乘法运算并求和,从而得到输出。
需要注意:输入和输出大小可能不一致。
如下图所示:在使用(-1,1)作为卷积核,在左黑右白的图像上做卷积时,会得到一个黑白交界的特征竖线。
下面,我们看看几个可视化的例子:
1、手写数字的可视化
Keras.js - Run Keras models in the browser
这个看起来很抽象,大家可以访问上面的链接观察具体过程。
其中的数字,是手写完成。
编辑切换为居中
添加图片注释,不超过 140 字(可选)
2、手写数字过程立体观察
拖动鼠标,可以进行不同角度、更细粒度的观察。
3D Visualization of a Convolutional Neural Network
3、CNN解释器
这个功能很强大,单击关键点,能够观察更细粒度的可视化效果。