TensorFlow由谷歌人工智能团队谷歌大脑(Google Brain)开发和维护的开源深度学习平台,是目前人工智能领域主流的开发平台。但从2022年6月开始,TensorFlow要被PyTorch超越,谷歌抛弃TensorFlow,主推JAX

TensorFlow架构设计优秀,通过张量流进行数据计算和传递,可视化张量流动环节;CPU/GPU部署容易,可进行分布式计算,可跨平台;

安装

Python3.7版本较为稳定,TensorFlow1.x版本与2.x版本使用相差较大,统一使用1.x版本。Python与Tensorflow安装版本对照

1
2
pip3 install tensorflow==1.14.0      # CPU版本
pip3 install tensorflow_gpu==1.14.0 # GPU版本

架构设计

TensorFlow运行机制为定义运行相分离。从操作层面可以抽象成两种:模型构建和模型运行

  • 客户端(Client):
    • 将计算过程定义为数据流图
    • 使用Session初始化数据流图的执行
  • 分布式主控端(Master):
    • 修剪图中的某些特殊子图,即Session.run()中所定义的参数。
    • 将子图划分为在不同进程和设备中运行的多个部分。
    • 将图分发给不同的工作进程。
    • 由工作进程初始化子图的计算。
  • 工作进程(Worker service):
    • 使用内核实现调度图操作并在合适的硬件(CPU、GPU等)执行。
    • 向其他工作进程发送或从其接收操作的结果。
  • 内核实现:
    • 执行一个独立的图操作计算。

基本概念

张量

张量定义

张量(Tensor)是具有统一类型(称为 dtype)的多维数组。就像Python数值和字符串一样,所有张量都是不可变的:永远无法更新张量的内容,只能创建新的张量。

张量数据类型
常用类型 不常用类型
浮点类型:tf.float16/32/64 复数:tf.complex64/128
整数型:tf.int8/16/32/64/uint8/16/32/64 量化类型:tf.qint8/16/32
布尔类型:tf.bool 可变资源类型:tf.resource
字符串类型:tf.bool 任意类型:tf.variant
张量形状

张量形状可以通过shape属性来获取:

  • 形状:张量的每个维度的长度(元素数量)。
  • :张量的维度数量。标量的秩为 0,向量的秩为 1,矩阵的秩为 2。
  • 维度:张量的一个特殊维度。
  • 大小:张量的总项数,即乘积形状向量。
张量基本操作
  • 索引与切片操作:遵循Python索引规则:start:stop:step
  • 形状操作:
    • 静态形状:
      • tf.Tensor.get_shape():获取Tensor对象的静态形状;
      • tf.Tensor.set_shape():更新Tensor对象的静态形状
    • 动态形状:
      • tf.reshape(tf.Tensor, shape) :创建一个具有不同动态形状的新张量
  • 数学计算:
    • 张量相加:tf.add(x, y)
    • 张量相乘:tf.matmul(x, y)
    • 求张量的自然对数:tf.log(x)
    • 计算张量指定维度上的总和:tf.reduce_sum(x, axis)
    • 计算张量片段总和:tf.segment_sum(data, segment_ids)

变量和占位符

  • 变量(Variable)是一种操作,变量是一种特殊的张量,能够进行存储持久化(张量不能进行持久化),它的值是张量;
    • 变量创建:tf.Variable(initial_value=None, name=None)
    • 变量能够持久化保存,普通张量则不可;
    • 当定义一个变量时,需要在会话中进行初始化;
  • 占位符(placeholder)是变量占位符,当不能确定变量的值时,可以先声明一个占位符,真正执行时再传入变量;
    • name = placeholder(dtype, shape=None, name=None)

数据流

  • 数据流图用**结点(nodes)线(edges)**的有向图来描述数学计算;
  • 节点一般用来表示数学操作,也可以表示数据输入(feed in)的起点/输出(push out)的终点,或者是读取/写入持久变量(persistent variable)的终点;
  • 线表示节点之间的输入/输出关系。这些数据线可以输运多维数据数组,即张量;
  • 输入端的所有张量准备好,节点将被分配到各种计算设备完成异步并行地执行运算;

操作

操作(Operation,OP)指专门执行计算的节点,tensorflow函数或API定义的都是操作。常用操作包括:

  • 标量运算,向量运算,矩阵运算
  • 带状态的运算
  • 神经网络组建
  • 存储、恢复
  • 控制流
  • 队列及同步运算

图和会话

  • 图(Graph)描述整个程序结构,Tensorflow中所有的计算都构建在图中;
  • 会话(Session)用来执行图的运算;

图和会话操作

图(Graph)描述了计算的过程。TensorFlow程序通常被组织成一个构建阶段和一个执行阶段。在构建阶段, OP的执行步骤被描述成一个图。在执行阶段, 使用会话执行执行图中的OP。

会话

会话(Session)用来执行图中的计算,并且保存了计算张量对象的上下文信息。会话的作用主要有:

  • 运行图结构
  • 分配资源
  • 掌握资源(如变量、队列、线程)

一个session只能执行一个图的运算。可以在会话对象创建时,指定运行的图。如果在构造会话时未指定图形参数,则将在会话中使用默认图。如果在同一进程中使用多个图(使用tf.graph()创建),则必须为每个图使用不同的会话,但每个图可以在多个会话中使用。

1
2
3
4
5
6
7
8
创建会话:tf.Session() # 使用默认图

运行:
session.run(fetches, feed_dict=None)
参数:fetches图中的单个操作,或多个操作的列表
feed_dict运行传入的参数构成的字典,可以覆盖之前的值

关闭:session.close()

Tensorboard工具

可视化是用来查看在Tensorflow平台下程序运行的过程,包括:张量/变量,操作,数据流,学习过程等,从而方便TensorFlow程序的理解、调试与优化;

Tensorflow提供了专门的可视化工Tensorboard,它将Tensorflow执行的数据、模型、过程用图形方式进行显示。Tensorflow在执行过程中,可以通过某些操作,将模型、数据、Graph等信息,保存到磁盘中的Events文件中去,从而提供给Tensorboard进行可视化。

启动:tensorboard --logdir="PycharmProjects/tensorflow_study/summary/"

数据读取

TensorFLow实现图像分类