我經歷了代碼,我害怕我沒有把握重要的一點。重量Seq2Seq模型
我似乎找不到編碼器和解碼器的模型的權重矩陣,無論它們在哪裏更新。我發現了target_weights,但它似乎在每次調用get_batch()時都會重新初始化,所以我並不真正瞭解它們代表什麼。
我的實際目標是連接一個解碼器的兩個源編碼器的兩個隱藏狀態,通過應用一個線性變換和權重矩陣,我將不得不隨模型一起訓練(構建一個多對多的模型),但是我由於我上面提到的問題,不知道從哪裏開始。
我提前感謝您提供任何幫助。
BG
我經歷了代碼,我害怕我沒有把握重要的一點。重量Seq2Seq模型
我似乎找不到編碼器和解碼器的模型的權重矩陣,無論它們在哪裏更新。我發現了target_weights,但它似乎在每次調用get_batch()時都會重新初始化,所以我並不真正瞭解它們代表什麼。
我的實際目標是連接一個解碼器的兩個源編碼器的兩個隱藏狀態,通過應用一個線性變換和權重矩陣,我將不得不隨模型一起訓練(構建一個多對多的模型),但是我由於我上面提到的問題,不知道從哪裏開始。
我提前感謝您提供任何幫助。
BG
這可能會幫助您開始。在tensorflow.python.ops.seq2seq.py(有/沒有水桶,注意力等)中實施了幾個模型,但看看embedding_attention_seq2seq
(這是您看似參考的示例模型seq2seq_model.py中所稱的那個)的定義:
def embedding_attention_seq2seq(encoder_inputs, decoder_inputs, cell,
num_encoder_symbols, num_decoder_symbols,
num_heads=1, output_projection=None,
feed_previous=False, dtype=dtypes.float32,
scope=None, initial_state_attention=False):
with variable_scope.variable_scope(scope or "embedding_attention_seq2seq"):
# Encoder.
encoder_cell = rnn_cell.EmbeddingWrapper(cell, num_encoder_symbols)
encoder_outputs, encoder_state = rnn.rnn(
encoder_cell, encoder_inputs, dtype=dtype)
# First calculate a concatenation of encoder outputs to put attention on.
top_states = [array_ops.reshape(e, [-1, 1, cell.output_size])
for e in encoder_outputs]
attention_states = array_ops.concat(1, top_states)
....
在把它們交給解碼器之前,你可以看到它在哪裏挑出編碼器輸出的最上層爲01。
所以你可以用兩個編碼器實現一個類似的功能,並在切換到解碼器之前連接這些狀態。
在get_batch函數中創建的值僅用於第一次迭代。儘管權重每次都傳遞到函數中,但它們的值在init函數的Seq2Seq模型類中作爲全局變量更新。
with tf.name_scope('Optimizer'):
# Gradients and SGD update operation for training the model.
params = tf.trainable_variables()
if not forward_only:
self.gradient_norms = []
self.updates = []
opt = tf.train.GradientDescentOptimizer(self.learning_rate)
for b in range(len(buckets)):
gradients = tf.gradients(self.losses[b], params)
clipped_gradients, norm = tf.clip_by_global_norm(gradients,
max_gradient_norm)
self.gradient_norms.append(norm)
self.updates.append(opt.apply_gradients(
zip(clipped_gradients, params), global_step=self.global_step))
self.saver = tf.train.Saver(tf.global_variables())
的權重2單獨供給作爲佔位符,因爲它們是在get_batch函數歸一化以產生零個權爲PAD輸入。
# Batch decoder inputs are re-indexed decoder_inputs, we create weights.
for length_idx in range(decoder_size):
batch_decoder_inputs.append(
np.array([decoder_inputs[batch_idx][length_idx]
for batch_idx in range(self.batch_size)], dtype=np.int32))
# Create target_weights to be 0 for targets that are padding.
batch_weight = np.ones(self.batch_size, dtype=np.float32)
for batch_idx in range(self.batch_size):
# We set weight to 0 if the corresponding target is a PAD symbol.
# The corresponding target is decoder_input shifted by 1 forward.
if length_idx < decoder_size - 1:
target = decoder_inputs[batch_idx][length_idx + 1]
if length_idx == decoder_size - 1 or target == data_utils.PAD_ID:
batch_weight[batch_idx] = 0.0
batch_weights.append(batch_weight)
感謝您的回覆。這正是我現在正在做的:-)但是我的問題更多的是有關權重管理,這對我來說仍然有點混亂。我想我只能測試看看。祝你有美好的一天。 –