Bi-LSTM的理解以及 Tensorflow實現
阿新 • • 發佈:2018-11-09
Bidirectional LSTM,由兩個LSTMs上下疊加在 一起組成。輸出由這兩個LSTMs的隱藏層的狀態決定。
def bilstm(self,x): # 輸入的資料格式轉換 # x.shape [batch_size, time_steps, input_size] x=tf.transpose(x,[1,0,2]) fw_x = tf.reshape(x, [-1, self.n_input_text]) # step*batch, feature fw_x = tf.split(0, self.n_step_text, fw_x) with tf.variable_scope('bilstm_lt'): #定義Cell,單層LSTM lstm_fw_cell = rnn_cell.BasicLSTMCell(self.n_hidden_text, forget_bias=1.0, state_is_tuple=True)#前向的lstm cell lstm_bw_cell = rnn_cell.BasicLSTMCell(self.n_hidden_text, forget_bias=1.0, state_is_tuple=True)#反向的rnn cell #dropout lstm_fw_cell = rnn_cell.DropoutWrapper(cell=lstm_fw_cell, input_keep_prob=1.0, output_keep_prob=keep_prob) lstm_bw_cell = rnn_cell.DropoutWrapper(cell=lstm_bw_cell, input_keep_prob=1.0, output_keep_prob=keep_prob) #構建雙向的RNN網路 with tf.variable_scope('fw_lt'): (output_fw, state_fw) = rnn.rnn(lstm_fw_cell,fw_x,dtype=tf.float32) t=tf.convert_to_tensor(output_fw) print (t.get_shape().as_list()) with tf.variable_scope('bw_lt'): bw_x = tf.reverse(x, [True,False,False])# reverse time dim bw_x = tf.reshape(bw_x, [-1, self.n_input_text]) # step*batch, feature bw_x = tf.split(0, self.n_step_text, bw_x) (output_bw, state_bw) = rnn.rnn(lstm_bw_cell,bw_x,dtype=tf.float32) # output_bw.shape = [timestep_size, batch_size, hidden_size] output_bw = tf.reverse(output_bw, [True,False,False]) output = tf.concat(2,[output_fw, output_bw])#在第2個維度上,將output_fw, output_bw拼接 return output#返回值:(outputs, output_states:最後一層隱藏層)