这节课中介绍了卷积网络的基本组成部分(全连接层,激活函数,卷积层,池化层,标准化等),下节课讨论了卷积神经网络的发展历史以及几种经典结构是如何构建的
前言
在之前提到的全连接神经网络中,我们直接把一个比如说32 * 32 * 3的图像展开成一个3072*1的向量,然后使用向量与权重矩阵点积得到结果,这实际上是不太合理的,从某种意义上说,我们破坏了原本图像的空间信息,把它简单的看成一个一维向量,而在卷积神经网络中,我们引入了卷积层,能够帮助我们在保存原本图像的空间信息的情况下,对图像特征进行提取
卷积层
如上图所示我们引入了一个卷积核或者说filter,与原始图像进行卷积运算,就是我们把卷积核在原始图像上从起始位置开始滑动,依次对每个5 * 5的区域与filter点积,再加上偏置项,其实就是进行W\^{T}x + b的运算,这样一个区域得到一个输出,最终一行我们可以得到32 - 5 + 1 = 28个输出结果,也就意味着最终我们可以得到一张1 \\times 28 \\times 28的激活图
更进一步地,我们可以使用不同的filter,来获得不同的激活图,组成我们的卷积层:
更一般地形式:
我们可以看到C_{out}代表着一个卷积层中filter的数目,同样也与输出层的维度保持一致,而C_{in}一般都是与上一层的输入保持一致
我们可以将不同的卷积层进行叠加,记得注意要在卷积层之后还要加入一个relu层,否则两个卷积层的连接和一个卷积层毫无区别:
我们可以采用和之前一样的可视化方法,看看卷积层实际上做了什么:
我们可以看出卷积层提供的图像模板,和我们之前用线性分类器或者全连接网络得到的很不一样,这里的模板大多是一些边缘或者颜色信息,从另一个角度说,卷积层其实起到了提取图像特征的作用,我们可以把这些模板都看作图像的某种特征
在之前我们也提到过,输入层图像在经过卷积层之后,它的大小会缩减,实际上也损失了某种图像信息,我们不想这样,于是引入了padding,在原本的图像周围加上0,保证图像的维度不变:
现在我们来看另一个问题:
在经过不同卷积层之后,对于输出层来说,想要去学习全局的图像,看到全局的图像非常困难,所以我们需要下采样来缩小图像,便于特征的提取,这样我们引入了步长stride的概念,就是我们的卷积核在图像上滑动时,是一次滑动stride步长:
然后我们来看看关于卷积层的其它信息,比如说可学习的参数:
显然每个filter矩阵的每个参数都是可学习的,同时也不要忘了偏置项
比如说运算次数:
总共有10240个输出,每个输出都是通过点积(75次运算)得到
最后总结一些常见参数设置:
池化层
池化层也是一种下采样的方法,可以实现图像缩小与特征降维,常用的有平均池化与最大池化:
max pooling就是取对应kernel size区域里面的最大值,同样这里也可以设置步长值
常用的设置如下,我们可以发现池化层是只有超参数设置的,没有任何可学习的参数
下图是一个卷积神经网络的架构,我们可以看到使用卷积层与池化层,可以实现空间的降维但是通道数提升,我认为这意味着我们得到了更多更简单但是更有用的图像特征:
normalization
batch normalization是在2015年发现的一种可以极大地提升训练神经网络速度的方法,可以使其快速收敛,但是小哥哥老师在课上指出,他觉得原论文的数学原理的阐述并不是很有道理😪
batch normalization主要思想就是将输入标准化,不同神经网络有不同形式,训练与测试集上方式也不同(这里主要是因为训练集我们可以求数据的均值方差,但是我们显然无法在测试集上这样做
训练集:
测试集:
卷积神经网络:
而batch normalization常常在全连接层与卷积层之后,下图我们可以看到这种方法有着诸多好处:
事实上还有其它不同的normalization方法:
batch normalization是在c这个面上即不同样本的同一个通道的特征做归一化,layer是在n对应的面即同一个样本的不同通道做归一化,instance对应的是每个样本每个通道的归一化
下面这张图来自知乎:https://zhuanlan.zhihu.com/p/56542480
这是专栏文章的一篇讲的比较好,关于batch normalization同专栏的另一篇文章:https://zhuanlan.zhihu.com/p/54171297