1.概述
这一周课堂讲授部分主要是卷积神经网络。
越往后学习越发感觉到python的重要性,不然代码完全看不懂...
本文参考了邱锡鹏老师的《神经网络与深度学习》,app store上同名软件的演示以及《动手学深度学习》。
2.卷积与池化
这里就不纠结于卷积运算和互相关运算的区别了,只有卷积核是否翻转这一点。不过我个人认为这对于彻底弄懂卷积来说意义不大。其实可以简单的把卷积理解成一种函数运算,这样池化也会很好理解。
一维卷积动画演示
二维卷积动画演示
这两个动画展示了卷积的步长(stride),填充(padding)等操作。卷积核就是函数f,这样理解的话,池化也是一个函数,最大池化就是max函数,平均池化就是mean函数。
多通道的话和这个完全一致,就是同样的函数运算有几个通道就做几遍(用不同的卷积核)。
通道的理解对于后续内容理解我觉得比较重要,这里就再多说一点。我们都知道卷积的作用是提取目标(图像)的特征,这些特征直白来讲就是这个图像的纹理,边缘,颜色之类的,是组成一张图像最基础的内容,这些基础特征在更高的层可以达到检测物体类别的功能。
早期的机器学习其实本质上这种特征提取都是靠我个人认为的可以成为“巧思”的技巧来人为选择的,但在深度学习中,这种特征提取出来的内容人是无法直接理解的,但是特征的组合最后却可以达成和人一样的功能。
我个人的理解来看这是两种相互的过程。早期的机器学习尝试从分类目标向回寻找特征(逐级表征),卷积神经网络则是反过来从最基础特征一步步向上得到分类目标。目前还没有一个很合理的数学解释,不过我个人觉得也许未来脑科学的进步能解释这一原理。
说回通道,每个通道可以理解成一种被提取出来的特征,不同通道数的变化就是特征的进一步融合或分解。
而神经网络最玄学的部分就是这里,根据经验或者实验得出的不在少数。常用的一些神经网络也主要是取2的若干次方,所以经常能看到16,32,64,256,512,1024,2048,4096这些通道数或者全连接层数。(或者是通过与他们的乘除计算出来的)
通道数越多理论上提取特征的能力越强,但也不是没有上限的,与数据集和实验用的设施有关。有一些相关的研究,这里我没有花时间去整理,感兴趣的可以自己检索。
3.卷积神经网络
全连接神经网络的问题——参数太多,局部不变性
而卷积神经网络最大的优点就是局部连接和权重共享
还有一个比较重要的概念就是感受野。感受野的定义是,对于某层输出特征图上的某个点,在卷积神经网络的原始输入数据上能影响到这个点的取值的区域。
常用的卷积神经网络整体结构是由N个卷积块,全连接层和softmax组成的。卷积块是在卷积层后面接一个激活函数(ReLU等),最后接池化层。
4.LeNet-5
作为最经典的卷积神经网络,LeNet-5已经和现在的神经网络结构很接近了。目前通常是卷积,激活(ReLU),池化,而LeNet-5中则是卷积,池化,激活(sigmoid)。
输入:32*32是最开始的mnist手写数字数据集,而《动手学深度学习》为了配合fashion-mnist数据集改成了28*28
C1层:5*5卷积核,sigmoid激活函数,6通道,得到32-5+1=28的输出
S2层:2*2池化,stride=2,所以得到28/2=14的输出(6通道)
C3层:5*5卷积核,sigmoid激活函数,16通道,得到14-5+1=10的输出
不过这层有一点特殊,16个通道并不是每个通道都用全部6个通道运算,而是由下面这个对照表实现的。
0-5对应的输入为3个相邻的特征图;
6-11对应的输入为4个相邻的特征图;
12-14对应的输入为4个间隔的特征图;
15是唯一一个用到全部6张特征图的通道。
S4层:同S2层,2*2池化,stride=2,所以得到10/2=5的输出(16通道)
C5层/F5层:5*5卷积核,120通道,所以得到5-5+1=1的输出(120通道)
所以既可以说是卷积层也可以说是全连接层
F6层:全连接,输出84=7*12
至于为什么是这个数字呢?因为LeNet-5最开始希望能识别ASCII的字符打印大小(注意是每个字符的大小!)
输出:全连接,RBF函数(现在用softmax),10对应10个数字
5.AlexNet
其实与LeNet的设计思路非常接近,但是要网络要深得多;原论文考虑到GPU算力问题,分别存到了两个GPU里,这里仅用一个来简化问题。
先简述一下下一层的Feature Map,计算方法就是
output=(input-kernel_size+2*padding)/stride+1
输入:原图大小为224*224(*3因为是彩色图片,后续均省略),但实际上进行了裁剪变成227*227
C1层:11*11卷积核,stride=4,ReLU激活函数(下同),96通道,结果就是(227-11)/4+1=55
S1层:3*3池化,stride=2,结果就是(55-3)/2+1=27,通道数不变
C2层:5*5卷积核,padding=2,256通道,结果就是27-5+1+2*2=27
S2层:3*3池化,stride=2,结果就是(27-3)/2+1=13
C3层:3*3卷积核,padding=1,384通道,结果就是13-3+2*1+1=13
C4层:3*3卷积核,padding=1,384通道,同上
C5层:3*3卷积核,padding=1,256通道,同上
S5层:3*3池化,stride=2,结果就是(13-3)/2+1=6,通道数不变
F6层:全连接层4096
F7层:全连接层4096
输出:1000类,符合ImageNet数据集的分类总数
AlexNet也催生了VGG块的产生,让网络结构设计稍微不那么玄学。VGG块简单来说就是卷积层,激活函数,池化层,和我们通用的模式一样。(最初论文明确指定了卷积核,padding,stride等参数)
6.GoogLeNet
这里就不再详细展开讲解GoogLeNet的结构了,其实读完详细看完上两个网络应该就能了解卷积神经网络的基本结构了,之后的结构也都是与作者本身习惯或者数据集相关性很高,所以就只讲创新的地方。
GoogLeNet创造了一个叫Inception block的基本卷积块,如下图所示。
可以看出4个通道并行连接,分别是
1*1卷积层
1*1卷积层,3*3卷积层,padding=1
1*1卷积层,5*5卷积层,padding=2
3*3池化,padding=1,1*1卷积层
最终在通道合并层合并。
通过不同尺寸的滤波器有效识别不同范围的图像信息,并且这些滤波器可以各自分配不同的参数。所以GoogLeNet网络会更有效。
7.ResNet残差网络
一种常见的残差网络如下图所示
如果是和我一样从控制转过来的同学,应该对这种结构格外亲切,这不就是前馈控制嘛...┓( ´∀` )┏
对于残差网络可以这样理解,输入x,目标函数h(x),非线性单元f(x)
h(x)=x+f(x)
因为有这个1的存在不容易出现梯度消失的问题。
核心思想:每个附加层都应该更容易地包含原始函数作为其元素之一。