【问题标题】:Cannot feed pre-train word embedding before training无法在训练前提供预训练词嵌入
【发布时间】:2019-07-11 11:48:57
【问题描述】:

我想在训练之前加载预训练词嵌入,而不是在每 train_steps 加载一次。我按照post 中的步骤操作。 但它会显示错误:

您必须为占位符张量“word_embedding_placeholder”提供一个值,其 dtype 为 float 和 shape [2000002,300]

大致代码如下:

embeddings_var = tf.Variable(tf.random_uniform([vocabulary_size, embedding_dim], -1.0, 1.0), trainable=False)
embedding_placeholder = tf.placeholder(tf.float32, [vocabulary_size, embedding_dim], name='word_embedding_placeholder')
embedding_init = embeddings_var.assign(embedding_placeholder)  # assign exist word embeddings
batch_embedded = tf.nn.embedding_lookup(embedding_init, batch_ph)


sess = tf.Session()
train_steps = round(len(X_train) / BATCH_SIZE)

train_iterator, train_next_element = get_dataset_iterator(X_train, y_train, BATCH_SIZE, training_epochs)

sess.run(init_g)
sess.run(train_iterator.initializer)
_ = sess.run(embedding_init, feed_dict={embedding_placeholder: w2v})

for epoch in range(0, training_epochs):
    # Training steps
    for i in range(train_steps):
        X_train_input, y_train_input = sess.run(train_next_element)            
        seq_len = np.array([list(word_idx).index(PADDING_INDEX) if PADDING_INDEX in word_idx else len(word_idx) for word_idx in X_train_input])  # actual lengths of sequences
        train_loss, train_acc, _ = sess.run([loss, accuracy, optimizer],
                                   feed_dict={batch_ph: X_train_input,
                                              target_ph: y_train_input,
                                              seq_len_ph: seq_len,
                                              keep_prob_ph: KEEP_PROB})

当我将训练中的 feed_dict 更改为:

train_loss, train_acc, _ = sess.run([loss, accuracy, optimizer],
                                   feed_dict={batch_ph: X_train_input,
                                              target_ph: y_train_input,
                                              seq_len_ph: seq_len,
                                              keep_prob_ph: KEEP_PROB,
                                              embedding_placeholder: w2v})

它有效,但并不优雅。有人遇到这个问题吗?

目标:我只想在训练前加载一次预训练嵌入。而不是每次都重新计算 embedding_init。

【问题讨论】:

    标签: python tensorflow word-embedding


    【解决方案1】:

    大概你在网络的某个地方使用了 batch_embedded,这意味着它被用于你的损失。这意味着每当您在循环内对 loss 执行 sess.run 时,您都在重新计算 batch_embedded,因此重新计算 embedding_init,您需要 embedding_placeholder。相反,您可以按如下方式初始化变量:

    embeddings_var = tf.get_variable("embeddings_var", shape=[vocabulary_size, embedding_dim], initializer=tf.constant_initializer(w2v),  trainable=False)
    

    【讨论】:

    • 是的,我以前用过这种方法,但是嵌入大小大于2GB。所以这个方法是行不通的。
    • 您是否尝试微调权重?您当前的版本没有这样做,因为它每次都重新计算 embedding_init。如果您确实不想微调权重,另一种方法可能是将 batch_embedded 作为占位符并在 numpy 中进行嵌入查找。
    • 不,我只是想训练模型,所以我设置了 embedding trainable=False。你有一些相关的帖子在 numpy 中进行嵌入查找吗?
    • 我没有,但我认为你可以像这样使用索引:如果你有例如batch_indices = [204,189],你可以使用batch_embeddings = w2v[batch_indices, :]获得相应的嵌入
    猜你喜欢
    • 2019-10-27
    • 2019-12-30
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    相关资源
    最近更新 更多