[8]Deep Learning Software-深度学习软件

前言

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

在之前的理论课上,我们知道,要完成神经网络的训练,我们最好是画出网络的计算图,然后理清其前向传播和反向传播过程。同时,要考虑底层实现的优化,比如数据的并行加载、网络的并行训练、GPU并行计算等。而神经网络框架让这些工作变得简单了很多:

在这里插入图片描述

而现在框架实现的一个基本目标就是:像Numpy一样的编写前向传播,并能够通过 计算图 自动计算梯度进行反向传播。例如下面这个例子:

在这里插入图片描述

在这里插入图片描述

TensorFlow(静态图)

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

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

在这里插入图片描述

然后添加训练代码:

在这里插入图片描述

但是,上述操作有一个问题,即我们每次需要从CPU传输训练数据和权重到GPU,一次迭代之后,我们还要把梯度和损失传回来更新参数,而权重和数据都很大的情况下,上述操作非常费时。
所以,我们可以添加权重为计算图的内部变量,它在计算的整个周期都存在,而且不用传来传去,同时添加参数更新操作进计算图。

在这里插入图片描述

但是,上述操作依然存在问题:即我们的损失计算在权重更新之前,而我们最后只返回损失。此时,TensorFlow会智能地只执行到我们需要的位置,而造成权重没有更新。
一个解决方案是显示的返回新的权重,但是这些权重往往都是很大的张量(tensor),这样会造成大数据在CPU和GPU之间移动。 一个小技巧是:我们在计算图中添加一些假结点(Dummy node),这些结点操作在我们的权重上,但是不会返回一个很大的数据,最后只要我们同时计算损失和这个假结点就行。
在这里插入图片描述

当然,我们还可以调用TensorFlow里面的 优化器Optimizer 来帮我们自动执行上述操作。

在这里插入图片描述

当然,TensorFlow也定义了很多高级的API封装了很多网络层和损失函数。而且还有一个高等级的API——Keras,其后端基于TensorFlow并封装了很多操作。

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

Pytorch(动态计算图)

Pytorch不同于TensorFlow,其使用的是动态计算图。而且内部定义了三层抽象:

在这里插入图片描述

之所以称为动态图,因为其不用像TF那样先显示定义好计算图,再输入训练数据训练。而是,再进行计算的时候动态建立一个计算图。
例如,我们使用Pytorch定义一个两层神经网络来训练:

在这里插入图片描述

自动求导(Autograd)

在这里插入图片描述

其中:

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就能自动求导。
在这里插入图片描述

高级封装 nn
类似于Keras对TF的封装,Pytorch中也有高级的API,即nn模块,其定义了很多我们常用的网络层和函数。

在这里插入图片描述

优化器 Optimizer

在这里插入图片描述

定义自己的网络层
当然我们也可以通过继承nn.Module来定义自己的网络结构,使之就像nn给我们提供的API一样。

在这里插入图片描述

数据加载器(DataLoader)

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

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

可视化

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

动态图和静态图

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

  • 相比较而言,静态图由于事先知道我们的图结构,所以可以做一些优化:

在这里插入图片描述

  • 还有一个优势是:静态图一旦定义,很少更改,所以我们可以将其序列化并讲其存在磁盘中。
    之后就可以直接加载复用,而不用再翻看之前的代码。(即发布的时候,我们只需要计算图就行,不用训练代码)
  • 而动态图,则在很多场景下看起来比较简洁,因为没有繁琐的定义计算图的步骤。而且Pytorch更加的Pythonic。同时,对于网络中的控制流,也像写Python和Numpy一样。但是,如果要在TF中添加控制流,则需要借助TF的一些API,添加到我们的静态图中。
    在这里插入图片描述

Caffe/Caffe2

不同于之前的框架,Caffe底层是用C++写的,在产品部署中比较好。

在这里插入图片描述

而且很少写代码,都是编辑配置文件:

在这里插入图片描述

建议

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值