[深度学习基础] 斯坦福CS231n李飞飞计算机视觉Lecture 11笔记
Lecture 11 CNNs in Practice
本章节最先介绍了数据扩充的技巧,这个内容我在Lecture 6里介绍了,这里就不过多叙述了。
Transfer Learning
迁移学习(Transfer learning) 顾名思义就是就是把已学训练好的模型参数迁移到新的模型来帮助新模型训练。考虑到大部分数据或任务是存在相关性的,所以通过迁移学习我们可以将已经学到的模型参数(也可理解为模型学到的知识)通过某种方式来分享给新模型从而加快并优化模型的学习效率不用像大多数网络那样从零学习(starting from scratch,tabula rasa)。
如上图所示,对于训练模型,其实可以从其他已经训练好的模型中提取浅层的权重,进行微调,对于最后的全连接层,进行初始化与训练,这就是迁移学习,对于数据量较大的模型时,可以多初始化并训练顶层权重,或者说将浅层的学习率调低一些,更好的训练。
对于模型相似度与数据量大小,迁移学习也有不同的适应情况:
卷积的那些事
卷积替换
其实在学习GoogleNet的时候,就已经了解过卷积替换的事情,例如,将一个卷积替换成3个卷积后,二者感受野相同,并且计算量上后者明显参数小于前者,或者更加有趣的方法是将卷积替换成与卷积,后者依然可以达到前者的效果,并且计算量也明显减少了:
还有一种卷积替换来减少参数计算数量的方式,那就是bottleneck结构,这个在之前也有介绍过,通过对通道数降维,使其参数计算数量呈指数下降,客人已将一个卷积变换成1个降维卷积与卷积,最后再来一个卷积升维来得到同样的效果。
加速卷积计算
目前所用到的卷积方式都是使用卷积核对图像上某一部分做卷积,那么可不可以将卷积替换成其他方式来加速卷积的计算方法呢?
这就可以用到im2col方式,先来看一下普通的卷积计算方式:
接下来看一下im2col的方式:
这个方法将普通的卷积替换成了数列点乘的形式,这也解释了我们为什么要通过这个变化来优化卷积。如果按照数学上的步骤做卷积读取内存是不连续的,这样就会增加时间成本。同时我们注意到做卷积对应元素相乘再相加的做法跟向量内积很相似,所以通过im2col将矩阵卷积转化为矩阵乘法来实现。
其实在学习im2col方式时,与我们之前学过的数字信号处理中的傅里叶变换很相似,将时域的卷积替换成频域的点乘,大大加快了计算速度,减少计算成本,还可以用快速傅里叶变换来加速计算,都是灯钩加速卷积的好方式。
更加高效的实行细节
GPU
这里讲到的就是硬件相关的了,一般我们可以使用GPU来代替CPU:
并且因为GPU支持多核并行,大大加快了速度:
浮点精度
实际上,我们还可以在权重计算上使用不同的浮点精度来加速计算,目前再普通的numpy里都是用的是双精度浮点数,也就是64位小数,其实我们可以使用单精度浮点数来加速计算,也就是32位浮点数,甚至16位浮点数,大大加速计算,这里有一个知乎问题可以了解一下单精度与双精度浮点数:https://www.zhihu.com/question/26022206
小结
本章节介绍了一些加速训练的方式,包括迁移学习,替换卷积与替换卷积计算方式等软方法,还有通过GPU并行计算与替换浮点数精度等硬方法。
资料来源:
- 斯坦福CS231n李飞飞计算机视觉视频课程:https://study.163.com/course/courseMain.htm?courseId=1003223001
- CS231n官方笔记授权翻译总集篇:https://zhuanlan.zhihu.com/p/21930884
- CS231n官方PPT:http://vision.stanford.edu/teaching/cs231n/syllabus.html
- 什么是迁移学习 (Transfer Learning)?:https://www.zhihu.com/question/41979241
- im2col的原理和实现:https://blog.csdn.net/dwyane12138/article/details/78449898
- 单精度与双精度是什么意思,有什么区别?:https://www.zhihu.com/question/26022206