1

我从 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 如何确定单个数据点?我现在意识到,在声明占位符的同时指定形状可能比让自己陷入困境要好。
我理解最后两个案例,因为它们是在课堂上教授的,但我无法解释第一个案例的行为。

4

2 回答 2

2

你的第一个问题很简单。shape=(2,)指的是 的尺寸w。在numpy中,shape 始终由整数元组表示,如下所示:

>>> 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].

第二种情况做类似的事情。

在第三种情况下,我们有尺寸为 (2, 1) 的 x。所以每一行x依次乘以w得到一个单独的行,[[ 0.2, 0.60000002], [ 0.40000001, 1.20000005]]作为你的输出。

于 2017-06-23T13:31:20.447 回答
0

第一个问题

shape(2,)表示张量的形状。特别是,末尾的逗号表示张量是元组。

您可以简单地运行检查:

type((2))

返回int,而

type((2,))

返回tuple

第二个问题

你刚刚发现了广播

简而言之,在第一种情况下,您将 2 个输入张量的每个元素单独相乘。

在第二种情况下,您将张量乘以一个标量。

相反,在第三种情况下,您将 的每个元素与w的每个元素相乘x。这是因为 x 具有 shape (something, 1)。在1最后一个维度中“触发”了一个广播规则,该规则使操作以这种方式运行。

您应该阅读此处的广播规则以更好地理解:https ://docs.scipy.org/doc/numpy-1.12.0/user/basics.broadcasting.html#general-broadcasting-rules

于 2017-06-23T13:43:43.753 回答