cs231n (九)卷积神经网络
标签(空格分隔): 神经网络
文章目录
0.回顾
cs231n (一)图像分类识别讲了KNN
cs231n (二)讲了线性分类器:SVM和SoftMax
cs231n (三)优化问题及方法
cs231n (四)反向传播
cs231n (五)神经网络 part 1:构建架构
cs231n (六)神经网络 part 2:传入数据和损失
cs231n (七)神经网络 part 3 : 学习和评估
cs231n (八)神经网络总结:最小网络案例研究
1. 引言
经过一系列的学习终于抵达了传说中的卷积神经网络,他和一般的网络很类似,前面学过的东西这里全都能用上,那么有什么不同呢?
ConvNet结构假设输入是图像,这就允许我们将某些属性编码到体系结构中,来吧,一般究竟哈?~~~emmmm
2. 总体概述
总体结构就是:输入向量————>隐含层非线性变换————>输出
对于前面讲过的,CIFAR-10数据是32x32x3=3072(权重数), 如果图像很大呢,比如一般图像的尺寸都达到了1000x1000x3 = 3000000(权重),这时候:
计算机说:我不干了,累死我算了
卷积网络中的神经元是三维排列的,卷积只与前一层的部分连接,那么对于DIFAR数据最后一层应该是1x1x10。
左边:三层神经网络 右边:卷积神经网络
卷积神经网络由层组成, 每层都有相应的API,用一些可导函数把输入的3D数据转换为输出的3D数据。
3. 构建卷积网络的每个层
主要由三层组成:卷积——————池化——————全连接层!
比如CIFAR数据的话:
输入层-————卷积层-————ReLU层(尺寸不变-———池化层-———全连接层
32x32x3————32x32x12——————32x32x12————————16x16x12————————1x1x10
- 输入数据变为——————输出数据
- CNN由很多层一般包含上述几种层
- 每层输入是3D数据,然后使用可导函数把它变为3D输出数据
- 有的层含参数,有的没有(卷积层和全连接层有,ReLU层和池化层没)
上图中的结构是一个小型VGG网络
1. 卷积层
这层是核心层,主要是由一些滤波器构成,现在使用一套滤波器(比如12个), 每层都会产生一个图数据,然后叠加就是此层的输出。
**例如:**输入数据体尺寸[32x32x3](比如CIFAR-10的RGB图像),卷积核大小是5x5,那么卷积层中的每个神经元会有输入数据体中[5x5x3]区域的权重,共5x5x3=75个权重(还要加一个偏差参数)。注意这个连接在深度维度上的大小必须为3,和输入数据体的深度相同。
左边:输入数据,蓝色是5个卷积核叠加形成的
右边:计算的还是权重和输入的内积。
卷积层的输出: 由深度(多深),步长(一次移动多远),零填充(图像周围加零)决定。
输入数据尺寸:W 卷积核大小:F
步长:S 零填充数量:P
输出的尺寸就是: (W-F+2P)/S + 1
P取多少为好? 输入与输出相同尺寸时候满足:P=(F-1)/2
参数共享:将深度维度上一个单独的2维通道(就是一层)看做深度切片(depth slice)
比如:一个数据体尺寸为[55x55x96]的就有96个深度切片,每个尺寸为[55x55],每个深度切片上的神经元都使用同样的权重和偏差,
这样卷积层输出就有96个权重不同权重集,权重集合称为滤波器(filter),这96个滤波器的尺寸都是[11x11x3],每个都被55x55个神经元共享?
Krizhevsky等学习到的滤波器例子
具体Numpy例子
- 位于(x,y)的深度列将会是X[x,y,:]
- 位于深度d的切片应该是X[:,:,d]
假设输入数据X的尺寸X.shape:(11,11,4),不使用零填充,滤波器的尺寸:F=5,步长S=2,
输出尺寸就是(11-5)/2+1=4
- V[0,0,0] = np.sum(X[:5,:5,:] * W0) + b0
- V[1,0,0] = np.sum(X[2:7,:5,:] * W0) + b0
- V[2,0,0] = np.sum(X[4:9,:5,:] * W0) + b0
- V[3,0,0] = np.sum(X[6:11,:5,:] * W0) + b0
小结: 总结一下卷积层的性质:
输入数据体的尺寸为$ W_1\times H_1\times D_1$
4个超参数:
- 滤波器的数量K
- 滤波器的空间尺寸F
- 步长S
- 零填充数量P
输出数据体的尺寸为$W_2\times H_2\times D_2 W_2=(W_1-F+2P)/S+1$
(宽度和高度的计算方法相同)
-
由于参数共享,每个滤波器包含 个权重,卷积层一共有 个权重和 个偏置。
-
在输出数据体中,第d个深度切片(空间尺寸是 ),用第d个滤波器和输入数据进行有效卷积运算的结果(使用步长S),最后在加上第d个偏差。
对这些超参数,常见的设置: F=3,S=1,P=1
动态演示
输入:
卷积层参数:
输出: 是(5-3+2)/2+1=3
有2个滤波器,滤波器的尺寸是 ,它们的步长是2.
1x1卷积,有意义: 因为如果我们处理的三维卷积,那么比点积更有效。
扩张卷积让滤波器中元素之间有间隙,在某维度上滤波器w的尺寸是3,
那么计算输入x的方式是:
,此时扩张为0.
那么计算为, 如果扩张为1:
2. pooling池化层
一般会在连续的卷积层之间会周期性地插入一个池化层,可以降低数据体的维度,减少参数数量,能有效控制过拟合。
输入数据体尺寸
输出数据体尺寸
,其中
在池化层中很少用零填充
常用参数:F = 3,S = 2; F = 2, S = 2.
有平均池化,有最大池化, L2池化等。
其实池化层的未来趋势就是很少使用。
3. 归一化层
4. 全连接层
神经元对前一层连接和前面学过的一般神经网络网络连接是一样的。
5. 全连接层转化为卷积层
- 卷积层和全连接层是可以相互转化的
如何转转化?
一般hi全连接层转化为卷积层更有用
输入:224x224x3
经过一系列变换
某层数据体:7x7x512
AlexNet中就是,使用5个池化层,每次尺寸下降一半,最终尺寸为224/2/2/2/2/2=7
AlexNet使用两个尺寸为4096的全连接层,最后有1000个神经元的全连接层计算分数。
这3个全连接层中的一个转化为卷积层的话:
- 对第一个连接区域 7x7x512 滤波器F=7,输出就是1x1x4096
- 对于第二层,滤波器F=1, 输出就是:1x1x4098
- 最后一个全连接层,F=1,输出就是:1x1x1000
4. 如何构建卷积神经网络的结构
那么如何组合这些,卷积层、池化层、全连接层、ReLU也算一层。
1. 层的排列方式
常见结构:**INPUT —> [[CONV -> RELU]*N -> POOL?]M -> [FC -> RELU]K —> FC
其中*N代表重复了N次
,N<=3 且M>=0,K>=0,通常K<3,下面列出了常见的网络结构:
- INPUT -> FC,实现一个线性分类器,此处N = M = K = 0
- INPUT -> CONV -> RELU -> FC
- INPUT -> [CONV -> RELU -> POOL]*2 -> FC -> RELU -> FC
- INPUT -> [CONV -> RELU -> CONV -> RELU -> POOL]*3 -> [FC -> RELU]*2 -> FC
- 上面的网络结构:在执行具有破坏性的池化前,多重的卷积可从输入中学到更多复杂特征
多个小滤波器卷积组合好于一个大滤波器
有点:输出更多的特征,且使用的特征少。
缺点:在进行反向传播时,中间的卷积层可能会导致占用更多的内存。
2. 层的大小设置规律
**输入层:**应该是可以被2整除很多次的,