TensorFlow 基础

简介: 1 计算模型 —— 计算图(Graph)TensorFlow 中的所有计算都会被转化为计算图上的节点。TensorFlow 是一个通过计算图的形式来表述计算的编程系统。TensorFlow中的每个计算都是计算图的一个节点,而节点之间的边描述了计算之间的依赖关系。

1 计算模型 —— 计算图(Graph)

TensorFlow 中的所有计算都会被转化为计算图上的节点。TensorFlow 是一个通过计算图的形式来表述计算的编程系统。TensorFlow中的每个计算都是计算图的一个节点,而节点之间的描述了计算之间的依赖关系。

1.1 计算图的使用

  1. 定义计算图的所有节点;
  2. 执行计算。

1.1.1 使用默认图

TensorFlow程序中,系统会自动维护一个默认的计算图,通过tf.get_default_graph()函数可以获取当前默认的计算图。
通过a.graph可以查看张量所属的计算图。

import tensorflow as tf
a = tf.constant([1., 2.], name = 'a')
b = tf.constant([2., 3.], name = 'b')
result = a + b
a.graph is tf.get_default_graph()
True

1.1.2 tf.Graph函数可以生成新的计算图

不同计算图上的张量和运算均不会共享。

g1 = tf.Graph()
with g1.as_default():
    # 在计算图 g1 中定义变量 “v” ,并设置初始值为 0。
    v = tf.get_variable("v", [1], initializer = tf.zeros_initializer()) # 设置初始值为0,shape 为 1
    
g2 = tf.Graph()
with g2.as_default():
    # 在计算图 g2 中定义变量 “v” ,并设置初始值为 1。
    v = tf.get_variable("v", [1], initializer = tf.ones_initializer()) # 设置初始值为1
# 在计算图 g1 中读取变量“v” 的取值
with tf.Session(graph = g1) as sess:
    tf.global_variables_initializer().run()
    with tf.variable_scope("", reuse=True):
        print(sess.run(tf.get_variable("v")))

# 在计算图 g2 中读取变量“v” 的取值
with tf.Session(graph = g2) as sess:
    tf.global_variables_initializer().run()
    with tf.variable_scope("", reuse=True):
        print(sess.run(tf.get_variable("v")))
[ 0.]
[ 1.]

TensorFlow的计算图不仅仅可以用来隔离张量和计算,它还提供了管理张量和计算的机制。

计算图可以通过 tf.Graph.device函数来指定运行计算的设备。

g = tf.Graph()
# 指定计算运行的设备
with g.device('/gpu:0'):
    result = a + b

有效整理TensorFlow 程序的资源也是计算图的一个重要功能。

在一个计算图中,可以通过集合(collection)来管理不同类别的资源。比如通过tf.add_to_collection函数可以将资源加入一个
或多个集合中,然后通过tf.get_collection获取一个集合里面的所有资源(如张量,变量,或者运行TensorFlow程序所需的队列资源等等)

TensorFlow中维护的集合列表

集合名称 集合内容 使用场景
tf.GraphKeys.VARIABLES 所有变量 持久化TensorFlow模型
tf.GraphKeys.TRAINABLE_VARIABLES 可学习的变量(一般指神经网络中的参数) 模型训练、生成模型可视化内容
tf.GraphKeys.SUMMARIES 日志生成相关的张量 TensorFlow计算可视化
tf.GraphKeys.QUEUE_RUNNERS 处理输入的QueueRunner 输入处理
tf.GraphKeys.MOVING_AVERAGE_VARIABLES 所有计算了滑动平均值的变量 计算变量的滑动平均值

2 数据模型——张量(Tensor)

在TensorFlow程序中,所有的数据都是通过张量的形式来表示的。

从功能角度来看张量可理解为多维数组。但是张量在TensorFlow的实现并不是直接采用数组的形式,它只是对TensorFlow中运算结果的引用。在张量中并没有真正保存数字,它保存的是如何得到这些数字的计算过程。

import tensorflow as tf
# tf.constant 是一个计算,这个计算的结果为一个张量,保存在变量 a 中
a = tf.constant([1., 2.], name = 'a')
b = tf.constant([3., 4.], name = 'b')
result = tf.add(a, b, name = 'add')
print(result)
Tensor("add_3:0", shape=(2,), dtype=float32)

张量的属性值主要有三个:名字(name)、维度(shape)和类型(type)

name

  1. 张量的唯一标识符;
  2. 给出了张量是如何计算出来的。

张量和计算图上的每一个节点所有代表的结果是对应的。张量的命名:node:src_output
其中node为节点的名称,src_output表示当前张量来自节点的第几个输出。

type

每一个张量会有一个唯一的类型。

import tensorflow as tf
a = tf.constant([1, 2], name = 'a', dtype = tf.float32)
b = tf.constant([3., 4.], name = 'b')
result = tf.add(a, b, name = 'add')
print(result)
Tensor("add_4:0", shape=(2,), dtype=float32)

TensorFlow支持14种类型:
实数(tf.float32, tf.float64)、整数(tf.int8, tf.int16, tf.int32, tf.int64, tf.uint8)、布尔型(tf.bool)、复数(tf.complex64, tf.complex128)。

张量的用途

对中间结果的引用,提高代码可读性。

# 使用张量记录中间结果
a = tf.constant([1, 2], name = 'a', dtype = tf.float32)
b = tf.constant([3., 4.], name = 'b')
result = a + b

