TensorFlow中关于Rank和Shape的混淆

5
我对TensorFlow的等级和形状概念感到困惑。我已经从这里阅读了详细信息,并运行了一些代码来澄清我的概念。但是,我仍然很困惑,需要帮助理解。
x = tf.placeholder(tf.float32, shape=[2, 12])
print(x.get_shape()) # ==> (2, 12)
print(x[0, :].get_shape())  # ==> (12,)
print(x[1, :].get_shape())  # ==> (12,)
print(x[2, :].get_shape())  # ==> (12,)
print(x[120, :].get_shape())  # ==> (12,)

我认为x就像一个2D矩阵,其中2行数12列数。那么为什么我使用x[120,:]得到的形状是(12,)?根据给定的形状,如何得到x[120,:]
此外,由于我认为x是一个2D张量,因为对于张量来说,维度和秩是相同的(根据我的理解)。但是当我运行以下代码时:
print(x[0].get_shape())

I am getting this error:

Shape (2, 12) must have rank 1

这意味着我对排名和维度的理解有误。我错过了什么关于排名和维度的知识?排名和维度是两个不同的概念吗?为什么上面例子中张量x的排名是1?我如何设置一个张量的排名?能否用详细的例子来解释一下?


x[0] 应该能够在最新版本的tensorflow中正常工作,尝试更新tensorflow。 - Olivier Moindrot
2个回答

6
我发现您提供的链接非常清晰。
张量的秩是它具有的维度数量
  • 矩阵有2个维度,因此其秩为2
  • 彩色图像具有3个维度[高度,宽度,3],因此其秩为3
张量的形状是每个维度中组件的详细数量。
  • 矩阵有2个维度,秩为2,并且可以具有类似[6, 10]的形状,其中6是行数,10是列数
  • 一个200x200的彩色图像(秩为3)将具有形状[200, 200, 3]

对于您的示例,x[120, :] 是可以编写的,因为 TensorFlow 尚未检查 120 是否是有效索引。当您创建会话并运行代码时,将会出现错误:
res = x[120, :]

with tf.Session():
    sess.run(res, feed_dict={x: np.zeros((2, 12))})

无效参数错误:切片索引120超出了维度0的范围。


如我在评论中所说,x[0] 应该能够在最新版本的 TensorFlow 中使用,并且它应该会给出一个形状为 (12,),秩为 1 的张量。


在版本0.10中,我认为您只能为秩为1的张量编写x [0]。如果您想要获取矩阵的第一行,则必须指定x [0,:],因此您会收到错误。这在v0.11中已得到修复。 - Olivier Moindrot
1
所以,当你执行 x[0] 时,TensorFlow 希望 x 的秩为 1。在你的情况下,x 是一个形状为 (2, 12) 且秩为 2 的矩阵,因此 TensorFlow 报错 Shape (2, 12) must have rank 1。显然,形状 (2, 12) 永远不可能具有秩 1,因此该消息的含义是“您的张量形状为(2, 12),但是我们在这里想要秩为1”。 - Olivier Moindrot
1
排名与维度相同(实际上,排名为2的矩阵将被称为二维)。形状将为每个维度赋一个值,因此形状的长度就是排名。 - Olivier Moindrot
为什么x[0]的形状是(12,),它的秩为1?(12)不是传达相同信息吗? - Drux
在Python中,(12)12相同。形状始终是元组,因此如果它只有一个元素,则需要编写(12,) - Olivier Moindrot
显示剩余3条评论

0
经过一些分析,我发现在声明张量时使用的方括号数目表示张量的秩。形状中的值的数量等于秩。例如:
a1=tf.constant(
[   
    [
        [1,2,3,4,5],
        [1,2,3,4,5],
        [1,2,3,4,5],
        [1,2,3,4,5]
    ]
]
)

这里,我使用了3个方括号。因此,秩为3。由于秩为3,形状将以格式(x,y,z)呈现。

现在,x、y和z的值:

x=第一个方括号中逗号的数量加1,所以x=0+1=1

同样地, y=3+1=4

z=4+1=5

最后,秩为3,形状为(1,4,5)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接