- TF가 능숙하지 않은 개발자 입장에서 attenton구현시 고민하게 하는 부분
- seq2seq를 구현할때 tf로 구현을 하게 되면 전처리 부분을 제외하고 encoder 2줄 decoder 2줄이면 해결이 된다.( 과장해서 )
- cell을 선언하고 선언된 셀을 입력으로 dynamic_rnn에서 필요한 만큼 루프를 돌아 outputs과 state를 리턴해준다.
- ( 주의 : 리턴값 outputs은 복수이고 state는 단수이다.)
self.enc_cell = tf.nn.rnn_cell.BasicLSTMCell(self.n_hidden_size)
self.dec_cell = tf.nn.rnn_cell.BasicLSTMCell(self.n_hidden_size )
self.enc_outputs, self.enc_state = tf.nn.dynamic_rnn( self.enc_cell, self.enc_embed, sequence_length=self.seq_length, dtype=tf.float32 )
self.dec_outputs, self.dec_state = tf.nn.dynamic_rnn( self.dec_cell, self.dec_embed, initial_state=self.enc_state, dtype=tf.float32 )
- tensorflow debug tip
- _, loss = sess.run( [optimizer, loss ], feed_dict=feed_dict )
- 보통 위와 같이 사용한다.
- sess run에 feed_dict처럼 앞의 그래프 노드도 dict 형태로 입력이 가능하다. dict로 입력을 하면 return value도 dict형식으로 리턴이 되고 변수의 shape와 값을 동시에 찍어 볼수 있다.
- 예를 들면 다음과 같다.
feed_opt={
'model' : model,
'losses' : losses,
feed_dict={
enc_input : inputs_batch,
dec_input : output_batch,
targets : target_batch,
seq_length: train_sequence_length,
n_batch_size: batch_size,
}
rets = sess.run( feed_opt, feed_dict=feed_dict )
for key in rets:
val = rets[key];
print('---------------------------------------------------------------------------------')
print( 'SHAPE:' , np.shape(val), key )
#print( key + ' : ', val )
print('--------------------------------------end-------------------------------------------')