1.目标分类基本框架
目标分类的应用场景有人脸识别、物体识别、场景识别、文字识别等,先看一下目标分类的基本框架。
数据准备
数据足够?不够怎么增加数据量
模型设计
用现有模型?直接用复杂模型?
数据少的时候,设计简单网络进行简单学习,还是大网络进行特殊任务学习
训练细节
神经网络配件,参数等
(1)数据准备
a.数据来源:
现有数据集的子集、网络采集、现有数据人工标注。
现有数据:http://deeplearning.net/datasets
b.数据扩充:
原始数据切割、噪声颜色等像素变化、旋转平移等姿态变化。
如下图,一张图片经过了 5x 的像素级变化,包括平均/锐化(unsharp)/动作
模糊(motion)等,每种又经过了 6x 的旋转平移,也就是说,原始数据扩充了 30x。
效果卷积核:
F1 = fspecial('disk',1)
F2 = fspecial('average',4)
F3 = fspecial('gaussian',3)
F4 = fspecial('gaussian',4)
F5 = fspecial('unsharp')
F6 = fspecial('motion',7,0.75*pi)
F7 = fspecial('motion',5,0)
F8 = fspecial('motion',5,pi/2)
F9 = fspecial('motion',6,pi)
F10 = [0 0 0; 0 1 0; 0 0 0]
vfilter = {F1, F3, F5, F6, F9, F10}
旋转平移R,T
vTrans = {}
t1 = maketform('affine',[1 0 2*f; 0 1 2*f; 0 0 1]')
t2 = maketform('affine',[0.96 0.1 0; -0.1 0.96 0; 0 0 1]')
t3 = maketform('affine',[-1 0 0; 0 1 0; w1 0 1]')
t4 = maketform('affine',[0.97 -0.02 0; 0.02 0.97 0; 0 0 1]')
t5 = maketform('affine',[1 0 0; 0 1 0; 0 0 1]')
t6 = maketform('affine',[1.04 -0.1 0; 0.1 1.04 0; 0 0 1]')
t7 = maketform('affine',[1.03 0.02 0; -0.02 1.03 0; 0 0 1]')
vTrans = {t1, t2, t3, t5, t6}
c.数据规范
均值处理、归一化、大小调整。
# 均值处理
tr_data = tr_data - MEAN_IMAGE
# 归一化
trdata/=256
# 大小调整
for t in range(3):
im224[t,:,:] = cv2.resize(imi[:,:,t], (224,224))
datablob[i,:,:,:] = im224
(2)模型设计
a.任务类型
- 分类:表情分类、种类分类、人群分类
- 分类+回归:表情+程度、种类+信心、什么人+人数
- 多目标分类:面部行为、群体行为、车流预测
b.现有模型
c.局部更改-从头设计
(3)训练细节
a.GPU-Batch size ,是否并行
GPU内存-Batch Size关系,Batch Size在实验的过程中,如果设置不合理,就可能会报错。
b.数据循环方式/平衡性考虑
数量较少的类别,数据是否需要补偿;
从到头尾多次循环;
每次随机选取部分数据。
c.网络深度宽度确定
深度与卷积核关系:第ii层卷积核关注范围?
**问题:**2个3×33×3的卷积核和1个5×55×5的卷积核哪种更好?
**Answer:**2个3×3的卷积核更好。
多加一层,可以更加深度的学习;参数个数上来说,两个3×3的卷积核的参
数有18个,一个5×5的卷积核参数有25个,参数更少,层数变多,参数变
少。
d.损失函数设计
Softmax、直接拟合
e.学习率变化方式,模型各层学习率是否一致
f.评价方式:准确率,F1 score
2.迁移学习
问题:ImageNet 上亿参数,数据量百万,是不是参数多的模型都需要大量数据?当然不是啦,我们可以用别人训练好的模型(基础模型),在训练好的部分参数基础上进行训练。
a.不同数据处理
少量数据的情况下,如果数据是与原来模型训练数据是类似的数据,则可以
仅FC层做更新;但如果是不同的数据,则不能确定效果;
大量数据的情况下,如果数据是与原来模型训练数据是类似的数据,则需要
对中高层更新;如果是不同的数据,则需要更新更多层。
b.学习率的处理
最底的卷积层基本不变,不进行update;
中间的卷积层视情况而定;
最后全连接层,结构参数均需进行变化。
3.研究分享-如何设计神经网络
研究问题:如何进行面部行为识别(AU detection)
现有模型
看一下已有方法/模型。
Deepface
传统 CNN 用同一个卷积核对整张图片进行卷积运算,卷积核参数共享,不同局部特性对参数影响相互削弱,达不到最优的效果,对应的解决方法是局部卷积,不同的区域用不同参数。Deepface 对每个 pixel 都用单独一个卷积核来学习,这种全局部卷积连接有主要有下面几个缺陷
预处理:大量对准,对对准要求高,原始信息可能丢失
卷积参数数量很大,模型收敛难度大,需要大量数据
模型可扩展性差,基本限于人脸计算
也有人把特征图分成 8x8=64 小份,一小份一个卷积核,但是这并不能彻底解决上面的问题,我们的改进目标是:
不需要预处理,自动进行局部探测
不要所有区域都处理,更多关注在有意义的区域
比如额头的信息就比较少,眼睛眉毛嘴巴的信息相对重要的多
重要区域之间不会影响削弱学习效果
注意力网络-attention layer
一个想法是注意力网络-attention layer,通过权重来聚焦,如下图,我们的目标是看篮子里有什么,所以篮子给大的权重,其他地方不重要,就给小的权重,极端情况就是篮子给 1,其他部分给 0。
局部学习网络
另一个想法是局部学习网络:针对不同的区域进行针对性学习,不同的区域的学习不会相互干扰,对区域的分布能够自动适应。方法也就是切割局部,形成局部神经网络,中间层可以做 upscaling,也就是反向 pooling,之后也可以做下 deconvolution,如下图:
网络合并