第八章 深度学习软件

    上一章中讨论了深度学习中的优化算法,包括SGD动量、Nesterov、RMSProp和Adam;也讨论了正则化:尤其是dropout;最后也讨论了迁移学习,可以下载预训练过的模型,然后在自己的实际任务中进行微调。

(1)CPU VS GPU

    深度学习中一般使用到的是GPU,GPU被称作显卡或者图形处理单元,最初适用于渲染计算机图形,在深度学习中一般选用的是NVIDIA。从下图中可以看出GPU与CPU的区别:

    可以在GPU上直接写出运行代码,在NVIDIA中有一个叫做CUDA的抽象代码,可以写类C代码并且可以在GPU上直接运行;同时NVIDIA有很多开源库可以来实现高度优化,比如cuBLAS、cuFFT、cuDNN等。
    深度学习的框架近年来正在迅速发展,比如Caffe2、PyTorch(Facebook)TensorFlow(Google)以及Paddle(Baidu)、CNTK(Microsoft)、MXNet(Amazon);接下来将详细讨论其中的几个框架。
    在前几章的内容中,我们已经重复了很多次计算图这种思想,无论何时进行深度学习,都要考虑构建一个计算图来计算任何想要计算的函数,所以在线性分类器的情况下会做一个损失函数来计算损失,也会使用一些正则化项,但是在大型神经网络的情况下这些计算图的结构将非常复杂,这时候深度学习框架的意义重大,使用框架的几个原因:
    (1)这些框架可以使你非常轻松地构建和使用一个庞大地计算图,而且不用自己去管那些细节的东西;
    (2)无论什么时候使用深度学习总是需要计算梯度和损失,计算损失在权重方向的梯度,这些框架能够帮助自动的计算这些;
    (3)希望所有这些可以在GPU上高效运行,这样就不用太关注一些低级别的硬件(如cuBLAS、cuDNN等)以及数据在CPU和GPU内存之间的移动。
    下面给出在nump和两个框架TensorFlow和pytorch下的计算图的实现:

    可以看到TensorFlow和pytorch的代码在前向传播和Numpy看起来几乎完全一样,但是在TensorFlow和pytorch中可以自动计算梯度且可以自动运行在GPU上。
  (1)TensorFlow
    我们将在随机数据上使用一个两层的全连接ReLU网络来作为一个运行实例,并且将在随机数据上使用L2欧氏距离损失。
    在TensorFlow中通常把计算划分为两个主要阶段:
    首先定义计算图:

    然后进入一个TensorFlow的会话来实际运行计算图并且输入数据:

    至此,我们只是在计算图上进行了正向和反向传播,如果想训练网络只需添加几句代码即可:

    这就是一个在TensorFlow中进行全连接网络训练最基本的例子。
    但是这里有一个问题:每次执行计算图时,都将从numpy数组中复制权重到TensorFlow中才能得到梯度,这才CPU和GPU之间互相复制时非常耗费资源并且很慢,所以这里有一个解决方法:

    将w1和w2定义为变量而不是在每次正向传播时都将它作为需要输入网络的占位符。
    这里在介绍一个非常方便的API—keras,它建立在TensorFlow的基础之上并且在后端为你处理那些建立的计算图,看一下它的实现过程:

    这里构建了序列化模型,构建了一些优化器对象,调用了model.fit自动完成整个训练过程。

TensorFlow是有预训练模型的,这里有TF-Slim和Keras的一些例子,所以在训练自己的任务时,在这些预训练模型的基础上精调是非常重要的。