# 直接计算向量的和,这样可读性很差
result = tf.constant([1., 2.], name = 'a') + tf.constant([3., 4.], name = 'b')
<tf.Tensor 'add_5:0' shape=(2,) dtype=float32>
result.get_shape() # 获取张量的维度信息
TensorShape([Dimension(2)])

当计算图构造完成后,张量可用来获取计算结果。

通过`计算结果; 或者在会话(Session()`)中运行。

3 运行模型——会话(Session)

执行已经定义好的运算。

会话拥有并管理TensorFlow程序运行时的所有资源。当所有计算完成后需要关闭会话来帮助系统回收资源,否则会出现资源泄露现象。

模式一

# 创建一个会话
sess = tf.Session()
# 使用这个创建好的会话得到关心的运算结果
sess.run(result)
# 关闭会话
sess.close()

模式二:通过Python上下文管理机制

with tf.Session() as sess:
    sess.run(result)
# 当上下文退出时会话关闭和资源可以被释放。

指定默认会话(默认会话不会自动生成),通过 tf.Tensor.eval 函数计算张量取值。

sess = tf.Session()
with sess.as_default():
    print(result.eval())
[ 4.  6.]

以下代码实现相同的功能:

sess = tf.Session()

# 下面的两个命令有相同的功能
print(sess.run(result))
print(result.eval(session = sess))
[ 4.  6.]
[ 4.  6.]

使用tf.InteractiveSession构建会话

在交互的环境下(如Jupyter Notebook)可以直接构建默认会话,即使用tf.InteractiveSession函数(此函数会自动将生成的会话注册为默认会话)。

sess = tf.InteractiveSession()
print(result.eval())
sess.close()
[ 4.  6.]

通过ConfigProto配置会话

config=tf.ConfigProto(allow_soft_placement=True, log_device_placement=True)
sess1 = tf.InteractiveSession(config=config)
sess2 = tf.Session(config=config)

allow_soft_placement=True 在下面的任意一个条件成立,GPU的运算可以放到CPU上进行:

  1. 运算无法在GPU上执行;
  2. 没有GPU资源(比如运算被指定在第二个GPU上运行,但是机器只有一个GPU);
  3. 运算输入包含对CPU计算结果的引用。

log_device_placement=True日志中将会记录每个节点被安排在了哪个设备上以方便调试。

探寻有趣之事!
相关实践学习
基于阿里云DeepGPU实例,用AI画唯美国风少女
本实验基于阿里云DeepGPU实例,使用aiacctorch加速stable-diffusion-webui,用AI画唯美国风少女,可提升性能至高至原性能的2.6倍。
目录
相关文章
|
算法框架/工具 TensorFlow 机器学习/深度学习
带你读《TensorFlow机器学习实战指南(原书第2版)》之一:TensorFlow基础
本书由资深数据科学家撰写,从实战角度系统讲解TensorFlow基本概念及各种应用实践。真实的应用场景和数据,丰富的代码实例,详尽的操作步骤,带领读者由浅入深系统掌握TensorFlow机器学习算法及其实现。本书第1章和第2章介绍了关于TensorFlow使用的基础知识,后续章节则针对一些典型算法和典型应用场景进行了实现,并配有较详细的程序说明,可读性非常强。读者如果能对其中代码进行复现,则必定会对TensorFlow的使用了如指掌。
|
TensorFlow 算法框架/工具 索引
|
机器学习/深度学习 存储 算法
TensorFlow 基础实战
今天通过一个实例,来学习下 Tensorflow 的基本操作加实战
TensorFlow 基础实战
|
Serverless TensorFlow 算法框架/工具
TF学习:Tensorflow基础案例、经典案例集合——基于python编程代码的实现(二)
TF学习:Tensorflow基础案例、经典案例集合——基于python编程代码的实现
TF学习:Tensorflow基础案例、经典案例集合——基于python编程代码的实现(二)
|
机器学习/深度学习 Serverless TensorFlow
TF学习:Tensorflow基础案例、经典案例集合——基于python编程代码的实现(一)
TF学习:Tensorflow基础案例、经典案例集合——基于python编程代码的实现
|
存储 数据可视化 TensorFlow
TensorFlow 学习指南 一、基础
原文:LearningTensorFlow.com 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 变量 TensorFlow 是一种表示计算的方式,直到请求时才实际执行。
|
机器学习/深度学习 TensorFlow 算法框架/工具
人人都会深度学习之Tensorflow基础快速入门
内容包含Tensorflow运行原理,Tensor上面常见的操作,常见API的使用,公式推导,Tensorboard,张量形状变换,张量上的数据操作,算术操作,矩阵操作,规约操作,序列比较和索引,共享变量,Graph图的操作,Tensorflow分布式部署,多层神经网络的搭建,神经元拟合的原理及生物智能方面得到的灵感。
1731 0
|
机器学习/深度学习 算法 TensorFlow
深度学习之 TensorFlow(一):基础库包的安装
 1.TensorFlow 简介:TensorFlow 是谷歌公司开发的深度学习框架,也是目前深度学习的主流框架之一。   2.TensorFlow 环境的准备:  本人使用 macOS,Python 版本直接使用 anaconda 的集成包,我们使用 anaconda 来管理环境,为 TensorFlow 创建独立的 Python 环境。
1394 0
|
机器学习/深度学习 TensorFlow 算法框架/工具
TensorFlow——入门基础
TensorFlow原理: TensorFlow使用Graph来描述计算任务,图中的节点被称之为op.一个op可以接受0或多个tensor作为输入,也可产生0或多个tensor作为输出.
1305 0
|
TensorFlow 算法框架/工具 Python

热门文章

最新文章