参考cs231n与这位的博文https://www.zhihu.com/people/will-55-30/posts?page=1 非常感谢!
神经网络的输入是一个向量(把32x32x3->3027x1),然后在一系列隐层中进行变换(一个隐层指的是一个W矩阵,然后把W的每一行(代表一个分类)称作一个神经元),每个隐层都是由若干神经元组成,每个神经元都与前一层的所有神经元连接(因为W*x中每一行都是乘x整个向量的意思吧)。在每一个隐层中,神经元相互独立不进行连接(每行之间没什么关系嘛)。最后的全连接层称为输出层。在分类问题中输出值被看作不同类别的评分。
然而神经网络对于大尺寸图像来说很不幸,因为W中元素太多了,效率低下而且大量的参数也会导致网络过拟合。
接下来就看看卷积神经网络CNN。
卷积神经网络是由层组成的,每一层都有一个简单的API:用一些含或者不含参的可导函数,将输入的3D数据变换为3D输出数据
各种层按照顺序排列,网络中的每个层使用一个可导的函数将数据传递到下一个层
主要由三种类型的层:卷积层,Pooling层,全连接层
e.g.
一个用于CIFAR-10图像数据分类的卷积神经网络的结构可以是
输入层-卷积层-ReLU层-Pooling层-全连接层
输入层[32x32x3]
卷积层使用12个卷积核[32x32x12]
ReLu层对每个元素进行激活函数操作[32x32x12]
Pooling层在宽x高这个维度上进行降采样[16x16x12]
全连接层[1x1x10]得到是个分数
ReLU与Pooling是不含参的函数操作,而Conv和FC的参数是用梯度下降训练出来的
Conv,FC,Pooling有超参数,ReLU没有
*卷积层
卷积过后得到activation map
激活图给出了在每个空间位置处滤波器的反应
网络会让滤波器学习到当它看到某些类型的视觉特征时就激活。具体的视觉特征可能是某些方位上的边界,或者在第一层上某些颜色的斑点,甚至可以是网络更高层上的蜂巢状或车轮状团。
输出数据的每个元素可以被看作神经元的一个输出,并且该神经元只观察输入数据的一小部分。这个个局部区域的大小称为感受野receptive field。
卷积神经网络中,filter是应用于局部的,结果中的一个值仅与其一个领域相关。并且不进行拉伸还保持了spatial structure
卷积核的深度通常与原图像深度相同
当处理一个卷积层时,一般会用多种卷积核,因为每个卷积核都可以对应一种特殊的模板
在实践中3层的神经网络会比2层的表现好,然而继续加深很少有太大的帮助。然而对于CNN来说,深度是个极端重要的因素,卷积神经网络在提取特征,然后图像拥有层次化结构,比如脸由眼睛组成,眼睛由边缘组成,多层处理对于这种数据就有直观意义。
卷积神经网络中各层的神经元是一个个卷积核(比如那个5x5x3的一小个),这样想的话每层中的神经元只与前一层中的一小块区域连接起来,而不是全连接。
55 filter也可以称作55 receptive field
3个超参数控制输出数据体的尺寸:深度(卷积核的数目),步长,零填充
深度维度上的不同神经元将可能被不同方向的边界,或者颜色斑点激活。将沿深度方向排列,感受野相同的神经元合称为深度列depth column(or fibre)
在设置超参数时要注意要使卷积核在每个维度都可以对称的滑过
设图像尺寸为WW,感受野FF,步长S,零填充数量P
输出的尺寸X=(W-F+2P)/S+1得是整数
XXdepth这就是神经元的个数(注意这里考虑的是应用在每个区域的卷积核都是不一样的,每滑动一下就换一个卷积核)
不过这样的话就导致参数很多了(XXdepth(FF3+1))
所以变成
将深度维度上一个单独的2维切片看作深度切片(XX),然后这个切片上的神经元共享参数(这样就跟前面学的一样了,深度就是不同卷积核个数),其实用同一个核滑动这样才真正交卷积。
当期望在图像的位置学到不同的特征时,就不要共享参数,2维上不同位置也用不同的神经元。
一般归纳
输入数据W1H1D1
滤波器数量K
滤波器空间尺寸F
步长S
零填充数量P
输出数据W2H2D2
W2=(W1-F+2P)/S+1;
H2=(H1-F+2P)/S+1;
D2=K;
卷积层一共有FFD1*K个权重和K个偏置
有的时候会将卷积过程通过矩阵的一些拉伸转化为巨大的矩阵乘法
卷积的反向传播还是一个卷积。
(全连接层与卷积层在计算上是可以相互转换的。通过矩阵的一些拉伸。。)
1*1Convolution
stride>1降采样,相当于池化(Pooling),但比池化好用
这些的目的都是为了减少参数,特别是在最后一部fully connection里的参数
扩张卷积dilation
扩张为0->w0x0,w1x1,w2x2
扩张为1->w0x0,w1x2,w2x4 操作中存在1的间隙
扩张卷积与正常卷积结合起来非常有用,能在少数层数内更快地汇集输入图片的大尺度特征。比如上下重叠的2个33卷积,那么第二个卷积的感受野就是输入数据的55区域
Pooling层
用于逐渐降低数据体的空间尺寸(宽高)
减少网络中参数的数量,计算消耗减小,也能有效控制过拟合。
最常见的是使用22的MAX滤波器,在四个数字里选一个最大的,步长为2,这样就可以丢弃75%的数据。 深度保持不变
输入数据尺寸W1H1D1
空间大小F
步长S
输出数据尺寸W2H2*D2
W2=(W1-F)/S+1
H2=(H1-F)/S+1
D2=D1
常用的参数设置F=3,S=2 overlapping pooling
F=2,S=2更常用
general pooling
除了MAX 之外Pooling层还可以使用其它函数average pooling, L2-norm pooling
但实践证明Max效果比较好
反向传播:max函数的反向传播相当于将梯度只沿最大的数回传,因此在向前传播经过汇聚层时通常会把池中的最大元素的索引记录下来(switches),这样反向传播时的梯度路由就可以很高效。
Pooling渐渐得要被抛弃了,因为卷积层时使用较大的步长也可以降低数据体的尺寸。
层的规律排列
input->[[conv->relu]N(->Pool)]M->[FC->relu]K->FC
通常N<=3,K<3
N>1时适用于更大更深的网络,因为执行具有破坏性的Pooling前,多重的卷积层可以从输入数据中学习到更多的复杂特征。
几个小滤波器卷积层的组合比一个大滤波器卷积层要好:假设一层一层的重叠了3个33的卷积层(每层之间有relu),那么第一个卷积层对input的感受野有33,第二个有55,第三个有77。假设不使用3个卷积层,而是用一个77的卷积层,虽然最后神经元的感受野依然是77。
但是!有这样的缺点
1.多个卷积层与Relu的交替结构比单一卷积层的结构更能提取出深层的更好的特征。
2.参数的数目一个是3(C(33C))=27C^2,一个是C(77C)=49C^2
用小滤波器唯一的不足是进行反向传播时,中间的卷积层可能会导致占用更多的内存。
CNN中每层的超参数的设置
输入层应该能被2整出很多次,比如CIFAR-10中的32
卷积层一般F=3/5,如果要保持尺寸的话S=1,P=(F-1)/2。更大的滤波器尺寸比如77,通常只用在第一个面对原始图像的卷积层上。由于内存的限制,实践中人们倾向于在网络的第一个卷积层做出妥协。比如77 S=2(ZFnet) 11*11 S=4(AlexNet)
网友评论