2016-02-14 16 views
14

Sto tentando di inizializzare un tensorflow Variable con embeddings word2vec pre-addestrato.Inizializzazione di tensorflow Variabile con un array maggiore di 2 GB

Ho il codice seguente:

import tensorflow as tf 
from gensim import models 

model = models.Word2Vec.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True) 
X = model.syn0 

embeddings = tf.Variable(tf.random_uniform(X.shape, minval=-0.1, maxval=0.1), trainable=False) 

sess.run(tf.initialize_all_variables()) 

sess.run(embeddings.assign(X)) 

E sto ricevendo il seguente errore:

ValueError: Cannot create an Operation with a NodeDef larger than 2GB. 

La matrice (X) sto cercando di assegnare è di forma (3000000, 300) e la sua dimensione è 3.6GB.

Ho ricevuto lo stesso errore se provo anche tf.convert_to_tensor(X).

So che non riesce a causa del fatto che la matrice è maggiore di 2 GB. Tuttavia, non so come assegnare un array maggiore di 2 GB a un tensorflow Variable

risposta

6

La soluzione più semplice è feed_dict'ing in un nodo segnaposto che si utilizza per tf.assign alla variabile.

X = tf.Variable([0.0]) 
place = tf.placeholder(tf.float32, shape=(3000000, 300)) 
set_x = X.assign(place) 
# set up your session here.... 
sess.run(set_x, feed_dict={place: model.syn0}) 

Come Joshua poco notato in una risposta separata, è possibile anche utilizzarlo nella inizializzatore:

X = tf.Variable(place) # place as defined above 
... 
init = tf.initialize_all_variables() 
... create sess ... 
sess.run(init, feed_dict={place: model.syn0}) 
+1

'X.assign (luogo)' ha bisogno di essere 'tf.assign (X, luogo, validate_shape = False)', o tensorflow si lamenterà che stai cambiando la forma del tensore. A parte questo, funziona. –

+0

Grazie - ha aggiornato la risposta per includere il commento di + mrry di seguito, impostando la forma del segnaposto. – dga

+3

per maggiori informazioni c'è una buona descrizione di come fare questo nella documentazione sotto [dati precaricati] (https://www.tensorflow.org/versions/r0.7/how_tos/reading_data/index.html#preloaded-data) e un esempio funzionante completo su come utilizzare un segnaposto e una variabile per precaricare gli input di addestramento MNIST [qui] (https://github.com/tensorflow/tensorflow/blob/r0.7/tensorflow/examples/how_tos/reading_data/ fully_connected_preloaded_var.py) – stefano

10

Sembra che l'unica opzione è quella di utilizzare un segnaposto. Il modo più pulito che posso trovare è di inizializzare a un segnaposto direttamente:

X_init = tf.placeholder(tf.float32, shape=(3000000, 300)) 
X = tf.Variable(X_init) 
# The rest of the setup... 
sess.run(tf.initialize_all_variables(), feed_dict={X_init: model.syn0}) 
+1

Si noti che è anche possibile impostare l'argomento forma facoltativo quando si chiama 'tf.placeholder()' e quindi non è necessario 'validate_shape = False' (e si ottiene un'inferenza di forma migliore nel resto del programma!). – mrry

+0

@mrry, Oh, giusto. Grazie. L'ho aggiunto alla risposta. –

+0

Soluzione piacevole e pulita. Upvoted. – dga

Problemi correlati