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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34611579/article/details/81263984

第八章 深度学习软件

    上一章中讨论了深度学习中的优化算法,包括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的一些例子,所以在训练自己的任务时,在这些预训练模型的基础上精调是非常重要的。

扫描二维码关注公众号,回复: 3076123 查看本文章

        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。
    所以没有最优的选择,需要根据想要做的事情来决定采用什么样的框架和什么样的应用。

 

猜你喜欢

转载自blog.csdn.net/qq_34611579/article/details/81263984