我刚开始使用 tensorflow ,当涉及到张量的等级以及它们如何相互作用时,我遇到了一个巨大的问题。
我有以下代码:
w = tf.Variable(tf.constant([0.2,0.6]))
x = tf.placeholder(tf.float32)
y = w * x
如您所见,这是一个非常简单的设置。
但是,当我执行print w
时输出是Tensor("Variable_13/read:0", shape=(2,), dtype=float32)
.
shape(2,)
是什么意思?逗号表示什么?
此外,这是sess = tf.Session()
之后的其他痛点并初始化变量:
print(sess.run(y,{x:[1,2]}))
[0.2 1.20000005]
print(sess.run(y,{x:[1]}))
[ 0.2 0.60000002]
print(sess.run(y,{x:[[1],[2]]}))
[[ 0.2 0.60000002]
[0.40000001 1.20000005]]
为什么我会出现如此多样化的行为? tensorflow 如何确定单个数据点?我现在意识到,在声明占位符时指定形状可能比让自己陷入这样的困境要好。
我理解类里面教授的最后两个案例,但我无法解释第一个案例的行为。
最佳答案
你的第一个问题很简单。 shape=(2,)
指w
的尺寸。在 numpy
,形状始终由整数元组表示,如下所示:
>>> x = np.random.randn(50)
>>> x.shape
(50,)
这是一个一维数组,shape
中只指定了一个整数。现在,...
>>> x = np.random.randn(50, 50)
>>> x.shape
(50, 50)
这是一个二维数组。如您所见,shape
指定 x
的大小沿着 2 个维度。
回答你的第二个问题,x
是一个占位符,这意味着它可以占用您赋予它的任何值。这正是以下几行的作用:{x:[1,2]}
, {x:[1]}
和{x:[[1],[2]]}
在第一种情况下,x 被分配一个包含 2 个元素的一维数组 [1, 2]
。在第二种情况下,具有 1 个元素的一维数组 [1]
等等。
现在,操作w * x
上面指定 w
应乘以 x
。所以,当做sess.run(y,{x:[1,2]})
时, w
乘以x
以及传递给它的值。您看到的输出会根据您传递给 x
的值而变化。 .
在第一种情况下,[0.2, 0.6] * [1, 2]
只需将每个元素与其相应的索引相乘,结果为 [0.2 * 1, 0.6 * 2]
.
第二个案例做了类似的事情。
在第三种情况中,x 的尺寸为 (2, 1)。所以每行 x
依次乘以w
要获得单独的行,请给出 [[ 0.2, 0.60000002], [ 0.40000001, 1.20000005]]
作为你的输出。
关于python - 理解张量的秩和行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44722500/