TensorFlow入门(二) TensorFlow数据模型——张量

xiaoxiao2025-11-12  3

1.2 TensorFlow数据模型——张量

1.2.1 张量的概念

在TensorFlow程序中,所有的数据都通过张量的形式来表示。从功能角度上看,张量可以简单理解为多维数组,其中零阶张量表示为标量(scalar),也就是一个数(张量的类型也可以是字符串);第一阶张量为向量(vector),也就是一个一维数组;第n阶张量可以理解为一个n维数组。但张量在TensorFlow中的实现并不是直接采用数组的形式,它只是对TensorFlow中运算结果的引用。在张量中并没有真正保存数字,它保存的是如何得到这些数字的计算过程。还是以向量加法为例,当运行如下代码时,并不会得到加法的结果,而会得到对结果的一个引用。

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

从上面的代码可以看出TensorFlow中的张量和NumPy中的数组不同,TensorFlow计算的结果不是一个具体的数字,而是一个张量的结构。从上面的代码的运行结果可以看出,一个张量中主要保存了三个属性:名字(name),维度(shape)和类型(type)。

张量的第一个属性名字不仅是一个张量的唯一标识符,它同样也给出了这个张量是如何计算出来的。TensorFlow的计算都可以通过计算图的模型来建立,而计算图上的每一个节点代表了一个计算,计算结果就保存在张量之中。所以张量和计算图上节点所代表的计算结果是对应的。这样张量的命名就可以通过“node:src_output”的形式来给出。其中node为节点的名称,src_output表示当前张量来自节点的第几个输出。比如上面代码打出来的“add:0”就说明了result这个张量是计算节点“add”输出的第一个结果(编号从0开始)。

张量的第二个属性是张量的维度(shape)。这个属性描述了一个张量的维度信息。比如上面样例中shape=(2,)说明了张量result是一个一维数组,这个数组的长度为2。维度是张量一个很重要的属性,围绕张量的维度TensorFlow也给出很多有用的运算。 张量的第三个属性是类型(type),每一个张量会有一个唯一的类型。TensorFlow会对参与运算的所有张量进行类型的检查,当发现类型不匹配时会报错。比如运行下面这段程序就会得到类型不匹配的错误:

import tensorflow as tf a = tf.constant([1, 2], name="a") b = tf.constant([2.0, 3.0], name="b") result = a + b

这段程序和上面的样例基本一模一样,唯一不同的是把其中一个加数的小数点去掉了。这会使得加数a的类型为整数而加数b的类型为实数,这样程序会报类型不匹配的错误:

ValueError: Tensor conversion requested dtype int32 for Tensor with dtype float32: 'Tensor("b:0", shape=(2,), dtype=float32)

如果将一个加数指定成实数类型“a = tf.constant([1, 2], name="a", dtype=tf.float32)”,那么两个加数的类型相同就不会报错了。如果不指定类型,TensorFlow会给出默认的类型,比如不带小数点的类型会被默认为int32,带小数的会默认为float32。因为使用默认类型有可能会导致潜在的类型不匹配问题,所以一般建议通过指定dtype来明确指出变量或者常量的类型。TensorFlow支持14种不同的类型,主要包括了实数(tf.float32、tf.float64)、整数(tf.int8、tf.int16、tf.int32、tf.int64、tf.uint8)、布尔型(tf.bool)和复数(tf.complex64、tf.complex128)。

1.2.2 张量的使用

和TensorFlow的计算模型相比,TensorFlow的数据模型相对比较简单。张量使用主要可以总结为两大类。

第一类用途是对中间结果的引用。当一个计算包含很多中间结果时,使用张量可以大大提高代码的可读性。以下为使用张量和不使用张量记录中间结果来完成向量加法的功能的代码对比。

# 使用张量记录中间结果 a = tf.constant([1.0, 2.0], name="a") b = tf.constant([2.0, 3.0], name="b") result = a + b # 直接计算向量的和,这样可读性会较差 result = tf.constant([1.0, 2.0], name="a") +           tf.constant([2.0, 3.0], name="b")

从上面的样例程序可以看到a和b其实就是对常量生成这个运算结果的引用,这样在做加法时(比如在构建深层神经网络时)通过张量来引用计算的中间结果可以使代码的可阅读性大大提升。同样通过张量来存储中间结果,这样可以方便获取中间结果。比如在卷积神经网络中,卷积层或者池化层有可能改变张量的维度,通过result.get_shape函数来获取结果张量的维度信息可以免去人工计算的麻烦。

使用张量的第二类情况是当计算图构造完成之后,张量可以用来获得计算结果,也就是得到真实的数字。虽然张量本身没有存储具体的数字,但是通过会话(session),就可以得到这些具体的数字。比如在上述代码中,可以使用 tf.Session().run(result) 语句来得到计算结果。

转载请注明原文地址: https://www.6miu.com/read-5039511.html

最新回复(0)