imagenes - Inicializando la variable tensorflow con una matriz de más de 2GB
tensorflow tutorial español pdf (2)
Intento inicializar una Variable
tensorflow con incrustaciones word2vec
.
Tengo el siguiente código:
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))
Y recibo el siguiente error:
ValueError: Cannot create an Operation with a NodeDef larger than 2GB.
La matriz ( X
) que intento asignar tiene forma (3000000, 300)
y su tamaño es de 3,6 GB.
Estoy obteniendo el mismo error si pruebo tf.convert_to_tensor(X)
también.
Sé que falla debido al hecho de que la matriz es más grande que 2GB. Sin embargo, no sé cómo asignar una matriz de más de 2 GB a una Variable
tensorflow
Parece que la única opción es usar un marcador de posición. La forma más limpia que puedo encontrar es inicializar a un marcador de posición directamente:
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})
La solución más fácil es alimentarlo en un nodo de marcador de posición que utiliza para tf.assign a la variable.
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})
Como observó Joshua Little en una respuesta separada, también puede usarlo en el inicializador:
X = tf.Variable(place) # place as defined above
...
init = tf.initialize_all_variables()
... create sess ...
sess.run(init, feed_dict={place: model.syn0})