[Lecture 8 ] Deep Learning Software(深度学习软件)

文章目录

        • 课堂问答
        • 前言
        • 1. TensorFlow(静态图)
        • 2. Pytorch(动态计算图)
        • 3. 动态图和静态图
        • 4. Caffe/Caffe2
        • 建议和总结

课堂问答

前言

现在深度学习框架发展的太快了(文中的有些代码已经发生了些许变化),本文主要记录课中讲的关于 Pytorch、Caffe 和 TensorFlow 的内。重点是Pytorch。

在之前的理论课上,我们知道,要完成神经网络的训练,我们最好是画出网络的计算图,然后理清其前向传播和反向传播过程。同时,要考虑底层实现的优化,比如数据的并行加载、网络的并行训练、GPU并行计算等。而神经网络框架让这些工作变得简单了很多:
[Lecture 8 ] Deep Learning Software(深度学习软件)_第1张图片
而现在框架实现的一个基本目标就是:像Numpy一样的编写前向传播,并能够通过 计算图 自动计算梯度进行反向传播。例如下面这个例子:
[Lecture 8 ] Deep Learning Software(深度学习软件)_第2张图片
[Lecture 8 ] Deep Learning Software(深度学习软件)_第3张图片

1. TensorFlow(静态图)

主要过程分为下面几个部分:

  • 定义前向传播的计算图(此时没有计算);
  • 运行计算图的实例获得损失和梯度;
  • 利用梯度进行更新,并重复该过程。

[Lecture 8 ] Deep Learning Software(深度学习软件)_第4张图片
然后添加训练代码:
[Lecture 8 ] Deep Learning Software(深度学习软件)_第5张图片
但是,上述操作有一个问题,即我们每次需要从CPU传输训练数据和权重到GPU,一次迭代之后,我们还要把梯度和损失传回来更新参数,而权重和数据都很大的情况下,上述操作非常费时。
所以,我们可以添加权重为计算图的内部变量,它在计算的整个周期都存在,而且不用传来传去,同时添加参数更新操作进计算图。
[Lecture 8 ] Deep Learning Software(深度学习软件)_第6张图片
但是,上述操作依然存在问题:即我们的损失计算在权重更新之前,而我们最后只返回损失。此时,TensorFlow会智能地只执行到我们需要的位置,而造成权重没有更新。
一个解决方案是显示的返回新的权重,但是这些权重往往都是很大的张量(tensor),这样会造成大数据在CPU和GPU之间移动。 一个小技巧是:我们在计算图中添加一些假结点(Dummy node),这些结点操作在我们的权重上,但是不会返回一个很大的数据,最后只要我们同时计算损失和这个假结点就行。
[Lecture 8 ] Deep Learning Software(深度学习软件)_第7张图片
当然,我们还可以调用TensorFlow里面的 优化器Optimizer 来帮我们自动执行上述操作。
[Lecture 8 ] Deep Learning Software(深度学习软件)_第8张图片
当然,TensorFlow也定义了很多高级的API封装了很多网络层和损失函数。而且还有一个高等级的API——Keras,其后端基于TensorFlow并封装了很多操作。

可视化
TF中有个工具叫TensorBoard,支持我们可视化训练过程和网络结构。

2. Pytorch(动态计算图)

Pytorch不同于TensorFlow,其使用的是动态计算图。而且内部定义了三层抽象:
[Lecture 8 ] Deep Learning Software(深度学习软件)_第9张图片
之所以称为动态图,因为其不用像TF那样先显示定义好计算图,再输入训练数据训练。而是,再进行计算的时候动态建立一个计算图。
例如,我们使用Pytorch定义一个两层神经网络来训练:
[Lecture 8 ] Deep Learning Software(深度学习软件)_第10张图片
自动求导(Autograd)
[Lecture 8 ] Deep Learning Software(深度学习软件)_第11张图片
其中:

  • A PyTorch Variable is a node in a computational graph
  • x.data is a Tensor
  • x.grad is a Variable of gradients (same shape as x.data)
  • x.grad.data is a Tensor of gradients

当然,我们也能自己定义自己的反向传播函数,相当于计算图中的一个 Gate,只需要完成前向和反向传播即可。然后PyTorch就能自动求导。
[Lecture 8 ] Deep Learning Software(深度学习软件)_第12张图片
高级封装 nn
类似于Keras对TF的封装,Pytorch中也有高级的API,即nn模块,其定义了很多我们常用的网络层和函数。
[Lecture 8 ] Deep Learning Software(深度学习软件)_第13张图片
优化器 Optimizer
[Lecture 8 ] Deep Learning Software(深度学习软件)_第14张图片
定义自己的网络层
当然我们也可以通过继承nn.Module来定义自己的网络结构,使之就像nn给我们提供的API一样。
[Lecture 8 ] Deep Learning Software(深度学习软件)_第15张图片
数据加载器(DataLoader)

当然,Pytorch中也还有一个比较好用的接口——数据加载器。它允许我们并行的加载数据,只要我们先定义自己的数据类(DataSet).

预训练模型
torchvision中包含了很多计算机视觉中常用的网络结构和预训练模型。

可视化

类似于TF的TensorBoard,Pytorch中也有一个可视化工具 Vidom,但是还支持计算图的可视化。

3. 动态图和静态图

之前讲了TF是基于静态图的,其需要先显示声明我们的计算图;而Pytorch是基于静态图的,其边计算边构造图。

  • 相比较而言,静态图由于事先知道我们的图结构,所以可以做一些优化:
    [Lecture 8 ] Deep Learning Software(深度学习软件)_第16张图片
  • 还有一个优势是:静态图一旦定义,很少更改,所以我们可以将其序列化并讲其存在磁盘中。
    之后就可以直接加载复用,而不用再翻看之前的代码。(即发布的时候,我们只需要计算图就行,不用训练代码)
  • 而动态图,则在很多场景下看起来比较简洁,因为没有繁琐的定义计算图的步骤。而且Pytorch更加的Pythonic。同时,对于网络中的控制流,也像写Python和Numpy一样。但是,如果要在TF中添加控制流,则需要借助TF的一些API,添加到我们的静态图中。
    [Lecture 8 ] Deep Learning Software(深度学习软件)_第17张图片

4. Caffe/Caffe2

不同于之前的框架,Caffe底层是用C++写的,在产品部署中比较好。
[Lecture 8 ] Deep Learning Software(深度学习软件)_第18张图片
而且很少写代码,都是编辑配置文件:
[Lecture 8 ] Deep Learning Software(深度学习软件)_第19张图片

建议和总结

[Lecture 8 ] Deep Learning Software(深度学习软件)_第20张图片

你可能感兴趣的:(#,CS231n)