Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在TensorFlow中使用预先训练好的单词嵌入(word2vec或手套)_Python_Numpy_Tensorflow_Deep Learning - Fatal编程技术网

Python 在TensorFlow中使用预先训练好的单词嵌入(word2vec或手套)

Python 在TensorFlow中使用预先训练好的单词嵌入(word2vec或手套),python,numpy,tensorflow,deep-learning,Python,Numpy,Tensorflow,Deep Learning,我最近回顾了一个有趣的实现。然而,我所回顾的所有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.n

我最近回顾了一个有趣的实现。然而,我所回顾的所有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)
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")

有人知道如何使用Word2vec或手套预训练单词嵌入的结果而不是随机嵌入的结果吗?

有几种方法可以在TensorFlow中使用预训练单词嵌入。假设您在名为
embedding
的NumPy数组中嵌入了
vocab\u size
行和
embedding\u dim
列,您希望创建一个可用于调用的张量
W

  • 只需将
    W
    创建为一个以
    embedding
    为其值的:

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

  • W
    创建为
    tf.变量
    ,并通过一个:

    这避免了在图中存储嵌入的
    副本,但它确实需要足够的内存来同时在内存中保留矩阵的两个副本(一个用于NumPy数组,一个用于
    tf.Variable
    )。请注意,我假设您希望在训练期间保持嵌入矩阵不变,因此使用
    trainable=False
    创建
    W

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

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

    @mrry的答案是不正确的,因为它提供了每次网络运行时对嵌入权重的覆盖,因此,如果您采用小批量方法来训练网络,您就是在覆盖嵌入权重。因此,在我看来,预培训嵌入的正确方法是:

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

    我也面临嵌入问题,所以我用dataset编写了详细的教程。 这里我想补充一下我试过的方法你也可以试一下这个方法

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

    这里有一个详细的工作教程,如果你想从头开始理解,请看一看。

    2.0兼容答案:有许多经过预培训的嵌入,它们是由谷歌开发的,并且是开源的

    其中一些是
    通用句子编码器(USE)、ELMO、BERT
    等。。在代码中重用它们非常容易

    重新使用预训练嵌入通用句子编码器的代码如下所示:

      !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)
    

    有关谷歌开发和开源的预培训嵌入式系统的更多信息,请参阅tensorflow版本2。如果您使用嵌入层,它非常容易

    X=tf.keras.layers.Embedding(input_dim=vocab_size,
                                output_dim=300,
                                input_length=Length_of_input_sequences,
                                embeddings_initializer=matrix_of_pretrained_weights
                                )(ur_inp)
    
    

    我创建W如下:W=np.loadtxt(“/media/w2vTest.txt”,dtype='string',delimiter=''),它创建为一行:['in''0.070312…'-0.0625']。这里有问题!在删除“in”并将数字从字符串转换为FLUAT32时,我是否认为这是我的W?如果是这种情况,那么如何将“in”连接到其各自的向量?或者我需要将数字转换为float32,然后保持“in”不变;是否希望tensorflow能够完成所有必需的处理?谢谢啊,你有几个选择。您可以使用TensorFlow
    tf.decode_csv()
    op将文本文件转换为张量,但这可能会很昂贵(特别是,它要求您为每列创建一个
    tensor
    ,然后将数字文件连接在一起)。也许更简单的替代方法是使用NumPy数组并将其作为NumPy数组获取。在调用
    sess.run(Embedded_init,…)
    返回(假设您在程序中没有保留对它的引用)后,应对NumPy数组进行垃圾收集。根据程序的结构,您可能希望
    del embedding
    (其中
    embedding
    是NumPy数组)更早地释放数组。@mrry:您能否更详细地介绍选项1,更具体地说,“它不是内存效率,因为tf.constant()的值在内存中多次存储。”。GPU或CPU的内存效率低下?更一般地说,为什么tf.constant()必须在内存中有多个副本,而选项2的tf.Variable()+填充占位符没有这个问题?如果您还想知道为什么“tf.constant()的值在内存中被多次存储”,请看看这个答案:与刘佳的答案完全相同。@TimZaman。。事实上,他缺少了trainable=False的论点,因此最终会在这个过程中微调他的嵌入。此外,我认为尤金尼奥的推理是错误的。您不必对每个小批量运行“embedding_init”操作,一切都会很好。也就是说,只需在培训开始时运行一次嵌入初始化。@沙图如何确保仅在培训开始时运行嵌入初始化?@dust0x。。如果嵌入的大小足够小,可以将其指定为初始值。如果它们非常大,则在运行所有变量的初始值设定项时,可以在提要中传递它们。如果不够清楚,请务必告诉我,我将尝试发布两种方法的一些示例代码。嵌入应该是numpy矩阵中的列还是行?