我开始使用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]]
为什么我会遇到各种各样的行为?张量流如何确定单个数据点?我现在意识到在声明占位符时指定形状可能比让自己像这样陷入困境更好 我理解最后两个案例,因为他们是在课堂上讲授的,但我无法解释第一个案例的行为。
答案 0 :(得分:2)
你的第一个问题很简单。 shape=(2,)
是指w
的维度。在numpy
中,形状总是由整数元组表示,如下所示:
>>> x = np.random.randn(50)
>>> x.shape
(50,)
这是一维数组,shape
中只指定了一个整数。现在,...
>>> x = np.random.randn(50, 50)
>>> x.shape
(50, 50)
这是一个2D数组。如您所见,shape
指定了2个维度x
的大小。
要回答第二个问题,x
是占位符,这意味着它可以占用您提供的任何价值。这正是以下几行:{x:[1,2]}
,{x:[1]}
和{x:[[1],[2]]}
在第一种情况下,x被分配一个包含2个元素{1}的1D数组。在第二种情况下,1D数组包含1个元素[1, 2]
,依此类推。
现在,上面的操作[1]
指定w * x
应与w
相乘。因此,在执行x
时,sess.run(y,{x:[1,2]})
会将w
乘以传递给它的值。您看到的输出会根据您传递给x
的值而变化。
在第一种情况下,x
只是将每个元素与其对应的索引相乘,结果为[0.2, 0.6] * [1, 2]
。
第二种情况类似。
在第三种情况下,我们有x维度(2,1)。因此,[0.2 * 1, 0.6 * 2]
的每一行又与x
相乘以获得单独的行,并将w
作为输出。
答案 1 :(得分:0)
shape(2,)
表示张量的形状。特别是,最后的逗号表示张量是元组。
你可以检查这个只是运行:
type((2))
返回int
,而
type((2,))
返回tuple
。
您刚刚发现广播。
简而言之,在第一种情况下,您将单独乘以2个输入张量的每个元素。
在第二种情况下,您需要将张量乘以标量。
在第三种情况下,您需要为w
的每个元素乘以x
的每个元素。这是因为x的形状为(something, 1)
。最后一个维度中的1
"触发"一个扩展规则,使操作以这种方式运行。
为了更好地理解,您应该阅读这里的兄弟会规则:https://docs.scipy.org/doc/numpy-1.12.0/user/basics.broadcasting.html#general-broadcasting-rules