文 @nikkyoya(u2331987) 2021.1.14
TensorFlow简介
TensorFlow是什么
Google开源软件库
- 采取数据流图,用于数值计算
- 支持多种平台——GPU、CPU和移动设备
- 最初用于深度学习,后来变得越来越通用
数据流图
在逻辑上描述一次机器学习计算的过程

- 节点——处理数据(计算数据)
- 线——节点之间的输入输出关系(节点之间的数据依赖)
- 线上运输张量(Tensor,所有n维数据)
- 节点被分配到各种计算设备上运行
特性
- 高度的灵活性(只要将计算表示为数据流图即能使用)
- 真正的可移植性(CPU,GPU,移动设备等)
- 产品和科研结合(科研代码可以无缝转化到产品上)
- 自动求微分(神经网络中训练中的操作:反向传播需对变量进行不停微分求解)
- 多语言支持(python,c++,java,c#,R等)
- 性能最优化(目前运行最快的库)
TensorFlow版本变迁
Tensorflow1.0 主要特性
- XLA——Accelarate Linear Algebra 线性运算编译器,优化TensorFlow
- 提升训练速度58倍
- 可以在移动设备运行
- 引入更高级别API——tf.layers/ty.metrics/tf.losses/tf.keras
- TensorFlow调试器
- 支持docer镜像,引入tensorflow serving服务

Tensorflow1.0 架构
- Keras
- Estimator
- Datasets
- Layers
- Distribution engine
Tensorflow2.0 主要特性
- 使用tf.keras和eager mode进行更简单的模型构建
- 鲁棒的跨平台模型部署
- 强大的研究实验
- 清除不推荐使用的API和减少重复来简化API

Tensorflow2.0 架构
较大的改动处:
- tf.keras和Premade Estimators位置去掉了1.0部分的一些中间层API,2.0推荐更高层的封装构建模型
- 2.0增加了专门的Deployment部分
- 2.0架构图也是开发流程图
Tensorflow2.0 简化的模型开发流程
- 使用tf.data加载数据
- 使用tf.keras构建模型,也可以使用Premade Estimators来验证模型
- 使用tensorflow hub 进行迁移学习
- 使用eager mode进行运行和调试
- 使用分发策略进行分布式训练
- 导出到SavedModel
- 使用Tensorflow Serve、Tensorflow Lite、Tensorflow.js部署模型
Tensorflow2.0 强大的跨平台能力
- Tensorflow服务
- 直接通过HTTP/REST或GPRC/协议缓冲区
- Tensorflow Lite
- 可部署在Android、iOS和嵌入式系统上
- Tensorflow.js
- 在javascript中部署模型
- 其他语言
- C、Java、Go、C#、Rust、Julia、R等
Tensorflow2.0 强大的研究实验
- Keras功能API和子类API,允许创建复杂的他拓扑结构
- 自定义训练逻辑,使用tf.GradientTape和tf.custom_gradient进行更细粒度的控制
- 底层API自始至终可以与高层结合使用,完全的可定制
- 高级扩展:Ragged Tensors、Tensor2Tensor等
TensorFlow v.s. PyTorch
TensorFlow v.s. PyTorch概述
| TensorFlow 1. | TensorFlow 1. | pytorch | |
|---|---|---|---|
| 入门时间 | - 静态图(无eager mode或需手动打开) - 学习额外概念 - 图、会话、变量、占位符等 - 写样板代码 |
- 动态图(eager mode默认打开) - Eager mode避免1.0缺点,直接集成在Python中 |
- 动态图 - Numpy的扩展,直接集成在Python中 |
| 图创建和调试 | 静态图,难以调试,需学习tfdbg调试 | 动态图,python自带的调试工具 | |
| 全面性 | - pytorch缺少 - 沿维翻转张量(np.flip,np.flipud,np.fliplr) - 检查无穷与非数值张量(np.is_nan,np.is_inf) - 快速傅里叶变换(np.fft) - 随时间变化,越来越接近 |
||
| 序列化与部署 | 支持更加广泛 - 图保存为protocal buffer - 跨语言 - 跨平台 |
支持比较简单 |
静态图与动态图
- 静态图(图结构一旦构建就不再变化)——效率高(可做优化)
- 动态图(图结构不确定)——调试容易

图结构
TensorFlow v.s. PyTorch代码比较
代码功能:计算
TensorFlow 1.0实现
import tensorflow as tfprint(tf.__version__)# 一、构建计算图# 1.定义变量x = tf.constant(0.)y = tf.constant(1.)# 2.定义操作# x = x + yadd_op = x.assign(x + y)# y = y / 2div_op = y.assin(y / 2)# 二、打开会话,用会话执行图中算子with tf.Session() as sess:sess.run(tf.global_variables_initializer())for iteration in range(50):sess.run(add_op)sess.run(div_op)print(x.eval()) # sess.eval(x) 从对象中获取eval函数
pytorch实现
import torchprint(torch.__version__)# 定义变量x = torch.Tensort([0.])y = torch.Tensort([1.])# 无需会话,像使用python一样直接计算for iteration in range(50):x = x + yy = y / 2#直接获得值print(x)
TensorFlow 2.0实现
import tensorflow as tftf.enable_eager_execution() #该过程不可逆;eager模式1.5+的1.*版本需手动打开;2.*自动开启,无需此行代码print(tf.__version__)x = tf.constant(0.)y = tf.constant(1.)for iteration in range(50):x = x + yy = y / 2print(x.numpy())
纯Python实现
纯python结果值与深度学习库的结果值不同,因为两者的精度管理不同
x = 0y = 1for iteration in range(50):x = x + yy = y / 2print(x)
结论
tf2.0和pytorch代码与python类似,写法自然;
tf1.0写法较为变态,需要引入session、初始化、op等概念,写样板代码等。
总结
| TensorFlow 1. | TensorFlow 2. 与 PyTorch | ||
|---|---|---|---|
| 易用性 | 难用 | 易用,两者接近 | |
| 调试 | 难 | 容易,两者接近 | |
| 全面性 | 差 | 好,tf2优于pytorch | |
| 序列化和部署 | 差 | 好,tf2优于pytorch |
TensorFlow环境配置
云端配置优势
- 规格统一,节省自己的机器
- 有直接配置好环境的镜像
云环境
- Google Cloud配置(送300刀免费体验)
- Amazon云配置
参考
慕课网




