我是新手,如果这个问题看起来很傻,请原谅我,但我实在是在网上找不到相关信息。我在使用 tf.squared_difference
时,输出的形状与预期不符。我期望得到一个形状为 shape=(100, ?)
的张量作为损失,如下代码片段所示
[print("Logits",logits,"#Labels",labels,"LOSS",tf.squared_difference(labels,logits)) for logits, labels in zip(logits_series,labels_series)]
然而,它产生了形状为 (100,100)
的损失
Logits Tensor(“add_185:0”, shape=(100, 1), dtype=float32) #Labels Tensor(“unstack_29:0”, shape=(100,), dtype=float32) LOSS Tensor(“SquaredDifference_94:0”, shape=(100, 100), dtype=float32) Logits Tensor(“add_186:0”, shape=(100, 1), dtype=float32) #Labels Tensor(“unstack_29:1”, shape=(100,), dtype=float32) LOSS Tensor(“SquaredDifference_95:0”, shape=(100, 100), dtype=float32)
我测试了另一个例子,代码如下,输出的形状符合预期。
myTESTX = tf.placeholder(tf.float32, [100, None])myTESTY = tf.placeholder(tf.float32, [100, 1])print("Test diff X-Y",tf.squared_difference(myTESTX,myTESTY) )print("Test diff Y-X",tf.squared_difference(myTESTY,myTESTX) )
Test diff X-Y Tensor(“SquaredDifference_92:0”, shape=(100, ?), dtype=float32) Test diff Y-X Tensor(“SquaredDifference_93:0”, shape=(100, ?), dtype=float32)
我无法理解为什么这两个代码片段会产生不同的输出形状
回答:
你的第一个例子(使用 logits
和 labels
)与第二个例子(使用 myTESTX
和 myTESTY
)之间存在细微的差异。logits
的形状与 myTESTY
相同,为 (100, 1)
。然而,labels
的形状为 (100,)
(这不是动态形状),而 myTESTX
的形状为 (100, ?)
。
在第一个例子中(logits
和 labels
),输入形状分别为 (100,)
和 (100,1)
,TensorFlow 使用广播。由于两个输入形状都不是动态的,因此你的输出形状是静态的:(100, 100)
,这是由于广播造成的。
在第二个例子中(myTESTX
和 myTESTY
),输入形状分别为 (100, ?)
和 (100, 1)
。第一个输入形状是动态的,因此你的输出形状也是动态的:(100, ?)
。
作为一个更简单的、说明性的例子,在使用相同广播机制的 numpy 中,可以考虑以下代码:
import numpy as npx = np.arange(10) # Shape: (10,)y = np.arange(10).reshape(10,1) # Shape: (10, 1)difference = x-y # Shape: (10, 10)