J'ai récemment passé en revue une implémentation intéressante pour classification convolutionnelle du texte . Cependant, tout le code TensorFlow que j'ai examiné utilise un vecteur d'incorporation aléatoire (non pré-formé), comme suit:
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)
Est-ce que quelqu'un sait comment utiliser les résultats de Word2vec ou d'une incorporation de Word pré-entraînée par GloVe à la place d'un résultat aléatoire?
Vous pouvez utiliser une intégration pré-formée dans TensorFlow de plusieurs manières. Supposons que vous avez incorporé dans un tableau NumPy appelé embedding
, avec _vocab_size
_ lignes et _embedding_dim
_ colonnes et que vous voulez créer un tenseur W
pouvant être utilisé dans un appel à tf.nn.embedding_lookup()
.
Créez simplement W
en tant que tf.constant()
qui prend embedding
en tant que valeur:
_W = tf.constant(embedding, name="W")
_
Cette approche est la plus simple, mais elle n’est pas efficace en mémoire car la valeur de tf.constant()
est stockée plusieurs fois en mémoire. Puisque embedding
peut être très volumineux, vous ne devriez utiliser cette approche que pour des exemples de jouets.
Créez W
sous la forme d'un _tf.Variable
_ et initialisez-le à partir du tableau NumPy via un tf.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})
_
Cela évite de stocker une copie de embedding
dans le graphique, mais nécessite assez de mémoire pour conserver deux copies de la matrice en même temps (une pour le tableau NumPy et une pour le _tf.Variable
_). Notez que je suppose que vous souhaitez conserver la matrice d’incorporation constante pendant l’entraînement. W
est donc créé avec _trainable=False
_.
Si l'intégration a été formée dans le cadre d'un autre modèle TensorFlow, vous pouvez utiliser un tf.train.Saver
pour charger la valeur à partir du fichier de point de contrôle de l'autre modèle. Cela signifie que la matrice d'intégration peut contourner Python. Créez W
comme dans l'option 2, puis procédez comme suit:
_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")
_
J'utilise cette méthode pour charger et partager l'intégration.
W = tf.get_variable(name="W", shape=embedding.shape, initializer=tf.constant_initializer(embedding), trainable=False)
La réponse de @mrry n’est pas correcte car elle provoque l’écrasement des poids des embeddings chaque fois que le réseau est exécuté. Ainsi, si vous suivez une approche par minibatch pour former votre réseau, vous écrasez les poids des embeddings. Donc, de mon point de vue, la bonne façon de procéder à des intégrations pré-formées est la suivante:
embeddings = tf.get_variable("embeddings", shape=[dim1, dim2], initializer=tf.constant_initializer(np.array(embeddings_matrix))
Je faisais également face à un problème d'intégration, j'ai donc écrit un tutoriel détaillé avec dataset. Ici, j'aimerais ajouter ce que j'ai essayé. Vous pouvez aussi essayer cette méthode,
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]}))
Voici le didacticiel détaillé exemple Ipython si vous voulez comprendre à partir de zéro, jetez un oeil.