训练时的小技巧
增强(augmentation)
对训练集进行比如翻折,选择,颜色取反,颜色加入offset,PCA,白化等等手段,是训练集变大,以提高训练模型的泛化性能。有时候还会加入噪声,还进行dropout,以解决过拟合的问题。
迁移学习(Transfer learning)
初始化权重时使用别人已经训练好的模型。
对于大中小的数据集,训练层都不一样。
caffe有个model zoo:
https://github.com/BVLC/caffe/wiki/Model-Zoo
计算卷积
如何存储
一般来说,网络约多,filter size越小,就越合适。
当size是1x1的时候,就是传说中的NiN。
GoogleNet的perception层就是用了很多1x1。
怎么加速
第一种就是把卷积变成矩阵的乘法。
第二种就是使用快速傅立叶变换。但是在filter size比较小的时候,傅立叶变换的优势不是很明显。
第三种就是使用加速矩阵算法:Strassen’s Algorithm
在15年的时候,就有一篇论文使用了这种方法做加速:
Lavin and Gray, “Fast Algorithms for Convolutional Neural Networks”, 2015
总结一下上面三种方法就是:
计算的机器
使用GPU比CPU快不少,除了Google自家弄了一个超大的CPU集群系统来算网络(这种系统在数据同步,数据通信会有不少麻烦)。
Udacity上一门讲并行计算的课程->Udacity: Intro to Parallel Programming https://www.udacity.com/course/cs344
还有一个问题就是数据的存储,因为参数很多。这里的话就有了不少改进。有64bit浮点,到32bit浮点,再到16,12,8,1bit的浮点。
还有1bit的表示。
Courbariaux et al, “BinaryNet: Training Deep Neural Networks with Weights and Activations Constrained to +1 or -1”, arXiv 2016
之前在训练faster rcnn和r-fcn的时候,zf,vgg16,resnet训练下来差不多是10~15h,还是比较快的。使用的GPU是GTX1080,而且是64G内存,使用的是迁移学习。
PS:
以上截图来自于cs231课程的ppt。
cs231n课程的视频: