zoukankan      html  css  js  c++  java
  • 『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位计算。

    总结

  • 相关阅读:
    反射学习笔记
    路由机制
    缓存笔记
    进程和线程
    垃圾回收机制
    堆和栈
    值类型和引用类型及参数传递
    招到一个程序员很难吗?
    全面讲解:委托、事件
    struts2入门实例
  • 原文地址:https://www.cnblogs.com/hellcat/p/7218439.html
Copyright © 2011-2022 走看看