2016-05-07 17 views
32

definisco un tensore come questo:tf.shape() ottenere la forma di sbagliato in tensorflow

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

Ma quando provo a stampare forma del tensore:

print(tf.shape(x))

ottengo Tensore ("Forma: 0", forma = (1,), dtype = int32), perché il risultato dell'output non deve essere shape = (100)

+0

ho trovato [questo] (https://stackoverflow.com/a/41771268/1358091) rispondere molto utile per analizzare la forma di un tensore, nonostante non sia quella accettata. –

risposta

73

tf.shape(input, name=None) restituisce un tensore intero 1-D che rappresenta la forma di input.

Si sta cercando: x.get_shape() che restituisce lo TensorShape della variabile x.

+15

'x.get_shape(). As_list()' è una forma usata spesso per convertire la forma in una lista python standard. Aggiunto qui per riferimento. –

9

Chiarimento:

tf.shape (x) crea un op e restituisce un oggetto che sta per l'uscita del op costruito, che è quello che si sta stampando al momento. Per ottenere la forma, eseguire l'operazione in una sessione:

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] 

credito: Dopo aver esaminato la risposta di cui sopra, ho visto la risposta a tf.rank function in Tensorflow che ho trovato più gentile e ho cercato di riformulare qui.

2

interrogazione è ben illustrato in TF FAQ:

In tensorflow, un tensore ha sia forma statica (dedotto) e una forma dinamico (true). La forma statica può essere letta utilizzando il metodo tf.Tensor.get_shape: questa forma viene dedotta dalle operazioni utilizzate per creare il tensore e parzialmente completate. Se la forma statica non è completamente definita, la forma dinamica di un Tensore t può essere determinata valutando tf.shape(t).

Così tf.shape() si ritorna un tensore, avrà sempre una dimensione di shape=(N,), e può essere calcolato in una sessione:

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

D'altra parte è possibile estrarre la forma statica utilizzando x.get_shape().as_list() e questo può essere calcolato ovunque.

+0

Cosa rappresenta 'shape = (N,)'? Puoi mostrare un esempio quando la forma statica e la forma dinamica differiscono? – mrgloom

+0

@mrgloom shape = (n,) rappresenta un vettore di dimensione n. Non è facile mostrare un esempio del genere perché devi confondere TF abbastanza da perdere il controllo della forma –

3

Un semplice esempio basato sulla risposta @Salvador Dali.

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

uscita sarà:

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

Non sei sicuro di cosa avresti voluto ottenere con questa risposta. –

0

Semplicemente, utilizzare tensor.shape per ottenere la forma statica :

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

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

considerando che, per ottenere la forma dinamica , utilizzare tf.shape():

dynamic_shape = tf.shape(a) 

È possibile anche ottenere la forma come ci si in NumPy con your_tensor.shape come nel seguente esempio.

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) 

Inoltre, questo esempio, per tensori che può essere eval uated.

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