TensorFlow学习笔记之一(TensorFlow基本介绍)

本文介绍了TensorFlow的基本概念,包括计算图、张量和会话。计算图描述了张量之间的计算关系,张量作为多维数组表示数据。会话用于管理计算和资源,确保正确关闭以避免资源泄漏。文章通过示例展示了如何创建和使用计算图、张量,并讨论了会话的两种使用模式及其配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TensorFlow计算模型—计算图

在TensorFlow有连个重要的概念,Tensor和Flow。
Tensor就是张量,张量可以被简单理解为多维数组,也就是矩阵。它代表着TensorFlow的数据结构。
Flow意思是“流”,它直观表达了张量之间通过计算相互转换的过程。

TensorFlow是一个通过计算图的形式来表述计算的编程系统。TensorFlow中的每个计算都是计算图上的一个节点,而节点之间的边描述了计算机之间的依赖关系。
两个向量相加样例的计算图。
在这里插入图片描述

计算图的使用

TensorFlow程序一般可以分为两个阶段:第一阶段定义计算图中的所有的计算;第二阶段执行计算。
下面代码为第一阶段,定义计算

# 引入tensorflow,并取别名为tf
import tensorflow as tf

# 定义张量a,名字为a,内容为[1.0,2.0]的向量
a = tf.constant([1.0, 2.0], name="a")	#1
b = tf.constant([1.0, 2.0], name="b")

result = a + b

TensorFlow会自动将计算转化为计算图上的节点。在TensorFlow程序中,系统会自动维护一个默认的计算图,通过tf.get_default_graph()函数获取当前默认的计算图。

除了默认的计算图,TensorFlow支持通过tf.Graph函数生成新的计算图。不同的计算图上的张量和计算不会共享。

计算图只描述计算过程,不进行计算。

TensorFlow数据模型—张量

在TensorFlow中,所有的数据都是通过张量的形式来表示。在功能角度来看,张量可以被理解为多维数组。其中零阶张量表示表示标量,也及时一个数。一阶张量为向量,即一维数组。n阶张量可以理解为一个n维数组。但是张量在TensorFlow中实现并不直接采用数组的形式,它只是对TensorFlow中运算结果的引用。
在这里插入图片描述
从代码可以看出,TensorFlow计算结果不是一个具体的数字,而是一个张量的结构。其中最主要有三个属性:名字(name),维度(shape)和类型(type)。
张量的第一个属性名字不仅是一个张量的唯一标识符,也给出了这个张量是如何被计算出来的。因为计算图上的每个节点代表了一个计算,计算的结果偶就保存在张量之中,所以张量和计算图上的计算结果是对应的。这样张量的命名就可以通过“node:src_output”的形式来给出。其中node为节点名称,src_output为当前张量来自节点的第几个输出。比如"add:0"表示张量result是计算节点add输出的第一个结果。
第二个属性,表明了张量的维度(shape),如shape=(2,)表示张量result是一个一维数组,长度为2.
第三个属性,类型(type),每个张量会有一个唯一的类型。TensorFlow会对参与运算的所有张量进行检查,张量类型不匹配会报错

对于张量的类型,可以在创建时指定,比如,c = tf.constant([1, 2], name="c",dtype=tf.float32)
不指定,TensorFlow会给出默认的类型,不带小数点会默认为int32,带小数点默认为float32。

TensorFlow支持的14中类型

  • 实数(tf.float32,tf.float64)
  • 整数(tf.int8,tf.int16,tf.int32,tf.int64,tf.uint8)
  • 布尔型(tf.bool)
  • 复数(tf.complex64,tf.complex128)

TensorFlow运算模型—会话

会话拥有并管理TensorFlow程序运行时所有的资源。所有就算完成后需要关闭会话来帮助系统回收资源,否则会出现资源泄漏的问题。TensorFlow有两种模式:

sess = tf.Session()
sess.run()
sess.close()

使用这种模式时,在所有的计算完成后,需要明确调用Session.close()函数来关闭会话并释放资源。然而,当程序因为异常退出时,关闭会话的函数可能就不会被执行从而导致资源泄漏。
为了解决程序因异常退出导致资源释放的问题。TensorFlow可以通过Python的上下文管理器来使用会话。代码如下:

# 创建一个会话,并通过Python中的上下文管理器来管理这个会话
with tf.Session() as sess:
    # 使用创建好的会话来计算结果
    sess.run()
# 当上下文退出时会话关闭和资源释放也自动完成了

这样既避免了因为异常退出时资源释放的问题,同时也解决了忘记调用Session.close()而导致资源泄漏的问题。

前面提到了过tensorflow会生成一个默认的计算图,如果没有特殊指定,运算会自动加入到这个计算图中。同样TensorFlow的会话也有类似的机制。但他不会生成默认的会话,而是需要手动指定。当默认的会话被指定后,可以通过tf.Tensor.eval()函数来计算一个张量的取值,代码如下:

# 引入tensorflow,并取别名为tf
import tensorflow as tf

# 定义张量a,名字为a,内容为[1.0,2.0]的向量
a = tf.constant([1.0, 2.0], name="a")	#1
b = tf.constant([1.0, 2.0], name="b")

result = a + b

sess = tf.Session()
# 将产生的会话注册为默认的会话
with sess.as_default():
    print(result.eval())

结果如下
在这里插入图片描述
可以看出,其本质为矩阵的加法运算。

另一种实现:

# 引入tensorflow,并取别名为tf
import tensorflow as tf

# 定义张量a,名字为a,内容为[1.0,2.0]的向量
a = tf.constant([1.0, 2.0], name="a")	#1
b = tf.constant([1.0, 2.0], name="b")

result = a + b

sess = tf.Session()
# 下面两个代码有相同的功能
print(sess.run(result))
print(result.eval(session=sess))

在这里插入图片描述

使用tf.InteractiveSession在交互式环境直接构建默认会话
import tensorflow as tf
a = tf.constant([1.0, 2.0], name="a")
b = tf.constant([1.0, 2.0], name="b")
result = a + b
sess = tf.InteractiveSession()
print(result.eval())
[2. 4.]
sess.close()

在这里插入图片描述
在这里插入图片描述
通过tf.InteractiveSession()可以省去将产生的会话注册为默认会话的过程。
无论是哪个,都可以通过ConfigProto Protocol Buffer来配置需要生成的会话。

通过ConfigProto配置会话
config = tf.ConfigProto(allow_soft_placement=True,
                        log_device_placement=True)

sess1 = tf.InteractiveSession(config=config)
sess2 = tf.Session()

对于ConfigProto(),他可以配置类似并行的线程数、GPU分配策略、运算超时时间等参数。最常用的参数有两个:allow_soft_placementlog_device_placement

参数默认值含义
allow_soft_placementFalse为True时,表示运算在GPU上执行
log_device_placementFlaseTrue时,日志将会记录每个节点被安排到哪个设备上以方便调试

对于allow_soft_placement,当它为True时,一下三种情况,GPU运算都会放在CPU上运行

  • 运算无法再GPU上运行
  • 没有GPU资源
  • 运算输入包含了对CPU计算结果的引用(就是需要CPU运算的结果)

小结

基于上面的代码情景,画出如下图形:
对于TensorFlow中的张量、计算图和会话。个人看法如下图:
在这里插入图片描述
计算图是我们设计好的算法,张量是存放计算的数据的。但是,此时算法并没有运行起来。
等到计算图定义好了后,再将计算图放在会话中跑起来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值