我对 TensorFlow 的等级和形状概念感到困惑。我已阅读 here 的详细信息并确实运行了一些代码来清除我对它们的概念。但我仍然很困惑,需要帮助才能理解。
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
就像一个二维矩阵,其中 2
是 number of rows
而 12
是 列数
。那么为什么我将 x[120, :]
的形状设置为 (12, )
?对于给定的形状,x[120, :]
怎么可能?
此外,因为我认为 x 是一个二维张量,所以它的秩也是 2,因为维度和秩对于张量来说是一回事(根据我的理解)。但是当我运行时:
print(x[0].get_shape())
我收到这个错误:
Shape (2, 12) must have rank 1
说明我对rank和dimension的理解有误。关于排名和维度,我缺少什么?等级和维度是两个不同的东西吗?上例中tensor x
的rank如何为1?如何设置张量的等级?谁能用一些全面的例子详细解释一下?
最佳答案
我找到了 link你提供的很清楚。
张量的秩是它具有的维数
- 矩阵有 2 个维度,所以它的秩为 2
- 彩色图像有 3 个维度
[height, width, 3]
所以它的等级是 3
张量的形状是每个维度中分量的详细数量
- 矩阵有 2 个维度,秩为 2,形状可以像
[6, 10]
,其中6
是行数,10
列数 - 200x200 的彩色图像(排名 3)的形状为
[200, 200, 3]
对于您的示例,x[120, :]
是可以编写的,因为 TensorFlow 尚未检查 120
是否为有效索引。当您创建 session 并运行代码时,您会发现一个错误:
res = x[120, :]
with tf.Session():
sess.run(res, feed_dict={x: np.zeros((2, 12))})
InvalidArgumentError: slice index 120 of dimension 0 out of bounds.
正如我在评论中所说,x[0]
应该与最新版本的 TensorFlow 一起使用,它应该给出形状为 (12,)
的张量,并且排名1.
关于python - 关于 TensorFlow 中等级和形状的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40859416/