@nikkyoya(u2331987) 2021.1.14

TensorFlow简介

TensorFlow是什么

Google开源软件库

  • 采取数据流图,用于数值计算
  • 支持多种平台——GPU、CPU和移动设备
  • 最初用于深度学习,后来变得越来越通用


数据流图

在逻辑上描述一次机器学习计算的过程

20200525002717787.gif

  • 节点——处理数据(计算数据)
  • 线——节点之间的输入输出关系(节点之间的数据依赖)
  • 线上运输张量(Tensor,所有n维数据)
  • 节点被分配到各种计算设备上运行

特性

  • 高度的灵活性(只要将计算表示为数据流图即能使用)
  • 真正的可移植性(CPU,GPU,移动设备等)
  • 产品和科研结合(科研代码可以无缝转化到产品上)
  • 自动求微分(神经网络中训练中的操作:反向传播需对变量进行不停微分求解)
  • 多语言支持(python,c++,java,c#,R等)
  • 性能最优化(目前运行最快的库)

TensorFlow版本变迁

image.png
image.png
image.png
image.png
image.png

Tensorflow1.0 主要特性

  • XLA——Accelarate Linear Algebra 线性运算编译器,优化TensorFlow
    • 提升训练速度58倍
    • 可以在移动设备运行
  • 引入更高级别API——tf.layers/ty.metrics/tf.losses/tf.keras
  • TensorFlow调试器
  • 支持docer镜像,引入tensorflow serving服务

image.png
Tensorflow1.0 架构

  • Keras
  • Estimator
  • Datasets
  • Layers
  • Distribution engine

Tensorflow2.0 主要特性

  • 使用tf.keras和eager mode进行更简单的模型构建
  • 鲁棒的跨平台模型部署
  • 强大的研究实验
  • 清除不推荐使用的API和减少重复来简化API

image.png
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
- 跨语言
- 跨平台
支持比较简单

静态图与动态图

  • 静态图(图结构一旦构建就不再变化)——效率高(可做优化)
  • 动态图(图结构不确定)——调试容易

image.png
图结构

TensorFlow v.s. PyTorch代码比较

代码功能:计算Tensorflow基础知识 - 图10

TensorFlow 1.0实现
  1. import tensorflow as tf
  2. print(tf.__version__)
  3. # 一、构建计算图
  4. # 1.定义变量
  5. x = tf.constant(0.)
  6. y = tf.constant(1.)
  7. # 2.定义操作
  8. # x = x + y
  9. add_op = x.assign(x + y)
  10. # y = y / 2
  11. div_op = y.assin(y / 2)
  12. # 二、打开会话,用会话执行图中算子
  13. with tf.Session() as sess:
  14. sess.run(tf.global_variables_initializer())
  15. for iteration in range(50):
  16. sess.run(add_op)
  17. sess.run(div_op)
  18. print(x.eval()) # sess.eval(x) 从对象中获取eval函数

pytorch实现
  1. import torch
  2. print(torch.__version__)
  3. # 定义变量
  4. x = torch.Tensort([0.])
  5. y = torch.Tensort([1.])
  6. # 无需会话,像使用python一样直接计算
  7. for iteration in range(50):
  8. x = x + y
  9. y = y / 2
  10. #直接获得值
  11. print(x)

TensorFlow 2.0实现
  1. import tensorflow as tf
  2. tf.enable_eager_execution() #该过程不可逆;eager模式1.5+的1.*版本需手动打开;2.*自动开启,无需此行代码
  3. print(tf.__version__)
  4. x = tf.constant(0.)
  5. y = tf.constant(1.)
  6. for iteration in range(50):
  7. x = x + y
  8. y = y / 2
  9. print(x.numpy())

纯Python实现

纯python结果值与深度学习库的结果值不同,因为两者的精度管理不同

  1. x = 0
  2. y = 1
  3. for iteration in range(50):
  4. x = x + y
  5. y = y / 2
  6. print(x)

结论

tf2.0和pytorch代码与python类似,写法自然;
tf1.0写法较为变态,需要引入session、初始化、op等概念,写样板代码等。

总结

TensorFlow 1. TensorFlow 2. 与 PyTorch
易用性 难用 易用,两者接近
调试 容易,两者接近
全面性 好,tf2优于pytorch
序列化和部署 好,tf2优于pytorch


TensorFlow环境配置

Tensorflow基础知识 - 图11云端配置优势

  • 规格统一,节省自己的机器
  • 有直接配置好环境的镜像

云环境

  • Google Cloud配置(送300刀免费体验)
  • Amazon云配置

参考

慕课网