2017-07-12 8 views
0

トランケートバックプロパゲーションを適用するために、バッチで計算されたfinal_stateを次のバッチに転送します。私はプレースホルダを介して状態を取得していますが、その型は異なり、初期状態として直接渡すことはできません。私はこの操作をしたい。私はテンソルフローの初心者です。私はこの操作に助けが必要です。要するにtf.nn.bidirectional_dynamic_rnnを使用してトレーニング中にバッチ間で状態を渡す方法は?

#starting of LSTM 
def lstm_cell_f() : 
return tf.contrib.rnn.BasicLSTMCell(size,reuse=tf.get_variable_scope().reuse) 

def lstm_cell_b() : 
return tf.contrib.rnn.BasicLSTMCell(size, reuse=tf.get_variable_scope().reuse) 

cell_f = tf.contrib.rnn.MultiRNNCell([lstm_cell_f() for _ in range(num_layers)]) 
cell_b = tf.contrib.rnn.MultiRNNCell([lstm_cell_b() for _ in range(num_layers)]) 

initial_state_f = cell_f.zero_state(batch_size, dtype = tf.float32) 
initial_state_b = cell_b.zero_state(batch_size, dtype = tf.float32) 

def RNN_OUT(da,state_f, state_b) : 
    outputs, states = tf.nn.bidirectional_dynamic_rnn(cell_f,cell_b, da, initial_state_fw=initial_state_f, initial_state_bw=initial_state_b, swap_memory=True) 
    return states, tf.concat(outputs, 2) 

i_state_f = tf.placeholder(tf.float32, None, name="i_state_f") 
i_state_b = tf.placeholder(tf.float32, None, name="i_state_b") 

_input = tf.placeholder(tf.float32, shape = [batch_size, num_steps, size], name="input") 
final_states, _output = RNN_OUT(_input, i_state_f, i_state_b) 

、私はプレースホルダを使用してバックfinal_statesを送信して、両方の前方と後方lstmsのinitial_statesのためにそれを使用したい...

答えて

0

私はthis linkで答えを得ました。 答えを完全に検索せずにこの質問を投稿して申し訳ありません。

def RNN_OUT(da,state_f, state_b) : 
    outputs, states = tf.nn.bidirectional_dynamic_rnn(cell_f,cell_b, da, initial_state_fw=state_f, initial_state_bw=state_b, swap_memory=True) 

i_state_f = tf.placeholder(tf.float32, shape=[num_layers, 2, batch_size, size], name="i_state_f") 
l_f = tf.unstack(i_state_f, axis=0) 
rnn_state_f = tuple(
    [tf.contrib.rnn.LSTMStateTuple(l_f[idx][0],l_f[idx][1]) 
     for idx in range(num_layers)]) 
i_state_b = tf.placeholder(tf.float32, shape=[num_layers, 2, batch_size, size], name="i_state_b") 
l_b = tf.unstack(i_state_b, axis=0) 
rnn_state_b = tuple(
    [tf.contrib.rnn.LSTMStateTuple(l_b[idx][0],l_b[idx][1]) 
     for idx in range(num_layers)]) 
_input = tf.placeholder(tf.float32, shape = [batch_size, num_steps, size], name="input") 
final_states, _output = RNN_OUT(_input, rnn_state_f, rnn_state_b) 
関連する問題