2016-05-07 6 views
32

Ich definiere einen Tensor wie folgt aus:tf.shape() erhalten falsche Form in tensorflow

x = tf.get_variable("x", [100])

Aber wenn ich versuche Form von Tensor zu drucken:

print(tf.shape(x))

ich Tensor ("Form: 0", Form = (1,), dtype = int32), warum das Ergebnis der Ausgabe nicht sein sollte = (100)

+0

Ich fand [diese] (https://stackoverflow.com/a/41771268/1358091) sehr nützlich beantworten die Form eines Tensor zu analysieren, obwohl es nicht die akzeptiert ist. –

Antwort

73

tf.shape(input, name=None) gibt einen 1-D-Ganzzahl-Tensor zurück, der die Form der Eingabe darstellt.

Sie suchen: x.get_shape(), die die TensorShape der x Variable zurückgibt.

+15

'x.get_shape(). As_list()' ist eine häufig verwendete Form, um die Form in eine Standard-Python-Liste zu konvertieren. Hinzugefügt hier als Referenz. –

9

Klarstellung:

tf.shape (x) erzeugt ein op und gibt ein Objekt, das für die Ausgabe des konstruierten op steht, das ist das, was Sie gerade gedruckt wird. Um die Form zu erhalten, führen Sie den Betrieb in einer Sitzung:

matA = tf.constant([[7, 8], [9, 10]]) 
shapeOp = tf.shape(matA) 
print(shapeOp) #Tensor("Shape:0", shape=(2,), dtype=int32) 
with tf.Session() as sess: 
    print(sess.run(shapeOp)) #[2 2] 

Kredit: Nach dem in der obigen Antwort suchen, sah ich die Antwort auf tf.rank function in Tensorflow, die ich mehr hilfreich und ich habe versucht, es hier Umformulierung.

2

ähnliche Frage ist schön erklärt in TF FAQ:

In TensorFlow, ein Tensor hat sowohl ein statische (geschlossen) Form und eine dynamische (true) Form. Die statische Form kann mit der Methode tf.Tensor.get_shape gelesen werden: Diese Form wird aus den Operationen abgeleitet, die zum Erstellen des Tensors verwendet wurden, und kann teilweise vollständig sein. Wenn die statische Form nicht vollständig definiert ist, kann die dynamische Form eines Tensors t durch Auswertung tf.shape(t) bestimmt werden.

So tf.shape() kehrt man ein Tensor, wird immer eine Größe von shape=(N,) haben, und kann in einer Sitzung berechnet werden:

a = tf.Variable(tf.zeros(shape=(2, 3, 4))) 
with tf.Session() as sess: 
    print sess.run(tf.shape(a)) 

Auf der anderen Seite die statische Form extrahieren kann durch x.get_shape().as_list() mit und Dies kann überall berechnet werden.

+0

Was ist 'shape = (N,)'? Können Sie ein Beispiel zeigen, wenn sich die statische Form und die dynamische Form unterscheiden? – mrgloom

+0

@mrgloom shape = (n,) repräsentiert einen Vektor der Größe n. Es ist nicht einfach, ein solches Beispiel zu zeigen, weil Sie TF genug verwirren müssen, um die Kontrolle über die Form zu verlieren. –

3

Nur ein schnelles Beispiel basierend auf @Salvador Dali Antwort.

a = tf.Variable(tf.zeros(shape=(2, 3, 4))) 
print("a v1", tf.shape(a)) 
print("a v2", a.get_shape()) 
with tf.Session() as sess: 
    print("a v3", sess.run(tf.shape(a))) 

Ausgang wird sein:

a v1 Tensor("Shape:0", shape=(3,), dtype=int32) 
a v2 (2, 3, 4) 
a v3 [2 3 4] 
+0

Nicht sicher, was Sie mit dieser Antwort erreichen wollten. –

0

einfach, tensor.shape verwenden, um die statische Form zu erhalten:

In [102]: a = tf.placeholder(tf.float32, [None, 128]) 

# returns [None, 128] 
In [103]: a.shape.as_list() 
Out[103]: [None, 128] 

Während die dynamische Form, erhalten tf.shape() verwenden:


Sie können auch die Form erhalten, wie Sie würde in NumPy mit your_tensor.shape wie im folgenden Beispiel.

In [11]: tensr = tf.constant([[1, 2, 3, 4, 5], [2, 3, 4, 5, 6]]) 

In [12]: tensr.shape 
Out[12]: TensorShape([Dimension(2), Dimension(5)]) 

In [13]: list(tensr.shape) 
Out[13]: [Dimension(2), Dimension(5)] 

In [16]: print(tensr.shape) 
(2, 5) 

Auch dieses Beispiel für Tensoren, die eval uated werden kann.

In [33]: tf.shape(tensr).eval().tolist() 
Out[33]: [2, 5] 
Verwandte Themen