新手在这里,我很抱歉,如果这个问题很愚蠢,但我无法在网上找到任何相关信息。我为tf.squared_difference
的输出获得了意想不到的形状。我希望获得具有shape=(100, ?)
形状的Tensor作为以下代码段的损失
[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) )
测试diff X-Y Tensor(" SquaredDifference_92:0",shape =(100,?),dtype = float32) 测试差异Y-X张量(" SquaredDifference_93:0",shape =(100,?),dtype = float32)
我有问题为什么这两个片段产生不同的输出形状
答案 0 :(得分:2)
您的第一个示例(使用logits
和labels
)和第二个示例(使用myTESTX
和myTESTY
)之间存在细微差别。 logits
形状与myTESTY
:(100, 1)
相同。但是,labels
的形状为(100,)
(不是动态形状),但myTESTX
的形状为(100, ?)
。
在第一种情况下(logits
和labels
),输入形状为(100,)
和(100,1)
,张量流使用广播。输入形状都不是动态的,因此您的输出形状是静态的:(100, 100)
由于广播。
在第二种情况下(myTESTX
和myTESTY
),输入形状为(100, ?)
和(100, 1)
。第一个输入形状是动态的,因此您的输出形状是动态的:(100, ?)
。
作为numpy中的一个更简单的说明性示例(使用相同的广播),请考虑以下内容:
import numpy as np
x = np.arange(10) # Shape: (10,)
y = np.arange(10).reshape(10,1) # Shape: (10, 1)
difference = x-y # Shape: (10, 10)