[8]Deep Learning Software-深度学习软件
文章目录
- 前言
- TensorFlow(静态图)
- Pytorch(动态计算图)
- 动态图和静态图
- Caffe/Caffe2
- 建议
前言
现在深度学习框架发展的太快了(文中的有些代码已经发生了些许变化),本文主要记录课中讲的关于 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++写的,在产品部署中比较好。
而且很少写代码,都是编辑配置文件:
建议
[8]Deep Learning Software-深度学习软件相关推荐
- Deep Learning(深度学习)相关网站
Deep Learning(深度学习) ufldl的2个教程(这个没得说,入门绝对的好教程,Ng的,逻辑清晰有练习):一 ufldl的2个教程(这个没得说,入门绝对的好教程,Ng的,逻辑清晰有练习): ...
- Deep Learning(深度学习) 资料库
Deep Learning(深度学习) ufldl的2个教程(这个没得说,入门绝对的好教程,Ng的,逻辑清晰有练习):一 ufldl的2个教程(这个没得说,入门绝对的好教程,Ng的,逻辑清晰有练习): ...
- Deep Learning(深度学习)资料汇总
Deep Learning(深度学习) ufldl的2个教程(这个没得说,入门绝对的好教程,Ng的,逻辑清晰有练习):一 ufldl的2个教程(这个没得说,入门绝对的好教程,Ng的,逻辑清晰有练习): ...
- deep learning (深度学习)资源整理,非常全面【转】
Deep Learning(深度学习) ufldl的2个教程(这个没得说,入门绝对的好教程,Ng的,逻辑清晰有练习):一 ufldl的2个教程(这个没得说,入门绝对的好教程,Ng的,逻辑清晰有练习): ...
- Deep Learning(深度学习)
Deep Learning(深度学习) ufldl的2个教程(这个没得说,入门绝对的好教程,Ng的,逻辑清晰有练习):一 ufldl的2个教程(这个没得说,入门绝对的好教程,Ng的,逻辑清晰有练习): ...
- Deep Learning(深度学习)学习笔记整理系列
一.概述 Artificial Intelligence,也就是人工智能,就像长生不老和星际漫游一样,是人类最美好的梦想之一.虽然计算机技术已经取得了长足的进步,但是到目前为止,还没有一台电脑能产生& ...
- Deep Learning(深度学习)学习笔记整理系列之(八)
Deep Learning(深度学习)学习笔记整理系列之(八) 分类: Deep Learning 机器学习 Linux驱动2013-04-10 11:4257652人阅读评论(25)收藏举报 ...
- Deep Learning(深度学习)学习笔记整理
http://blog.csdn.net/zouxy09/article/details/8775360 一.概述 Artificial Intelligence,也就是人工智能,就像长生不老和星际漫 ...
- [深度学习]DEEP LEARNING(深度学习)学习笔记整理
转载于博客http://blog.csdn.net/zouxy09 一.概述 Artificial Intelligence,也就是人工智能,就像长生不老和星际漫游一样,是人类最美好的梦想之中的一个. ...
- 【转载】Deep Learning(深度学习)学习笔记整理系列
Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-0 ...
最新文章
- 为什么小批量会可以使模型获得更大的泛化
- Android 图片 OOM问题总结
- ethereumjs/ethereumjs-vm-4-tests
- Java高级语法笔记-库的使用(jar)
- HDU-1301-Jungle Roads
- Wolfram Mathematica 13 for Mac(功能强大的科学计算软件)
- 2022-07-12
- 61php飞信发送类(phpfetion)v1.5,资源索引 L_PC6下载
- 几款免费且实用的项目管理工具
- 配置香橙派zeropuls2
- 微信小程序真机调试连接不到后台服务器,解决微信小程序wepy真机预览跟本地表现不一样,数据变化了视图没变化...
- Android高级工程师面试实战,赶快收藏备战金九银十!
- DSConv:Efficient convolution operator
- SQL语言增、删、改、查功能练习
- 《Dreamweaver CS6 完全自学教程》笔记 第十七章:Spry 框架技术
- 读作工业4.0,唱作工业互联网,写作中国制造2025
- IBM X系列服务器装机全过程,RAID磁盘阵列制作与安装ESXI
- 更改安卓系统开机画面
- FAILED org.spark_project.jetty.server.Server@8a6631b: java.net.BindException: Address already in use
- Spark项目实战—电商用户行为分析
热门文章
- CSDN写文章Markdown个人笔记
- leetcode279 拉格朗日四平方和定理
- CodeForces 954D-Fight Against Traffic(加边最短路)
- QT -- TcpSocket实例,使用Qt中的tcp通信协议,构建客户端和服务端,实现局域网通信软件功能
- htmlunit 示例
- PHP - Laravel 视图模板(blade.php) 循环便利
- 性能测试能力提升-线程、并发、吞吐量、TPS、QPS、响应时间
- AIX下创建jfs2文件系统并挂载到固定目录
- 解决Unable to determine application id: com.android.tools.idea.run.ApkProvisionException:
- 计算机专业英语电池,电池分为哪几种?英文缩写?