负载预训练词嵌入到Tensorflow模型中

负载预训练词嵌入到Tensorflow模型中,tensorflow,lstm,word2vec,Tensorflow,Lstm,Word2vec,我正试图修改它来加载这个预先训练过的GoogleNews单词ebmedding(或者tensorflow单词2vec嵌入也可以) 我一直在阅读如何将预先训练好的单词嵌入tensorflow的示例(例如,and) 在第一个链接示例中,他们可以轻松地: 在第二个链接示例中,它们: 然后他们: 这两个例子都有意义,但在我的例子中,如何将未打包的嵌入initW分配给TF图对我来说并不明显。(我是TF初学者) 我可以像前两个例子一样准备initW: def loadEmbedding(self, word

我正试图修改它来加载这个预先训练过的GoogleNews单词ebmedding(或者tensorflow单词2vec嵌入也可以)

我一直在阅读如何将预先训练好的单词嵌入tensorflow的示例(例如,and)

在第一个链接示例中,他们可以轻松地:

在第二个链接示例中,它们:

然后他们:

这两个例子都有意义,但在我的例子中,如何将未打包的嵌入initW分配给TF图对我来说并不明显。(我是TF初学者)

我可以像前两个例子一样准备initW:

def loadEmbedding(self, word_to_id):
    # New model, we load the pre-trained word2vec data and initialize embeddings
    with open(os.path.join('GoogleNews-vectors-negative300.bin'), "rb", 0) as f:
        header = f.readline()
        vocab_size, vector_size = map(int, header.split())
        binary_len = np.dtype('float32').itemsize * vector_size
        initW = np.random.uniform(-0.25,0.25,(len(word_to_id), vector_size))
        for line in range(vocab_size):
            word = []
            while True:
                ch = f.read(1)
                if ch == b' ':
                    word = b''.join(word).decode('utf-8')
                    break
                if ch != b'\n':
                    word.append(ch)
            if word in word_to_id:
                initW[word_to_id[word]] = np.fromstring(f.read(binary_len), dtype='float32')
            else:
                f.read(binary_len)
    return initW
从中的解决方案来看,我认为我应该能够做如下事情

session.run(tf.assign(embedding, initW)).
如果我尝试像这样在这里添加行:

我得到以下错误:

ValueError: Fetch argument <tf.Tensor 'Assign:0' shape=(10000, 300) dtype=float32_ref> cannot be interpreted as a Tensor. (Tensor Tensor("Assign:0", shape=(10000, 300), dtype=float32_ref, device=/device:CPU:0) is not an element of this graph.)
ValueError:Fetch参数不能解释为张量。(张量张量(“Assign:0”,shape=(10000300),dtype=float32\u ref,device=/device:CPU:0)不是此图的元素。)


更新:我根据Nilesh Birari的建议更新了代码:。它没有改善验证或测试集的困惑,只是改善了训练集的困惑

如果我错了,请纠正我,试着用我对张量流有限的理解来回答

ValueError: Fetch argument <tf.Tensor 'Assign:0' shape=(10000, 300) dtype=float32_ref> cannot be interpreted as a Tensor. (Tensor Tensor("Assign:0", shape=(10000, 300), dtype=float32_ref, device=/device:CPU:0) is not an element of this graph.)

我想这应该是唯一的问题,正如您在示例中所看到的,初始化在相同的范围内。

您认为它不起作用是什么意思?你发现了什么错误?@dantiston我用添加的细节更新了问题。我还没有找到你问题的答案,但我认为最好使用
tf.get_variable(…,trainable=False)
,而不是使用你现有的。您试过了吗?另外,您认为
RNN.inputs.assign(initW)
应该做什么?看起来您没有为变量
RNN
分配任何内容。RNN没有定义,我只是想做与此行类似的操作:,但该脚本将cnn定义为TF图:。我不知道如何在这里做类似的事情。对于您的第一个评论,您是说用inputs=tf.get_variable(…,trainable=False)之类的东西替换我的整个代码块?(然后我不明白它如何将谷歌嵌入的单词映射到训练集中的单词。)谢谢,我想这已经解决了。只需检查嵌入是否按预期加载。
session.run(tf.assign(embedding, initW)).
with sv.managed_session() as session:
        initializer = tf.random_uniform_initializer(-config.init_scale,
                                                    config.init_scale)
        session.run(tf.assign(m.embedding, initW))
ValueError: Fetch argument <tf.Tensor 'Assign:0' shape=(10000, 300) dtype=float32_ref> cannot be interpreted as a Tensor. (Tensor Tensor("Assign:0", shape=(10000, 300), dtype=float32_ref, device=/device:CPU:0) is not an element of this graph.)
ValueError: Fetch argument <tf.Tensor 'Assign:0' shape=(10000, 300) dtype=float32_ref> cannot be interpreted as a Tensor. (Tensor Tensor("Assign:0", shape=(10000, 300), dtype=float32_ref, device=/device:CPU:0) is not an element of this graph.)
with tf.Graph().as_default():
    initializer = tf.random_uniform_initializer(-config.init_scale,
                                                config.init_scale)
    with tf.name_scope("Train"):
        train_input = PTBInput(config=config, data=train_data, name="TrainInput")
        with tf.variable_scope("Model", reuse=None, initializer=initializer):
            m = PTBModel(is_training=True, config=config, input_=train_input)
        tf.summary.scalar("Training Loss", m.cost)
        tf.summary.scalar("Learning Rate", m.lr)

    with tf.name_scope("Valid"):
        valid_input = PTBInput(config=config, data=valid_data, name="ValidInput")
        with tf.variable_scope("Model", reuse=True, initializer=initializer):
            mvalid = PTBModel(is_training=False, config=config, input_=valid_input)
        tf.summary.scalar("Validation Loss", mvalid.cost)

    with tf.name_scope("Test"):
        test_input = PTBInput(config=eval_config, data=test_data, name="TestInput")
        with tf.variable_scope("Model", reuse=True, initializer=initializer):
            mtest = PTBModel(is_training=False, config=eval_config,
                             input_=test_input)

    sv = tf.train.Supervisor(logdir=FLAGS.save_path)
    with sv.managed_session() as session:
        word2vec = loadEmbedding(word_to_id)
        session.run(tf.assign(m.embedding, word2vec))
        print("WORKED!!!")