一.层次结构
1.数据输入层 input layer
有三种常见的图像数据处理方式
(1)去均值:就是把所有数据相加然后求均值,再把每个数减去均值,再放入矩阵中实现去均值。
(2)归一化:输入进来的数值最好规定在一个范围内(比如0-1,-1-1)。
(3)PCA/白化:PCA降维,把高维的数据尽量把重要信息的部分保留下来;白化:幅度归一化
2.卷积计算层 conv layer
(1)局部关联。图片的每个像素点都与周围的像素有关系,所以就用卷积核(比如3*3)的来对图片上的所有数据进行遍历。每个卷积核相当于一个filter
(2)窗口(receptIve field)滑动,filter对局部数据计算。往右滑动,然后往下滑动,直到从左上角滑动到右下角算完成了依次遍历。
❤每当一个3*3的卷积核把整张图片遍历完,算完成了一次遍历。这只是第一个神经元所完成的工作,在整个工作过程中卷积核里面的9个数值让他固定不改变,也就是相当于这九个像素点连接的9个权重w在一个神经元工作的过程中是不改变的。(也就是当前的一个神经元有9个权重w,可是说是权值共享了),在第二个神经元开始还会做相同的事情,只是神经元的里面的权重改变了,是另外9个权重了。这样一来,每一个神经元都有自己关注的地方,比如说一个关注的是颜色,一个关注的是文理,一个关注的是纹理等等。然后把信息再进行汇总。(每个神经元只关注一个特性)
(3)深度 depth 下一层神经元的个数,比如说是5,意思是用5个神经元从5个维度分别来观测原始图像。
步长 stride 滑动步长
stride越大得到的特征图越小。
stride=1的时候虽然得到更多的特征但就是效率太低了。
填充值 zero-padding 在原始数据上为了保证滑窗能从头滑到尾在周边填充上若干0
pad = 1:在周围加上一圈0
pad=2:在周围加上两圈0
等等
❤❤**怎么样由输入推出输出:
输入=7x 7(h1xw1)
Filter=3 x 3
pad = 1
stride =1
Output = ?(h2 x w2)
h2 = (h1-f+2p)/s+1=(7-3+2)/1+1=7
w2=(w1-f+2p)/s+1=(7-3+2)/1+7=7**
(4)三通道(RGB)图像卷积过程
♣ 7x7x3 意思是图片大小为7x7;3的意思是深度,为rgb三通道图像也就是彩色图像,既然是三通道图像卷积核就要分别对每个通道进行卷积,最后把卷积后的三通道结果进行相加。原始图像的深度是几,那么我们的过滤器的深度也就要是几,来用第一个卷积核来计算filter w0:
第一通道:w0[:,:,0]: 0x0+0x0+0x-1 + 0x1+1x0+2x0 + 0x0+1x0+0x1 = 0
第二通道:w0[:,:,1]: 0x0+0x1+0x-1 + 0x-1+0x1+2x-1 + 0x0+2x-1+2x0 =-4
第三通道:w0[:,:,1]:0x0+0x1+0x-1 + 0x1+0x-1+1x0 + 0x0+2x0+0x-1 = 0
将三通道相加:0+(-4)+0+1=-3 (就成为特征图中绿框中的-3了) 1为偏置值biases
最后输出层:有几个过滤器(神经元)那么输出层的深度就是几。
3.RELU激励层 RELU layer
(1)需要知道用什么样的幅度往下传,所以对卷积层输出的结果做非线性映射。
(2)Sigmoid S型函数0-1之间 如果sigmoid做激活函数是有缺陷的:当数值很大或者很小的时候,斜率就趋向0了
Tanh() 双曲正切函数
RELU 修正线性单元 收敛快,求梯度简单,较脆弱 y=0和y=x两段
Leaky RELU y=x和y=ax(a为很小很小的数)
ELU 指数线性单元
Maxout 计算是线性的,不会饱和也不会挂
❤实际经验:
不要用sigmoid,首先试用RELU,因为快,但要小心点,如果RELU失败,就用Leaky RELU或者Maxout 某些情况下tanh倒是有不错的结果,但是少。
4.池化层 pooling layer
夹在连续的卷积层中间
没有权重的
功能:压缩数据和参数的量,减少过拟合 ,对数据做下采样
方式:max-pooling和average-pooling
5.全连接层 FC layer
两层之间所有的神经元都有权重连接
通常全连接层在卷积神经网络的尾部
6.一般CNN结构
INPUT
[[CONV -->RELU]*N-->POOL?]xM 有没有pool取决于数据量的大小
[FC-->RELU]xK
FC
7.优缺点
优点:
共享卷积核,对高维数据的处理无压力
无需手动选取特征,训练好权重,即得特征
分类效果好
缺点:
需要调参,需要大样本量,训练最好要用GPU
物理含义不明确
8.典型CNN
LeNet 这是最早用于数字是别的CNN
AlexNet 2012年ImageNet数据集上的比赛远超第二名的CNN,比LeNet更深,用多层小卷积层叠加替换大卷积层。
ZF Net 2013年ILSVRC比赛冠军
GoogLeNet 2014 ILSVRC比赛冠军
VGGNet 2014年ILSVRC比赛中的模型,图像识别略差与GoodNet ,但是在很多图像转化学习问题(比如object detection)上效果奇好。
ResNet 2015年 ILSVRC比赛的冠军,微软打造,层次极深(152层)
9.fine-tuning
什么是fine-tuning?
使用已用于其他目标,预训练好的模型的权重或者部分权重,作为初始值开始训练。
原因:
自己从头训练卷积神经网络容易出问题
fine-tuning能很快收敛到一个较理想的状态
做法:
复用相同层的权重,新定义层取随机权重初始值
调大新定义层的学习率,调用复用层的学习率
10.模型下载
搜索coffe——>model zone
Caffe
Mxnet: chentianqi团队主导的package,对显存利用率非常高,定义网络层简单。
tensorflow:Google的深度学习框架;tensorboard可视化很方便,实时监控;数据和模型并行化好速度快。
11.实验条件
最好用AVIDIA Tegra X1
GPU的运算速度比CPU快很多
显卡:TitanX:8000元左右 老产品 显存大12G
1080:5000元左右 新产品 显存8G
显存:当训练网络的时候输入的数据,还有训练模型的时候也有一些缓存的参数都需要占内存,显存越大一次输进来的数据也比较大,迭代的batch也比较大,训练的比较好。
12.卷积神经网络的反向传播
(1)
❤x 一般是4维的,[batch,channel,height,width]
w 也是4维的,[batch,channel,height,width] x是三通道的那么w(filter )也是三通道的,也就是深度是一样的。如果有64个卷积核那么生成的特征图是64维的,接下来的再进行卷积的卷积核的深度就是64了。
生成的特征图out的深度取决于有多少个神经元,也就是filter。同样也是4维的。
dout[0,0,1]是第一个小方块,以此类推,0是第一个图片,0是第一个通道,1是特征图里的第一个小方格。
dw = dout x X 求dw:把图片上的每一个3乘3的小方格都计算一遍。
❤pooling层的反向传播(没有权重)
只在最大的值的地方上写上最大值,其他地方填0.
13.经典的卷积神经网络模型
Alexnet:
VGG: