本文是接着上一篇深度学习之 3 线性模型_水w的博客-CSDN博客
目录
深度学习框架
一、核心组件
核心组件-张量
核心组件-基于张量的操作
核心组件-计算图
核心组件-自动微分工具
核心组件-BLAS、cuBLAS、cuDNN等拓展包
二、主流框架
Caffe
Theano
MXNet
TensorFlow
Keras
Torch & PyTorch
OneFlow
总结:
三、Tensorflow与PyTorch比较分析
四、PyTorch入门
PyTorch入门-安装
PyTorch入门-Tensor
PyTorch入门-自动求导
深度学习框架是一种 接口 、 库 或 工具 ,利用 预先构建和优化好的组件 集合定义模型。
- 一个良好的深度学习框架应具备的关键特性:
✓ 性能优化✓ 易于理解和编码✓ 良好的社区支持✓ 并行处理以减少计算✓ 自动计算梯度
- 框架核心组件:
◼ 张量◼ 基于张量的操作◼ 计算图◼ 自动微分工具◼ BLAS、cuBLAS、cuDNN等拓展包
- 框架核心组件:
◼ 张量◼ 基于张量的操作◼ 计算图◼ 自动微分工具◼ BLAS、cuBLAS、cuDNN等拓展包
张量是深度学习框架中最核心的组件,Tensor实际上就是一个多维数组。
Tensor对象具有3个属性:
计算图带来的一个好处是让模型训练阶段的梯度计算变得 模块化 且更为 便捷 ,也就是 自动微分法 。◼ 自动微分Forward Mode:给定函数 ( 1 , 2 ) = ln( 1 ) + 1 2 − sin( 2 )
◼ 通过前面所介绍的组件,已经可以搭建一个全功能的深度学习框架:将待处理数据转换为张量,针对张量施加各种需要的操作,通过自动微分对模型展开训练,然后得到输出结果开始测试。◼ 存在的缺陷是运行缓慢◼ 利用扩展包来进行加速,例如:✓ Fortran实现的BLAS(基础线性代数子程序)✓ 英特尔的MKL(Math Kernel Library)✓ NVIDIA推出的针对GPU优化的 cuBLAS 和 cuDNN 等更据针对性的库
◼ 深度学习的主流框架:✓ Caffe✓ Theano✓ Torch & PyTorch✓ TensorFlow✓ Keras✓ MXNet✓ OneFlow✓ MindSpore✓ PaddlePaddle
发展历程:
◼ Caffe 的全称是 Convolutional Architecture for Fast Feature Embedding ,它是一个 清晰 、 高效 的深度学习框架,于2013 年底由加州大学伯克利分校开发,核心语言是 C++ 。它支持命令行、 Python 和MATLAB接口。 Caffe 的一个重要特色是可以在不编写代码的情况下训练和部署模型。 https://github.com/BVLC/caffe◼ Caffe2 是由 Facebook 组织开发的一个 轻量级 的深度学习框架,具有 模块化 和 可扩展性 等特点。它在原来的Caffe 的基础上进行改进,提高了它的表达性,速度和模块化,现在被并入 Pytorch项目。Caffe曾经名噪一时,但由于使用不灵活、代码冗长、安装困难、不适用构建循环网络等问题,已经很少被使用。 https://github.com/caffe2
◼ 优点:
Theano 是深度学习框架的鼻祖,由 Yoshua Bengio 和蒙特利尔大学的研究小组于 2007 年创建,是率先广泛使用的深度学习框架。Theano 是一个 Python 库,速度更快,功能强大,可以高效的进行数值表达和计算,可以说是从NumPy 矩阵表达向 tensor 表达的一次跨越,为后来的深度学习框架提供了样板。遗憾的是Theano 团队 2017 年已经停止了该项目的更新,深度学习应用框架的发展进入到了背靠工业界大规模应用的阶段。https://github.com/Theano
MXNet 于 2014 年由上海交大校友陈天奇与李沐组建团队开发, 2017 年 1 月, MXNet 项目进入Apache 基金会,成为 Apache 的孵化器项目。 MXNet 主要用 C++ 编写,强调提高内存使用的效率,甚至能在智能手机上运行诸如图像识别等任务。◼ 它拥有类似于 Theano 和 TensorFlow 的数据流图,为多 GPU 配置提供了良好的配置,还有着类似于 Blocks 等更高级别的模型构建块,并且 可以在任何硬件上运行(包括手机 )。同时 MXNet 是一个旨在提高效率和灵活性的深度学习框架,提供了强大的工具来帮助开发人员利用 GPU和云计算的全部功能。 https://mxnet.apache.org/
TensorFlow 最初由 Google Brain 团队针对机器学习和深度神经网络进行研究所开发的,目前开源之后可以在几乎各种领域适用。它灵活的架构可以部署在一个或多个CPU 、 GPU 的台式及服务器中,或者使用单一的API 应用在移动设备中。 TensorFlow 可以说是当今十分流行的深度学习框架,Airbnb、 DeepMind 、 Intel 、 Nvidia 、 Twitter 以及许多其他著名公司都在使用它。 TensorFlow 提供全面的服务,构建了活跃的社区,完善的文档体系,大大降低了我们的学习成本 ,另外,TensorFlow 有很直观的计算图可视化呈现 。 模型能够快速的部署在各种硬件机器上,从高性能的计算机到移动设备,再到更小的更轻量的智能终端 。◼ 但是, TensorFlow 相比 Pytorch , Caffe 等框架, 计算速度很慢 。而且通过它构建一个深度学习框架 需要更复杂的代码 ,还要忍受重复的 多次构建静态图 。https://github.com/tensorflow
Keras 于 2015 年 3 月首次发布,拥有“为人类而不是机器设计的 API” ,由 Google 的 Francis Chollet 创建与维护,它是一个用于快速构建深度学习原型的 高层神经网络库 ,由纯 Python 编写而成,以TensorFlow, CNTK , Theano 和 MXNet 为底层引擎,提供简单易用的 API 接口,能够极大地减少一般应用下用户的工作量。 能够和TensorFlow , CNTK 或 Theano 配合使用。通过 Keras 的 API 可以仅使用数行代码就构建一个网络模型,Keras+Theano , Keras+CNTK 的模式曾经深得开发者喜爱。 目前Keras 整套架构已经封装进了 TensorFlow ,在 TF.keras 可以完成 Keras 的所有事情。 https://keras.io/
◼ Torch 是一个有大量机器学习算法支持的科学计算框架,其诞生已经有十余年,但真正起势得益于Facebook 开源了大量 Torch 的深度学习模块和扩展。 Torch 的一个特殊之处是采用了 Lua 编程语言(曾被用来开发视频旅游)。 https://github.com/torch◼ PyTorch 于 2016 年 10 月发布,是一款专注于 直接处理数组表达式 的低级 API 。 前身是 Torch 。 Facebook人工智能研究院对 PyTorch 提供了强力支持。 PyTorch 支持动态计算图 ,为更具数学倾向的用户提供了 更低层次 的方法和更多的灵活性,目前许多新发表的论文都采用 PyTorch 作为论文实现的工具, 成为学术研究的首选解决方案 。 https://github.com/pytorch
◼ OneFlow 是由北京一流科技有限公司开发的一款深度学习框架, OneFlow 围绕 性能提升 和 异构分布式扩展 ,秉持静态编译和流式并行的核心理念和架构,解决了集群层面的内存墙挑战。OneFlow计算集群内部的通信和调度消耗,提高硬件利用率,加快模型训练速度,训练成本时间大幅缩减。OneFlow 天生支持 数据并行 、 模型并行 和 混合并行。◼ OneFlow 是一个专门针对深度学习打造的异构分布式流式系统,大幅减少了运行时开销,且一旦成功启动无运行时错误。OneFlow 分布式易用,代码量优且完全自动并行。https://github.com/Oneflow-Inc/oneflow.git
通过分析,目前来看TensorFlow和PyTorch框架是业界使用最为广泛的两个深度学习框架,TensorFlow 在工业界拥有完备的解决方案和用户基础,PyTorch 得益于其精简灵活的接口设计,可以快速设计和调试网络模型,在学术界获得好评如潮。
PyTorch是一个基于 Python 的库,用来提供一个具有灵活性的深度学习开发平台。PyTorch的工作流程非常接近Python的 科学计算库 —— numpy 。PyTorch像Python一样简单,可以顺利地与Python数据科学栈集成,取代了具有特定功能的预定义图形,PyTorch为我们提供了一个框架,以便可以在运行时构建计算图,甚至在运行时更改它们。 PyTorch的其他一些优点还包括: 多gpu支持 , 自定义数据加载器 和 简化的预处理器 。
pip install <软件包名称> -i https://pypi.tuna.tsinghua.edu.cn/simple
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ …………
torch.FloatTensor([2])
a = torch.FloatTensor([2])
b = torch.FloatTensor([3])
a + b
如图,表达式:z=wx+b,可写成两个表示式:y=wx, 则z=y+b。
Pytorch调用backward(),将自动计算各节点的梯度,这是一个反向传播过程, 这个过程如下图所示。