TensorFlow中的张量

图片


Tensorflow中操纵的主要对象是张量。 张量是什么,张量是什么,它们具有什么属性以及如何操作它们,请阅读tensorflow.org的翻译指南。


顾名思义,TensorFlow是一个使用张量定义和执行计算的平台。 张量是向量和矩阵到更高维度的一般化。 在TensorFlow内部,张量表示为基本数据类型的n维数组。


在编写TensorFlow程序时,您操纵和传递的主要对象是tf.Tensor 。 TensorFlow程序通过首先创建tf.Tensor对象的图并详细描述如何基于其他可用张量来计算每个张量,然后运行该图的部分以获得计算结果来工作。


tf.Tensor具有以下选项:


  • 数据类型(例如float32int32string
  • 尺寸(形状)

所有张量元素都具有相同的数据类型,并且始终是已知的。 尺寸(度量的数量和每个度量的大小)只能是部分已知的。 如果输入的尺寸也完全已知,则大多数操作的结果是张量具有已知的尺寸,但是在某些情况下,仅在执行图形时才可能找到张量的尺寸。


张量的主要类型如下:


  • tf.Variable
  • tf.constant
  • tf.placeholder
  • tf.SparseTensor

除了tf.Variable ,张量值保持不变,即 在一次执行的上下文中,张量只能具有一个值。 但是,两次计算相同的张量会返回不同的值。 例如,相同的张量可能是从磁盘读取数据或生成随机数的结果。


等级


tf.Tensor对象的等级是其维数。 等级的同义词是顺序程度维度 。 请注意,TensorFlow中的等级与数学中的矩阵等级不同。 如下表所示,Tensorflow中的每个等级对应于一些数学实体:


等级数学实体
0标量(仅值)
1个向量(大小和方向)
2矩阵(数字表)
33张量(数字的立方)
ñn张量(嗯,你明白了)

等级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]) #   x  x  x    

获取tf.Tensor对象tf.Tensor


要确定tf.Tensor对象的等级,请调用tf.rank方法。 例如,以下方法以编程方式确定上面指定的tf.Tensor的等级:


 r = tf.rank(my_image) #   , r   4. 

链接到切片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文档使用三种约定来描述张量的维数:等级,维数和维数。 下表显示了它们之间的相互关系:


等级尺寸图测量次数例子
0[]0维0-D张量。 标量。
1个[D0]一维一维尺寸张量[5]。
2[D0,D1]2维二维尺寸张量[3,4]。
3[D0,D1,D2]3维3-D尺寸张量[1、4、3]。
ñ[D0,D1,... Dn-1]D大小张量[D0,D1,... Dn-1]。

大小可以表示为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]) #    #   6x10 matrixB = tf.reshape(matrix, [3, -1]) #     #  3x20. -1  reshape   #    . matrixAlt = tf.reshape(matrixB, [4, 3, -1]) #     #  4x3x5 # ,         #   .     #         #     . yet_another = tf.reshape(matrixAlt, [13, 2, -1]) # ERROR! 

资料类型


除维数外,张量还具有数据类型。 特定的tf.Tensor不能具有多个数据类型。 但是,可以将任意数据结构序列化为string并将其存储在tf.Tensor


您可以使用tf.casttf.Tensor从一种数据类型转换为另一种:


 #         . float_tensor = tf.cast(tf.constant([1, 2, 3]), dtype=tf.float32) 

要查看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.SessionTensor.eval返回一个numpy数组,其内容与张量相同。


有时无法在没有上下文的情况下评估tf.Tensor ,因为其值可能取决于不可用的动态信息。 例如,如果不提供placeholder的值,则无法评估依赖于placeholder张量。


 p = tf.placeholder(tf.float32) t = p + 1.0 t.eval() #   ,   placeholder   . t.eval(feed_dict={p:2.0}) #  ,     #   placeholder. 

请注意,您可以使用任何tf.Tensor ,而不仅仅是占位符。


其他模型设计可能会使tf.Tensor更加难以评估。 TensorFlow无法直接评估在函数内部或控制流构造内定义的tf.Tensor 。 如果tf.Tensor取决于队列中的值,则tf.Tensor得分仅在队列中放置了某些内容时才起作用; 否则,张量估计将冻结。 使用队列时,请记住在评估任何tf.Tensor之前先调用tf.Tensor


经过验证后,翻译也将出现在Tensorflow.org上。 如果您想参与将Tensorflow.org网站的文档翻译成俄语,请以个人身份或评论联系。 任何更正或评论表示赞赏。

Source: https://habr.com/ru/post/zh-CN484214/


All Articles