Tensorflow tf.squared_difference输出意外形状

时间:2017-10-10 18:49:23

标签: python machine-learning tensorflow deep-learning

新手在这里,我很抱歉,如果这个问题很愚蠢,但我无法在网上找到任何相关信息。我为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)

我有问题为什么这两个片段产生不同的输出形状

1 个答案:

答案 0 :(得分:2)

您的第一个示例(使用logitslabels)和第二个示例(使用myTESTXmyTESTY)之间存在细微差别。 logits形状与myTESTY(100, 1)相同。但是,labels的形状为(100,)(不是动态形状),但myTESTX的形状为(100, ?)

在第一种情况下(logitslabels),输入形状为(100,)(100,1),张量流使用广播。输入形状都不是动态的,因此您的输出形状是静态的:(100, 100)由于广播。

在第二种情况下(myTESTXmyTESTY),输入形状为(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)