碎片1:CNN动态可视化交互式网页

介绍

下面两个链接是CNN可视化项目的网站和github。
CNN可视化网站

CNN可视化项目github

偶然发现了这个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经过一波计算而得:

    • A,B,C都需要乘上一个权重然后加上一个偏置项得到新的图片
    • 其中W1,W2,W3相加为1
    • W1,W2,W3,bias(b)都随着神经网络训练的时候不断更新迭代
    • 至于为什么要加偏置项(bias)看下面这个例子。对于一个二维分类问题,如果不加bias,意味着分类器(一条直线)一定是过原点的,但是实际上最优解未必过原点,如下图:
      在这里插入图片描述

对于扁平化和Softmax的理解

  • 这里的扁平化操作可以理解为把一张图片的每一个像素都当作一个神经元,然后所有的像素组成的神经元作为接下来的全连接层的输入。

  • 其中对softmax的计算也非常形象。对于softmax中每一个分类器的值(概率),都是由上面扁平化操作得到的神经元经过全连接层后得到的值,再通过softmax函数所得,下面是个人对Softmax函数数学运算的理解:在这里插入图片描述

  • 下图中的图片,其中一个分类器(比如是杯子)由全连接层得到的值是8.64,这时候通过softmax算出来概率为0.8798,发现在所有的分类器中评分最高,所以最后判定这张图片是杯子。
    在这里插入图片描述

对Padding(边缘扩容)和Kernel Size(卷积核大小)的关系的理解:

网上对于这两者的关系也有很多的解释,这里分享一下我自己的一些理解方法。

  • 我理解为Kernel size就像是一场特殊的跑步接力赛(比赛前只需要接力棒碰到起点即可,且身体的宽度占一格(后面的例子会用到))。

    • 手长的人在比赛前就占了优势,因为它跑的距离比别人要短。
    • 如果跑步过程中手长的和手短的跑得一样快,还是手长的占优势,因为接近终点更大的距离就能完成接力。
  • 如果我们想要手长的跟手短的跑得一样多(Input等于Output),就需要让手长的跑步距离更大(Padding
    在这里插入图片描述

  • 比如下图中的例子,我们假定这场比赛是从左边跑到右边。

  • 手短的比赛路程就是左边的原矩形(7 * 7),它的起点在左上角第一格

  • 手长的是(3 * 3)的红色正方形,它在比赛前就比手短的少走一格(红色正方形的中心点在第二格

  • 所以手长的开始比手短的少走一格,到终点前又比手短的少走一格

  • 因此需要给手长的左右两边各扩展一格以达到公平(Padding=1表示上下左右各扩展一格

  • 同理,如果手长的开始的中心在第三格,则Padding=2;开始在第五格,则Padding=3。

  • 综上所述,在Kernel Size为奇数的情况,如果开始在第i格(i为奇数),则Padding=(i-1)/2。
    在这里插入图片描述

  • 你可能会很疑惑,为什么上面我说的都是奇数。其实我开始也很疑惑,不过现在通过下面的例子就能理解了:

    • 首先回到上面的比赛规定,身体的宽度一定是占据了一格的,如果Kernel Size是偶数,那么开始的时候手长的比手短的就只领先了0.5格,又由于Padding规定一定是整数,所以这种情况下比赛就一定不公平:
      • 若扩展了一格(Padding=1),则手长的就需要在起点和终点都多走0.5格,总得来看就多走了1格Output=8 * 8),比手短的(Output=7 * 7)多一格。
    • 综上所述,当Kernel Size是偶数的情况,那么手长的在起点和终点比手短的又是都是带0.5的而不是整数的,这与Padding为整数相违背,所以这种情况下输出与输入的尺寸不可能相等。

在这里插入图片描述