TF-Slim: (https://github.com/tensorflow/models/tree/master/slim/nets)

Keras: (https://github.com/fchollet/deep-learning-models)

TensorFlow与早期的框架Theano非常相似,Theano的实现过程与TensorFlow非常相似,这里就不在细说:

  (2)PyTorch
    Facebook的PyTorch不同于TensorFlow,它的内部明确定义了3层抽象:
   (1)PyTorch的张量对象就像numpy数组只是一种最基本的数组,与深度学习无关,但可以在GPU上运行;
   (2)PyTorch有变量对象,就是计算图中的节点,这些节点构成了计算图从而可以计算梯度等等;
   (3)PyTorch有模对象,它是一个神经网络层,可以将这些模组合起来建立一个大的网络。
   对于PyTorch,它的实现过程如下:

    若要让PyTorch在GPU上运行,就要让张量转换成一个cuda的类型,dtype=torch.cuda.FloatTensor。
    PyTorch中的下一层抽象就是变量,一旦从张量转到变量,就建立了计算图可以自动做梯度和其他的计算。

    同样的,对应于TensorFlow中的API—keras,PyTorch里用的是nn包:

    同样的,对应TensorFlow中定义的优化器,PyTorch里也有高级优化器:

    在PyTorch里还有一个比较好的东西叫dataloader,可以让你建立分批处理,也可以执行多线程,dataloader可以打包数据提供一些抽象。
    接下来讨论一下关于静态和动态的图,这是TensorFlow和PyTorch最大的不同。在TensorFlow中有两个操作阶段,这里第一步建立了计算图然后运行一遍又一遍,运用同一个图,把这个叫做静态计算图;在PyTorch中建立一个新的计算图时,它会在每一次前向传播时都更新,把这个叫做动态计算图。
    关于静态图,只会构建一次,然后不断地复用它,整个框架有机会在图上做优化,结合一些操作、排列一些操作,找到更有效率的操作方法,所以图可以更有效率,一个具体的例子如下:

    可以写一些有卷积的图和ReLU操作一个接一个,然后可以有结合的操作,结合卷积核ReLU,这样可能更有效率地执行。
    另一个方面是执行序列化,对于静态图来说,一旦创建,在内存中就有了这数据结构代表整个网络的结构,然后就可以用这个数据结构在磁盘中序列化,运行它而不需要构建图形的代码。
    动态图的优势是它让代码在某些情况下看起来更简洁,比如在条件运算的时候、循环计算的时候等等。
    动态图的应用:
    (1)循环网络
    (2)递归网络
    (3)模块化网络
  (3)Caffe
    它是一个不同于其他框架的深度学习框架,很多时候不需要写任何代码就可以训练网络。
    首先将数据格式转换成HDF5格式或者LMDB格式或者可以将图像文件或文本文件转换成可以进入Caffe的脚本,然后定义计算图的结构只需要修改一个叫prototxt的文件来设置计算图结构。
    Caffe具有很好的前向传播模型,很适合产品化,它的python的接口是非常有用的并且能够不需要写任何代码就可以训练模型。

   总结:
    (1)在应用工程时TensorFlow是一个非常稳妥的选择,因为它适用所有的环境场景,然后如果要用动态图可能需要高级别的封装(Keras、Sonnet);
    (2)PyTorch非常适合用于科研,如果只是写研究性代码,PyTorch是更好的选择;
    (3)如果想发布产品或手机端的应用可以选择Caffe2和TensorFlow。
    所以没有最优的选择,需要根据想要做的事情来决定采用什么样的框架和什么样的应用。

2017CS231n李飞飞深度视觉识别笔记(八)——深度学习 软件相关推荐

  1. 李飞飞计算机视觉-自用笔记(第八周)

    李飞飞计算机视觉-自用笔记(八) 15 深度学习高效方法与硬件 15 深度学习高效方法与硬件 庞大模型的三大挑战: 大小.速度.能源效率 解决方法: 1.算法优化: 剪枝(pruning):并非神经网 ...

  2. 李飞飞计算机视觉-自用笔记(第一周)

    李飞飞计算机视觉-自用笔记(一) 1 课程介绍-计算机视觉概述 1.1 课程介绍-历史背景 2 图像分类 2.1 数据-驱动方法(机器学习) 2.2 K最近邻算法 2.3 线性分类I 3 损失函数和优 ...

  3. 李飞飞新研究:基于深度学习和视觉化语言来了解不同物体间的关系

    来源:凤凰科技 概要:最近她所在的实验室正在做一项新研究,基于深度学习和视觉化语言模式了解不同物体之间的关系. 2017未来科学大奖颁奖典礼暨未来论坛年会28.29日在京举办,斯坦福大学终身教授.谷歌 ...

  4. google lab 深度学习_吴恩达、李飞飞等化身超级英雄!深度学习漫画第一卷现已开源...

    [新智元导读]深度学习版漫威来了!李飞飞发推称,在万圣节收到了一份意料之外的惊喜!在深度学习漫画的第一卷中,吴恩达.李飞飞.David Silver 纷纷化身超级英雄,发现他们面对着一个棘手的「救猫」 ...

  5. 2017CS231n李飞飞深度视觉识别笔记(一)——计算机视觉概述和历史背景

    第一章 计算机视觉概述和历史背景 课时1 计算机视觉概述 计算机视觉:针对视觉数据的研究. 关键是如何用算法来开发可以利用和理解的数据,视觉数据存在的问题是它们很难理解,有时把视觉数据称为" ...

  6. 2017CS231n李飞飞深度视觉识别笔记(十一)——图像识别和分割

    第十一讲 图像识别和分割 上一章中讲到使用循环神经网络来解决问题,同时也看到这个网络结构在很多方面的应用:目前为止谈论最多的是分类问题,这一章中我们在基于计算机视觉的主题上将讨论目标检测.图像分割等内 ...

  7. 科研笔记(八) 深度学习及其在 WiFi 人体感知中的应用(下)

    论文题目:Deep Learning and Its Applications to WiFi Human Sensing: A Benchmark and A Tutorial 论文作者:Jianf ...

  8. oracle笔记 八,Oracle学习笔记8

    一. 常见问题 1) 求部门中哪些人的薪水最高 Select ename, sal from emp Join (select max(sal) max_sal, deptno from emp gr ...

  9. 机器学习笔记(八)集成学习

    8.集成学习 8.1个体与集成 集成学习(ansemblelearning)通过构建并结合多个学习器来完成学习任务,也称为多分类器系统(multi-classifiersystem).基于委员会的学习 ...

  10. 李飞飞、吴恩达、Bengio等人的15大顶级深度学习课程,你收集全了吗?

    AI技术年度盛会即将开启!11月8-9日,来自Google.Amazon.微软.Facebook.LinkedIn.阿里巴巴.百度.腾讯.美团.京东.小米.字节跳动.滴滴.商汤.旷视.思必驰.第四范式 ...

最新文章

  1. win2008在组件服务中未找到office组件服务
  2. 【django】数据库操作-增 删 改
  3. 在线html5 api中文版,HTML5+ API Reference
  4. [原]NYOJ-开灯问题-77
  5. Windows server 2012 部署活动目录 AD
  6. jquery动态插入行,不用拼写html,简洁版
  7. python迭代函数例题_python map 函数使用,遍历访问可迭代对象
  8. Java基础002 Java9开发环境搭建(Win10平台)
  9. android 8.0图标适配
  10. 网卡地址和ip地址的区别
  11. SpringBoot + Thymeleaf 练手小项目 --------- 豆瓣网站模拟
  12. 计算机系统是日语,如何在计算机系统中添加日语输入法
  13. 昨天刚扩容80G,今天C盘就爆满了?C盘莫名其妙少了60G,使用Spacesniff也扫描不出来
  14. 在微信小游戏中实现语音互动
  15. 目标跟踪论文(一):SiamFC孪生网络
  16. 数据结构|最小生成树问题
  17. 基于 CNN的年龄和性别检测
  18. JPA错误 -- No identifier specified for entity: com.fyh.meng.configsystem.domain.GemConfig
  19. 研究移动用户APP操作行为的相关关系分析
  20. [codeforces 1304A] Cow and Haybales 阴沟里翻船

热门文章

  1. 爬虫 + 数据分析 - 7 CrawlSpider(全站爬取), 分布式, 增量式爬虫
  2. 深入浅出PID控制算法(二)——PID算法离散化和增量式PID算法原理及Matlab实现
  3. 2021年起,WPS Office纳入全国计算机等级考试二级考试软件
  4. 分布式文件系统 -- OSS云存储
  5. sublime 快捷键F5执行python程序
  6. 卡尔曼滤波-卡尔曼滤波全篇讲解
  7. java生成随机数的代码_java生成随机数的代码
  8. 计算机应用结课PPT,计算机应用说课.ppt
  9. win10 网卡驱动消失
  10. php中while什么意思,php while 循环是什么意思 - php完全自学手册 - php中文网手册