在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
如名称所示,TensorFlow是定义和运行涉及张量(Tensor)的计算框架。一个张量是将向量和矩阵推广到潜在更高的维度。在内部,TensorFlow将张量表示为n维基本数据类型的数组。 当编写一个TensorFlow程序时,你操作和传递的主要对象是 一个
张量中的每个元素具有相同的数据类型,并且数据类型总是已知的。形状(即它具有的维数和每个维度的大小)可能只是部分已知的。大多数操作都会产生完全已知形状的张量,如果它们的输入形状也是完全已知的,但在某些情况下,只能在图形执行时得到张量的形状。 某些类型的张量是特殊的,这些将在程序员指南的其他单元中介绍。主要的是:
除了 秩(rank)秩是一个
Rank 0以下片段演示了创建几个Rank 0变量:
注意:一个字符串在TensorFlow中被视为单个项目,而不是字符序列。所以有标量字符串、字符串向量
Rank 1创建一个Rank 1
更高的RankRank 2
Higher-rank张量同样由n-dimensional数组组成。例如,在图像处理过程中,使用许多Rank为4的张量,尺寸分别对应于example-in-batch,图像宽度,图像高度和颜色通道。
得到一个
|
秩 | 形状 | 维数 | 例子 |
---|---|---|---|
0 | [] | 0-d | 一个0-D张量。一个标量。 |
1 | [D0] | 1-d | 具有形状[5]的一维张量。 |
2 | [D0,D1] | 2-d | 一个形状[3,4]二维张量。 |
3 | [D0,D1,D2] | 3-d | 一个形状[1,4,3]的三维张量。 |
ñ | [D0,D1,… Dn-1] | n-D | 形状为[D0,D1,… Dn-1]的张量。 |
形状可以通过Python列表/元组的int或者tf.TensorShape
来表示。
tf.Tensor
对象的形状有两种方法可以访问tf.Tensor
的形状。在建立图形的时候,了解已知的张量形状常常是有用的。这可以通过读取tf.Tensor
对象的shape
属性。这个方法返回一个TensorShape
对象,这是表示partially-specified(部分指定)形状的一种方便的方法(因为在构建图形时,并不是所有的形状都是完全已知的)。
在运行时,也有可能得到一个tf.Tensor
这将代表另一个的完全已知形状的tf.Tensor
,通过调用tf.shape
操作。这样,您就可以构建一个图,通过构建其他张量来处理张量的形状,这些张量依赖于输入的动态形状tf.Tensor
。
例如,制作与给定矩阵中的列数相同大小的零向量:
zeros = tf.zeros(tf.shape(my_matrix)[1])
tf.Tensor
的形状张量元素的数量是所有形状大小的乘积。标量的元素数总是一样的1
。由于经常有许多不同的形状具有相同数量的元素,所以通常能够方便地改变tf.Tensor
形状,但是保持元素不变。这可以用tf.reshape
来完成。
以下示例演示如何重构(reshape)张量:
rank_three_tensor = tf.ones([3, 4, 5])
matrix = tf.reshape(rank_three_tensor, [6, 10]) # Reshape existing content into
# a 6x10 matrix
matrixB = tf.reshape(matrix, [3, -1]) # Reshape existing content into a 3x20
# matrix. -1 tells reshape to calculate
# the size of this dimension.
matrixAlt = tf.reshape(matrixB, [4, 3, -1]) # Reshape existing content into a
#4x3x5 tensor
# Note that the number of elements of the reshaped Tensors has to match the
# original number of elements. Therefore, the following example generates an
# error because no possible value for the last dimension will match the number
# of elements.
yet_another = tf.reshape(matrixAlt, [13, 2, -1]) # ERROR!
除了维度,张量有一个数据类型。
tf.Tensor
不能有多个数据类型。但是,可以将任意数据结构序列化为string
并存储在tf.Tensor
。
可以使用tf.cast
将tf.Tensor
从一个数据类型强制转为到另一个:
# Cast a constant integer tensor into floating point.
float_tensor = tf.cast(tf.constant([1, 2, 3]), dtype=tf.float32)
要查看tf.Tensor
的数据类型,使用Tensor.dtype
属性。
当从一个python对象创建一个tf.Tensor
,你可以选择指定数据类型。如果你不这样做,TensorFlow会选择一个可以表示数据的数据类型。 TensorFlow将Python整数转换为tf.int32
,将python浮点数字转为tf.float32
。否则,TensorFlow在转换为数组时使用与numpy相同的规则。
一旦计算图已经建立,你可以运行计算产生一个特定的tf.Tensor
并获取分配给它的值。这对于调试以及大部分TensorFlow工作都是非常有用的。
张量取值的最简单的方法是使用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() # This will fail, since the placeholder did not get a value.
t.eval(feed_dict={p:2.0}) # This will succeed because we're feeding a value
# to the placeholder.
其他模型的构造可能会导致tf.Tensor
的求值变复杂。 TensorFlow无法直接评估在内部函数或内部控制流构造中定义的tf.Tensor
。如果一个tf.Tensor
依赖队列中的值,只在有东西入队才能工作评估tf.Tensor
;否则,评估会挂起。在处理队列时,在评估tf.Tensor
之前,要调用tf.train.start_queue_runners
。
出于调试的目的,你可能想打印一个tf.Tensor
的值。tfdbg提供高级的调试支持,TensorFlow也有一个操作可以直接打印tf.Tensor
的值。
请注意,打印tf.Tensor
时很少使用以下模式:
t = <<some tensorflow operation>>
print t # This will print the symbolic tensor when the graph is being built.
# This tensor does not have a value in this context.
此代码打印tf.Tensor
对象(表示延迟计算)而不是它的值。相反,TensorFlow提供了tf.Print
操作,它返回其第一个tf.Tensor
参数,并打印第二个tf.Tensor
集合参数。
要正确使用tf.Print
,它的返回值必须被使用。看下面的例子
t = <<some tensorflow operation>>
tf.Print(t, [t]) # This does nothing
t = tf.Print(t, [t]) # Here we are using the value returned by tf.Print
result = t + 1 # Now when result is evaluated the value of `t` will be printed.
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13