在TensorFlow中使用预训练的单词嵌入(word2vec或Glove)
deep-learning
numpy
python
tensorflow
5
0

我最近审查了卷积文本分类的一个有趣的实现。但是我查看过的所有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预训练词嵌入的结果而不是随机的结果?

参考资料:
Stack Overflow
收藏
评论
共 5 个回答
高赞 时间 活跃

@mrry的答案不正确,因为它会导致覆盖每个运行网络的嵌入权重,因此,如果您采用小批量方法来训练网络,则会覆盖嵌入的权重。因此,以我的观点,正确的预训练嵌入方式是:

embeddings = tf.get_variable("embeddings", shape=[dim1, dim2], initializer=tf.constant_initializer(np.array(embeddings_matrix))
收藏
评论

我也遇到嵌入问题,所以我写了有关数据集的详细教程。在这里我想补充一下我尝试过的方法也可以尝试这种方法,

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]}))

如果您想从头开始理解,这里是工作详细的Ipython教程示例 ,请看一下。

收藏
评论

您可以通过多种方式在TensorFlow中使用预训练的嵌入。假设您将一个vocab_size行和embedding_dim列嵌入到一个名为embedding的NumPy数组中,并且想要创建一个张量W ,可用于调用tf.nn.embedding_lookup()

  1. 只需将W创建为将embedding作为其值的tf.constant()

     W = tf.constant(embedding, name="W") 

    这是最简单的方法,但是由于tf.constant()的值多次存储在内存中,因此内存使用效率不高。由于embedding可能非常大,因此仅应将这种方法用于玩具示例。

  2. W创建为tf.Variable并通过tf.placeholder()从NumPy数组对其进行初始化:

     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创建的。

  3. 如果将嵌入训练为另一个TensorFlow模型的一部分,则可以使用tf.train.Saver从另一个模型的检查点文件加载值。这意味着嵌入矩阵可以完全绕过Python。在选项2中创建W ,然后执行以下操作:

     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") 
收藏
评论

我使用这种方法来加载和共享嵌入。

W = tf.get_variable(name="W", shape=embedding.shape, initializer=tf.constant_initializer(embedding), trainable=False)
收藏
评论

2.0兼容答案 :有很多预训练的嵌入,这些嵌入是由Google开发的,并且是开源的。

其中一些是Universal Sentence Encoder (USE), ELMO, BERT等。在代码中重用它们非常容易。

重用Pre-Trained Embedding Universal Sentence Encoder的代码如下所示:

  !pip install "tensorflow_hub>=0.6.0"
  !pip install "tensorflow>=2.0.0"

  import tensorflow as tf
  import tensorflow_hub as hub

  module_url = "https://tfhub.dev/google/universal-sentence-encoder/4"
  embed = hub.KerasLayer(module_url)
  embeddings = embed(["A long sentence.", "single-word",
                      "http://example.com"])
  print(embeddings.shape)  #(3,128)

有关更多信息,请参见TF Hub Link ,它是Google开发和开放源代码的预培训嵌入。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号