
Tensorflow中操纵的主要对象是张量。 张量是什么,张量是什么,它们具有什么属性以及如何操作它们,请阅读tensorflow.org的翻译指南。
顾名思义,TensorFlow是一个使用张量定义和执行计算的平台。 张量是向量和矩阵到更高维度的一般化。 在TensorFlow内部,张量表示为基本数据类型的n维数组。
在编写TensorFlow程序时,您操纵和传递的主要对象是tf.Tensor
。 TensorFlow程序通过首先创建tf.Tensor
对象的图并详细描述如何基于其他可用张量来计算每个张量,然后运行该图的部分以获得计算结果来工作。
tf.Tensor
具有以下选项:
- 数据类型(例如
float32
, int32
或string
) - 尺寸(形状)
所有张量元素都具有相同的数据类型,并且始终是已知的。 尺寸(度量的数量和每个度量的大小)只能是部分已知的。 如果输入的尺寸也完全已知,则大多数操作的结果是张量具有已知的尺寸,但是在某些情况下,仅在执行图形时才可能找到张量的尺寸。
张量的主要类型如下:
tf.Variable
tf.constant
tf.placeholder
tf.SparseTensor
除了tf.Variable
,张量值保持不变,即 在一次执行的上下文中,张量只能具有一个值。 但是,两次计算相同的张量会返回不同的值。 例如,相同的张量可能是从磁盘读取数据或生成随机数的结果。
等级
tf.Tensor
对象的等级是其维数。 等级的同义词是顺序 , 程度 , 维度 。 请注意,TensorFlow中的等级与数学中的矩阵等级不同。 如下表所示,Tensorflow中的每个等级对应于一些数学实体:
等级0
以下代码段演示了排名为0的几个变量的创建:
mammal = tf.Variable("Elephant", tf.string) ignition = tf.Variable(451, tf.int16) floating = tf.Variable(3.14159265359, tf.float64) its_complicated = tf.Variable(12.3 - 4.85j, tf.complex64)
注意:字符串在TensorFlow中被视为单个对象,而不是字符序列。 可能有字符串标量,行向量等。
等级1
要创建等级1的tf.Tensor
对象,可以传递元素列表作为初始值。 例如:
mystr = tf.Variable(["Hello"], tf.string) cool_numbers = tf.Variable([3.14159, 2.71828], tf.float32) first_primes = tf.Variable([2, 3, 5, 7, 11], tf.int32) its_very_complicated = tf.Variable([12.3 - 4.85j, 7.5 - 6.23j], tf.complex64)
更高等级
tf.Tensor
对象的等级2至少由一行和一列组成:
mymat = tf.Variable([[7],[11]], tf.int16) myxor = tf.Variable([[False, True],[True, False]], tf.bool) linear_squares = tf.Variable([[4], [9], [16], [25]], tf.int32) squarish_squares = tf.Variable([ [4, 9], [16, 25] ], tf.int32) rank_of_squares = tf.rank(squarish_squares) mymatC = tf.Variable([[7],[11]], tf.int32)
同样,较高等级的张量由n维数组组成。 例如,当处理图像时,使用许多4级张量,其尺寸对应于数据包中的示例编号,图像高度,图像宽度和颜色通道。
my_image = tf.zeros([10, 299, 299, 3])
获取tf.Tensor
对象tf.Tensor
要确定tf.Tensor
对象的等级,请调用tf.rank
方法。 例如,以下方法以编程方式确定上面指定的tf.Tensor
的等级:
r = tf.rank(my_image)
链接到切片tf.Tensor
由于tf.Tensor
是单元的n维数组,因此要访问tf.Tensor
的单个单元,您需要指定n个索引。
对于等级0的张量(标量),不需要索引,因为这已经是一个数字。
对于秩为1的张量(向量),传递单个索引将使您能够访问该数字:
my_scalar = my_vector[2]
请注意,如果要从向量中动态选择元素,则传递给[]
的索引本身可以是tf.Tensor
标量。
对于2级或更高的张量,情况更加有趣。 对于tf.Tensor
等级2,传递两个数字将按标量预期返回:
my_scalar = my_matrix[1, 2]
但是,传递单个数字将返回矩阵的子向量,如下所示:
my_row_vector = my_matrix[2] my_column_vector = my_matrix[:, 3]
表示法:
在语法中,python中的子数组分配被用作“单独保留此维度”。 这在高级张量中很有用,因为它允许访问子矢量,子矩阵甚至其他子张量。
尺寸图
张量维度是每个维度中元素的数量。 TensorFlow文档使用三种约定来描述张量的维数:等级,维数和维数。 下表显示了它们之间的相互关系:
大小可以表示为Python列表/整数元组,也可以使用
tf.TensorShape
。
获取tf.Tensor
对象的大小
有两种获取tf.Tensor
尺寸的方法。 构造图形时,询问有关张量大小的已知信息通常很有用。 这可以通过读取tf.Tensor
对象的shape
属性来完成。 此方法返回一个TensorShape
对象,这是一种方便的方法。
部分定义的大小的表示形式(由于在构造图形时,并非所有大小都可以完全知道)。
您还可以获得tf.Tensor
,它表示运行时另一个tf.Tensor
的完全定义的尺寸。 这是通过tf.shape
操作来完成的。 这样,您可以构建一个图来通过根据输入tf.Tensor
的动态大小构建其他张量来操纵张量的大小。
例如,您可以使零向量的大小与给定矩阵的列数相同:
zeros = tf.zeros(my_matrix.shape[1])
调整tf.Tensor
大小
张量元素的数量是所有测量值的乘积。 标量元素的数量始终为1
。 由于许多不同的大小可以提供相同数量的元素,因此调整tf.Tensor
大小通常很方便,而无需更改其元素。 这可以使用tf.reshape
完成。
以下示例显示如何调整张量的大小:
rank_three_tensor = tf.ones([3, 4, 5]) matrix = tf.reshape(rank_three_tensor, [6, 10])
资料类型
除维数外,张量还具有数据类型。 特定的tf.Tensor
不能具有多个数据类型。 但是,可以将任意数据结构序列化为string
并将其存储在tf.Tensor
。
您可以使用tf.cast
将tf.Tensor
从一种数据类型转换为另一种:
要查看tf.Tensor
数据类型,请使用Tensor.dtype
属性。
从python对象创建tf.Tensor
,可以选择指定数据类型。 如果您不这样做,TensorFlow将选择可以代表您的数据的数据类型。 TensorFlow将Python整数转换为tf.int32
,并将浮点数转换为tf.float32
。 在其他情况下,TensorFlow在转换数组时使用与numpy相同的规则。
张量评估
建立计算图后,您可以运行计算
将生成一个特定的tf.Tensor
并提取分配给它的值。 这对于调试以及大多数TensorFlow的工作通常很有用。
评估Tensor的最简单方法是使用Tensor.eval
方法。 例如:
constant = tf.constant([1, 2, 3]) tensor = constant * constant print(tensor.eval())
eval
方法仅在默认的tf.Session
。 Tensor.eval
返回一个numpy数组,其内容与张量相同。
有时无法在没有上下文的情况下评估tf.Tensor
,因为其值可能取决于不可用的动态信息。 例如,如果不提供placeholder
的值,则无法评估依赖于placeholder
张量。
p = tf.placeholder(tf.float32) t = p + 1.0 t.eval()
请注意,您可以使用任何tf.Tensor
,而不仅仅是占位符。
其他模型设计可能会使tf.Tensor
更加难以评估。 TensorFlow无法直接评估在函数内部或控制流构造内定义的tf.Tensor
。 如果tf.Tensor
取决于队列中的值,则tf.Tensor
得分仅在队列中放置了某些内容时才起作用; 否则,张量估计将冻结。 使用队列时,请记住在评估任何tf.Tensor
之前先调用tf.Tensor
。
经过验证后,翻译也将出现在Tensorflow.org上。 如果您想参与将Tensorflow.org网站的文档翻译成俄语,请以个人身份或评论联系。 任何更正或评论表示赞赏。