簡體   English   中英

訓練前無法提供訓練前字詞嵌入

[英]Cannot feed pre-train word embedding before training

我想在訓練之前加載預訓練詞嵌入,而不是在每個train_steps都加載它。 我按照這個步驟 但是它將顯示錯誤:

您必須使用dtype float和shape [2000002,300]輸入占位符張量'word_embedding_placeholder'的值

這是大致的代碼:

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。

大概您在網絡中的某處使用了batch_embedded,這意味着您在丟失時使用了它。 這意味着,無論何時在循環內對丟失執行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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM