Chinaunix首页 | 论坛 | 博客
  • 博客访问: 122735
  • 博文数量: 165
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1655
  • 用 户 组: 普通用户
  • 注册时间: 2022-09-26 14:37
文章分类

全部博文(165)

文章存档

2024年(2)

2023年(95)

2022年(68)

我的朋友

分类: 高性能计算

2022-11-18 11:00:55

TensorFlow计算图是由op和tensor组成,那么tensor一般都用来代表什么呢?显然,像模型的输入数据、网络权重、输入数据经op处理后的输出结果都需要用张量或特殊张量进行表达。既然tensor在TensorFlow体系架构中如此重要,因此本文将带领大家由浅入深地学习tensor的三个话题:用户眼中的tensor、TensorFlow系统中的tensor、tensor高阶用法DLPack(跨框架编程,如:TensorFlow+PyTorch)。

注:本文基于TensorFlow v1.15.5进行编写。

一、小白眼中的Tensor

1.1 Tensor HelloWorld

定义两个张量,然后对其求加法,相关代码如下:

# segment 1 a = tf.constant(3.0, dtype=tf.float32) b = tf.constant(4.0) # also tf.float32 implicitly total = a + b print(a) print(b) print(total) ### 三个print的输出如下: """
Tensor("Const:0", shape=(), dtype=float32)
Tensor("Const_1:0", shape=(), dtype=float32)
Tensor("add:0", shape=(), dtype=float32)
""" # 说明:此时的Tenosr尚不能产生真正的结果。以上代码创建了计算图,Tensor只是代表op运行的结果(但此时op未运行)。

如果想看到{BANNED}最佳终total的计算结果,则应该创建Session对象并运行计算图,具体代码如下(在segment1基础上增加代码):

with tf.Session() as sess:
    result = sess.run(total)
    print(result, type(result), type(total))
# 输出结果= 7.0  

由此可见,Tensor代表尚未执行的结果表示,创建Session对象并运行计算图可得total结果7.0,并且结果的数据类型已变为numpy。{BANNED}最佳后说明一下,本小节代码输出的Tensor是指tf.Tensor,对应的代码实现是tensorflow.python.framework.ops.Tensor

1.2 张量属性及特殊张量

从用户视角看tf.Tensor主要有三个属性:name、dtype、shape。除此之外,还有三个属性比较重要(不常用或者不直接可见):op、graph、device。其中op属性记录产生此Tensor的操作名称,graph属性记录包含此Tensor的计算图,device属性记录产生此Tensor的设备名称。

在TensorFlow体系中有四种特殊的张量(此处暂不严格区分Tensor与产生此Tensor的op),具体如下:

?tf.Variable: 定义内容可变的张量,一般用来定义模型权重。
?tf.constant: 一般来说,张量内容不可变,此API可用来定义常规张量。
?tf.placeholder: 占位符张量,用于描述静态图输入规格。静态图采用先编译后执行的方式,因此在定义计算图时要知道输入规格。
?tf.SparseTensor: 为稀疏数据定制的张量结构。

1.3 Tensor与op的关系

我们多次提到,Tensor可以作为op的输入,经op一系列处理后产生新的Tensor作为输出。为了深入理解这一点,我们回头重新审视segment1中的代码片段(请大家注意Tensor的命名):

阅读(294) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~