python - started - tensorflow tutorial español
Uso de una inserción de palabras previamente entrenada(word2vec o Glove) en TensorFlow (4)
Recientemente he revisado una implementación interesante para la clasificación de texto convolucional . Sin embargo, todo el código TensorFlow que he revisado utiliza vectores de incrustación aleatorios (no pre-entrenados) como los siguientes:
with tf.device(''/cpu:0''), tf.name_scope("embedding"):
W = tf.Variable(
tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0),
name="W")
self.embedded_chars = tf.nn.embedding_lookup(W, self.input_x)
self.embedded_chars_expanded = tf.expand_dims(self.embedded_chars, -1)
¿Alguien sabe cómo usar los resultados de Word2vec o una incrustación de palabras pre-entrenadas GloVe en lugar de una aleatoria?
Hay algunas maneras en que puede usar una incrustación pre-entrenada en TensorFlow.
Supongamos que tiene la incrustación en una matriz NumPy llamada
embedding
, con filas
vocab_size
y columnas
embedding_dim
y desea crear un tensor
W
que pueda usarse en una llamada a
tf.nn.embedding_lookup()
.
-
Simplemente cree
W
comotf.constant()
que tome laembedding
como su valor:W = tf.constant(embedding, name="W")
Este es el enfoque más fácil, pero no es eficiente en memoria porque el valor de un
tf.constant()
se almacena varias veces en la memoria. Dado que laembedding
puede ser muy grande, solo debe usar este enfoque para ejemplos de juguetes. -
Cree
W
comotf.Variable
etf.Variable
desde la matriz NumPy mediante untf.placeholder()
:W = tf.Variable(tf.constant(0.0, shape=[vocab_size, embedding_dim]), trainable=False, name="W") embedding_placeholder = tf.placeholder(tf.float32, [vocab_size, embedding_dim]) embedding_init = W.assign(embedding_placeholder) # ... sess = tf.Session() sess.run(embedding_init, feed_dict={embedding_placeholder: embedding})
Esto evita almacenar una copia de
embedding
en el gráfico, pero requiere suficiente memoria para mantener dos copias de la matriz en la memoria a la vez (una para la matriz NumPy y otra para eltf.Variable
). Tenga en cuenta que asumí que desea mantener constante la matriz de incrustación durante el entrenamiento, por lo queW
se crea contrainable=False
. -
Si la incrustación se formó como parte de otro modelo TensorFlow, puede usar un
tf.train.Saver
para cargar el valor del archivo de punto de control del otro modelo. Esto significa que la matriz de incrustación puede omitir Python por completo. CreeW
como en la opción 2, luego haga lo siguiente:W = tf.Variable(...) embedding_saver = tf.train.Saver({"name_of_variable_in_other_model": W}) # ... sess = tf.Session() embedding_saver.restore(sess, "checkpoint_filename.ckpt")
La respuesta de @mrry no es correcta porque provoca la sobrescritura de los pesos de inserción cada vez que se ejecuta la red, por lo que si está siguiendo un enfoque de minibatch para entrenar su red, está sobrescribiendo los pesos de las incorporaciones. Entonces, desde mi punto de vista, la forma correcta de incrustaciones pre-entrenadas es:
embeddings = tf.get_variable("embeddings", shape=[dim1, dim2], initializer=tf.constant_initializer(np.array(embeddings_matrix))
También estaba enfrentando un problema de incrustación, así que escribí un tutorial detallado con el conjunto de datos. Aquí me gustaría agregar lo que probé. También puedes probar este método,
import tensorflow as tf
tf.reset_default_graph()
input_x=tf.placeholder(tf.int32,shape=[None,None])
#you have to edit shape according to your embedding size
Word_embedding = tf.get_variable(name="W", shape=[400000,100], initializer=tf.constant_initializer(np.array(word_embedding)), trainable=False)
embedding_loopup= tf.nn.embedding_lookup(Word_embedding,input_x)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for ii in final_:
print(sess.run(embedding_loopup,feed_dict={input_x:[ii]}))
Aquí está trabajando un ejemplo detallado de Tutorial Ipython si desea comprender desde cero, eche un vistazo.
Utilizo este método para cargar y compartir incrustaciones.
W = tf.get_variable(name="W", shape=embedding.shape, initializer=tf.constant_initializer(embedding), trainable=False)