tensorflow rnn でデコーダーを作成する方法を知りたいのですが、i 番目の出力を (i+1) 番目の入力にフィードします
入力には 20 のシーケンスと 3680 の次元があり、出力には 39 のシーケンスと 3680 の次元があり、すべてのデータは 0 ~ 1 の数値です
ここに私のモデルがあります
with tf.variable_scope('encoder'):
enc_input = tf.placeholder(tf.float32,[None, input_sequence_length, input_dim])
enc_cell = tf.contrib.rnn.BasicLSTMCell(num_units = input_sequence_length)
_ , encoder_states = tf.nn.dynamic_rnn(enc_cell, enc_input , dtype=tf.float32)
with tf.variable_scope('decoder'):
dec_input = tf.placeholder(tf.float32,[None, output_sequence_length, output_dim])
dec_output = tf.placeholder(tf.float32,[None, output_sequence_length, output_dim])
dec_cell = tf.contrib.rnn.BasicLSTMCell(num_units = output_sequence_length)
outputs , _ = tf.nn.dynamic_rnn(dec_cell, dec_input,dtype = tf.float32,
initial_state = encoder_states)
前の出力を次の入力にフィードするデコーダ モデルを作成するにはどうすればよいですか?
PS
このような自己回答コードを作成します
with tf.variable_scope('decoder'):
dec_input = tf.placeholder(tf.float32,[None, 1, output_dim])
dec_output = tf.placeholder(tf.float32,[None, output_sequence_length, output_dim])
outputs = []
state = encoder_states
dec_cell = tf.contrib.rnn.BasicLSTMCell(num_units = dec_hidden_size)
for i in range(output_sequence_length):
if i==0:
output , state = tf.nn.dynamic_rnn(dec_cell, dec_input, initial_state = state, dtype = tf.float32)
outputs.append(output)
else:
output , state = tf.nn.dynamic_rnn(dec_cell,
output,
initial_state = state,
dtype = tf.float32)
outputs.append(output)
outputs = tf.reshape(outputs,[-1,output_dim])
outputs = tf.reshape(outputs,[-1,output_sequence_length,output_dim])
このコードの出力は上のコードの出力とは異なると思いますが、正しく動作したかどうかはわかりません。
テンソルフロー方式でループ関数((i)output->(i+1)input)を持つデコーダを作るには、上位のコードよりも多くのメモリ割り当てが必要になるため、どうすればよいかまだ疑問です。(私の考えでは、細胞数は同じです)