2016-11-26 12 views
0

私のモデルではdynamic_rnnの2つのスタッキングが使用されています。つまり、第2のdynamic_rnninitial_stateは、final_stateの最初のdynamic_rnnです。私の損失関数は、outputの2番目のdynamic_rnnに基づいて計算されます。私の質問は、グラデーションが最初にdynamic_rnnに伝播するのでしょうか?グラデーションバックは複数のdynamic_rnnに伝播されますか?

なぜ私は冗長に2つのdynamic_rnnを使用するのかと聞かれるかもしれません。答えは私の問題では、最後のステップを除いて、ほとんどの入力シーケンスは全く同じです。だから、時間を節約するためにこれらすべての入力シーケンスの一般的な部分に対してdynamic_rnnを1回実行し、別々の最後の入力要素を受け入れる別のdynamic_rnnfinal_stateを送ります。

長さ10のシーケンスが3つあるとします。これらのシーケンスはすべて、最後のステップ(10番目の要素)を除いて同じです。簡略化されたコード:

cell = BasicRNNCell() 
# the first dynamic_rnn which handles the common part 
first_outputs, first_states = tf.nn.dynamic_rnn(
    cell=cell, 
    dtype=tf.float32, 
    sequence_length=[9], # only one sample with length 9 
    inputs=identical_input # input with shape (1, 9, input_element_dim) 
) 
# tile the first_states to accommodate next dynamic_rnn 
# first_states is transformed from shape (1, hidden_state_dim) to (3, hidden_state_dim) 
first_states = tf.reshape(tf.tile(first_states, [1, 3]), [3, hidden_state_dim]) 
# the second dynamic_rnn which handles the distinct last element 
second_outputs, second_states = tf.nn.dynamic_rnn(
    initial_state=first_states, 
    cell=cell, 
    dtype=tf.float32, 
    sequence_length=[1, 1, 1], # 3 samples with only one element 
    inputs=distinct_input # input with shape (3, 1, input_element_dim) 
) 
# calculate loss based on second_outputs 
loss = some_loss_function(second_outputs, groud_truth) 

答えて

0

これはすべきです。問題が発生している場合は、もう少し詳しく説明してください。

関連する問題