2015-11-11 23 views

risposta

5

Dai uno sguardo a shapes-and-shaping dalla documentazione di TensorFlow. Descrive diverse trasformazioni di forma disponibili.

La funzione più comune è probabilmente tf.reshape, che è simile al suo equivalente numpy. Ti permette di specificare qualsiasi forma che desideri purché il numero di elementi rimanga lo stesso. Ci sono alcuni esempi disponibili nella documentazione.

4

Documentation shows metodi di rimodellamento. Essi sono:

  • rimodellare
  • squeeze (rimuove dimensioni del formato 1 dalla forma di un tensore)
  • expand_dims (aggiunge dimensioni del formato 1)

nonché sacco di metodi per ottenere shape, size, rank del tuo tensore. Probabilmente il più utilizzato è reshape ed ecco un esempio di codice con un paio di casi limite (-1):

import tensorflow as tf 

v1 = tf.Variable([ 
    [1, 2, 3, 4], 
    [5, 6, 7, 8], 
    [9, 10, 11, 12] 
]) 
v2 = tf.reshape(v1, [2, 6]) 
v3 = tf.reshape(v1, [2, 2, -1]) 
v4 = tf.reshape(v1, [-1]) 
# v5 = tf.reshape(v1, [2, 4, -1]) will fail, because you can not find such an integer for -1 
v6 = tf.reshape(v1, [1, 4, 1, 3, 1]) 
v6_shape = tf.shape(v6) 
v6_squeezed = tf.squeeze(v6) 
v6_squeezed_shape = tf.shape(v6_squeezed) 

init = tf.initialize_all_variables() 

sess = tf.Session() 
sess.run(init) 
a, b, c, d, e, f, g = sess.run([v2, v3, v4, v6, v6_shape, v6_squeezed, v6_squeezed_shape]) 
# print all variables to see what is there 
print e # shape of v6 
print g # shape of v6_squeezed 
13

La classe tf.Variable è il metodo consigliato per creare variabili, ma limita la capacità di cambiare la forma della variabile una volta creata.

Se è necessario cambiare la forma di una variabile, è possibile effettuare le seguenti operazioni (ad esempio per un virgola mobile tensore 32-bit):

var = tf.Variable(tf.placeholder(tf.float32)) 
# ... 
new_value = ... # Tensor or numpy array. 
change_shape_op = tf.assign(var, new_value, validate_shape=False) 
# ... 
sess.run(change_shape_op) # Changes the shape of `var` to new_value's shape. 

Si noti che questa funzione non è nel API pubblica documentata , quindi è soggetto a modifiche. Se ti trovi a dover utilizzare questa funzione, faccelo sapere e possiamo esaminare un modo per supportarlo.

+0

Il problema con questo approccio è che 'var.shape' non viene aggiornato di conseguenza. Questo persiste quando si memorizza un checkpoint e quindi si impedisce di caricare nuovamente il checkpoint, poiché la forma variabile non corrisponde alla forma del peso. C'è un modo per forzare 'var.shape' per l'aggiornamento? Devo creare un problema con GitHub? –

+0

Ho trovato questo thread, discutendo il problema: https://github.com/tensorflow/tensorflow/issues/10091#issuecomment-304301817 Mi chiedo, tuttavia, se esiste un modo per estendere i pesi delle reti esistenti –

1
tf.Variable(tf.placeholder(tf.float32)) 

non è valida presso tensorflow 1.2.1

in guscio pitone:

import tensorflow as tf 
tf.Variable(tf.placeholder(tf.float32)) 

otterrete:

ValueError: initial_value must have a shape specified: Tensor("Placeholder:0", dtype=float32) 

Update: se si aggiunge validate_shape=False, ci sarà non essere un errore

tf.Variable(tf.placeholder(tf.float32), validate_shape=False) 

se tf.py_func corrisponde il vostro requisito:

def init(): 
    return numpy.random.rand(2,3) 
a = tf.pyfun(init, [], tf.float32) 

È possibile creare variabile che ha qualsiasi forma passando la propria funzione init.

Un altro modo:

var = tf.get_varible('my-name', initializer=init, shape=(1,1)) 

Si può passare tf.constant o qualsiasi funzione che restituisce init matrice NumPy. La forma fornita non sarà convalidata. La forma di output è la tua vera forma di dati.

Problemi correlati