『cs231n』卷积神经网络工程实践技巧_下
概述
计算加速
方法一:
由于计算机计算矩阵乘法速度非常快,所以这是一个虽然提高内存消耗但是计算速度显著上升的方法,把feature map中的感受野(包含重叠的部分,所以会加大内存消耗)和卷积核全部拉伸成为向量,组成两个矩阵相乘,再想办法恢复为输出的feature map。
方法二:
利用傅里叶变换的特性加速计算,思路来源于信号处理,只对大卷积核有效。
方法三:
思路来源于经典算法,用的人很少,老师也没怎么介绍,个人亦是不太感兴趣,需要的时候自己查资料吧。
总结:
比较简要的总结就是,如果真的需要自己实现卷积层的时候,那就使用im2col提高效率吧。
GPU/CPU
这一部分老师天南海北的扯了不少,中心思想就是:深度学习使用GPU分布式计算效果更好,英伟达伟光正(历史局限性问题,现在的谷歌的TPU貌似也有崛起的可能)。
不过下图还是展示了,即使GPU在并行计算领域效能非凡(相对应的CPU很擅长顺序处理),面对深度学习的海量数据计算还是力不从心,而且,好的GPU价格往往不菲(不是我吐槽,这是老师说的),
性能瓶颈
虽然GPU计算速度极其高效,但GPU和CPU数据相互拷贝过程还是会消耗大量时间
文件读取,比如打开批量jpg时,由于不同图片存放于硬盘不同位置,随机索引会消耗大量时间,而解压缩也会消耗大量时间,所以一般的做法是进行预处理,解压为顺序存储的像素文件,一般各个框架都有自己的标准文件格式
网瘾少年都知道,GPU么,内存越大(价格越贵)越好,(逃...
浮点类型
深度学习常使用单精度(32位)浮点数,
1.节省内存,可以存储更多的数据
2.更少的位数,更少的计算量,更快的运算速度
在课程中的程序中,由于numpy默认精度是64位,一般都给出了显示的类型转换。
实际上有很多16位的尝试,也有一些取得了不错的结果,但是16位的表示范围和精度是个问题,有人做过尝试:正常的16位运算由于误差积累较难收敛,如果运算结果使用高精度暂存,然后随机四舍五入(具体怎么随机不太明晰)的话,结果不错,还有人使用10位激活函数+12位参数更新的精度组合进行计算,结果也不错,还有极端人士使用1位(1或-1)进行计算,老师说很酷,我觉得这只是他的中性的口头禅吧... ...
总之,现在老老实实的使用32位即可,以后说不定会使用16位计算。
总结