在TensorFlow中使用预训练的单词嵌入(word2vec或Glove)
我最近审查了卷积文本分类的一个有趣的实现。但是我审查过的所有TensorFlow代码都使用如下所示的随机(未经预训练)嵌入向量:
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)
有谁知道如何使用Word2vec或GloVe预训练词嵌入的结果,而不是随机的结果?
回答:
您可以通过多种方式在TensorFlow中使用预训练的嵌入。假设您将NemPy数组嵌入到embedding
具有vocab_size
行和embedding_dim
列的NumPy数组中,并且想要创建一个W
可用于调用的张量tf.nn.embedding_lookup()
。
- 只需创建
W
一个tf.constant()
是需要embedding
为它的价值:W = tf.constant(embedding, name="W")
这是最简单的方法,但是由于a的值tf.constant()
多次存储在内存中,因此内存使用效率不高。由于embedding
可能很大,因此只应将这种方法用于玩具示例。
创建
W
为a,tf.Variable
并通过NumPy数组对其进行初始化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})
这样可以避免embedding
在图表中存储的副本,但确实需要足够的内存才能一次在内存中保留矩阵的两个副本(一个用于NumPy数组,一个用于tf.Variable
)。请注意,我假设您想在训练期间保持嵌入矩阵不变,因此W
是使用创建的trainable=False
。
如果将嵌入训练为另一个TensorFlow模型的一部分,则可以使用
tf.train.Saver
从另一个模型的检查点文件中加载值。这意味着嵌入矩阵可以完全绕过Python。W
按照选项2创建,然后执行以下操作: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”)
以上是 在TensorFlow中使用预训练的单词嵌入(word2vec或Glove) 的全部内容, 来源链接: utcz.com/qa/399096.html