2017-10-10 4 views
0

Newbie ici, je suis désolé si cette question est stupide, mais je ne pouvais rien trouver à ce sujet en ligne. Je reçois une forme inattendue pour la sortie de tf.squared_difference. Je me attends à obtenir d'un Tensor avec shape=(100, ?) forme que la perte de l'extrait suivantTensorflow tf.squared_difference sort une forme inattendue

[print("Logits",logits,"#Labels",labels,"LOSS",tf.squared_difference(labels,logits)) for logits, labels in zip(logits_series,labels_series)] 

Cependant, il produit (100,100) perte

logits Tensor ("add_185: 0", forme = (100, 1), dtype = float32) Tenseur #Labels ("unstack_29: 0", forme = (100,), dtype = float32) Tenseur de perte ("SquaredDifference_94: 0", forme = (100, 100), dtype = float32) Loges Tensor ("add_186: 0", forme = (100, 1), dtype = float32) Tenseur #Labels ("unstack_29: 1", forme = (100,), dtype = float32) Tenseur de perte ("SquaredDifference_95: 0" , forme = (100, 100), dtype = float32)

J'ai testé un autre exemple avec le code suivant et donne la forme de sortie attendue.

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 XY Tensor ("SquaredDifference_92: 0"?, Forme = (100,), DTYPE = float32) test diff YX Tensor ("SquaredDifference_93: 0", forme = (100,?), DTYPE = float32)

J'ai question pourquoi ces deux extraits produisent une forme de sortie différente

Répondre

2

Il y a une légère différence entre votre premier exemple (avec logits et labels) et un deuxième exemple (avec myTESTX et myTESTY). logits a la même forme que myTESTY: (100, 1). Cependant, labels a la forme (100,) (qui n'est pas une forme dynamique), mais myTESTX a la forme (100, ?).

Dans le premier cas (logits et labels), les formes d'entrée sont (100,) et (100,1) et tensorflow utilise la radiodiffusion. Aucune forme d'entrée n'est dynamique, donc votre forme de sortie est statique: (100, 100) en raison de la diffusion. Dans le deuxième cas (myTESTX et myTESTY), les formes d'entrée sont (100, ?) et (100, 1) La première forme d'entrée est dynamique, donc votre forme de sortie est dynamique: (100, ?).

En tant que plus simple, par exemple illustratif numpy (qui utilise la même diffusion), considérez ceci:

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) 
+0

Merci, mais je ne comprends pas vraiment pourquoi il est 10,10. La deuxième dimension des tenseurs n'est pas 10. – cagdas

+0

Droite. Je suis d'accord que c'est un exemple confus/non intuitif. Si cela aide, notez que la forme (10,) est un vecteur ligne et la forme (10,1) est un vecteur colonne. Numpy (et tensorflow) font ce qu'on appelle [diffusion] (https://docs.scipy.org/doc/numpy/user/basics.broadcasting.html). Si les formes d'une opération par élément ne correspondent pas, numpy essaie de copier l'un des tableaux autant de fois qu'il le faut pour l'autre forme, puis il les relie ensemble. –