下面两个链接是CNN可视化项目的网站和github。
CNN可视化网站
偶然发现了这个CNN可视化的项目,里面对CNN中卷积,池化,扁平,全连接,RELU,Softmax进行了非常详细的动态交互式可视化,之前对这些生疏名词的认识都是停留在知道它在干什么的层面,看到这个网站后让我对CNN的整个过程中的底层数学运算以及这个黑盒子里面到底是怎么样的有了更清晰的理解。
下面是个人体验完网页后对其中一些数学运算的理解
对于要卷积的一张图像(64 * 64),首先分成RGB三个通道,每个通道都是由64*64个像素组成的正方形图片(像素值在0-255之间)
三张单通道图片分别与其各自的3*3的卷积核(又叫做卷积滤波器)进行卷积运算
由于卷积核为3 * 3,所以卷积后的图片大小由64 * 64变成62 * 62
卷积得到A,B,C三张图片,这时候需要进行合并,直觉上理解称之为特征提取,比如下面这张大图片右边提取了9个特征。可以理解为:当前的操作得到了9张新的图片,每张图片都代表了原图的某个特征(可能是房顶,可能是天空,可能是颜色,可能是灯塔…)
对于这九张图的每一张图片,都是由卷积后的A,B,C经过一波计算而得:
这里的扁平化操作可以理解为把一张图片的每一个像素都当作一个神经元,然后所有的像素组成的神经元作为接下来的全连接层的输入。
其中对softmax的计算也非常形象。对于softmax中每一个分类器的值(概率),都是由上面扁平化操作得到的神经元经过全连接层后得到的值,再通过softmax函数所得,下面是个人对Softmax函数数学运算的理解:
下图中的图片,其中一个分类器(比如是杯子)由全连接层得到的值是8.64,这时候通过softmax算出来概率为0.8798,发现在所有的分类器中评分最高,所以最后判定这张图片是杯子。
网上对于这两者的关系也有很多的解释,这里分享一下我自己的一些理解方法。
我理解为Kernel size就像是一场特殊的跑步接力赛(比赛前只需要接力棒碰到起点即可,且身体的宽度占一格(后面的例子会用到))。
如果我们想要手长的跟手短的跑得一样多(Input等于Output),就需要让手长的跑步距离更大(Padding)
比如下图中的例子,我们假定这场比赛是从左边跑到右边。
手短的比赛路程就是左边的原矩形(7 * 7),它的起点在左上角第一格。
手长的是(3 * 3)的红色正方形,它在比赛前就比手短的少走一格(红色正方形的中心点在第二格)
所以手长的开始比手短的少走一格,到终点前又比手短的少走一格。
因此需要给手长的左右两边各扩展一格以达到公平(Padding=1表示上下左右各扩展一格)
同理,如果手长的开始的中心在第三格,则Padding=2;开始在第五格,则Padding=3。
综上所述,在Kernel Size为奇数的情况,如果开始在第i格(i为奇数),则Padding=(i-1)/2。
你可能会很疑惑,为什么上面我说的都是奇数。其实我开始也很疑惑,不过现在通过下面的例子就能理解了: