使用tensorflow搭建一個簡單的LSTM網絡前向傳播過程

長短時記憶網絡LSTM可以學習到距離很遠的信息,解決了RNN無法長期依賴的問題。
在TensorFlow中,LSTM結構可以被很簡單的實現,tf封裝了LSTM結構。以下代碼就是使用tensorflow搭建的LSTM網絡前向傳播過程。

import tensorflow as tf

# 定義一個lstm結構,在tensorflow中通過一句話就能實現一個完整的lstm結構
# lstm中使用的變量也會在該函數中自動被聲明
lstm = tf.nn.rnn_cell.BasicLSTMCell(lstm_hidden_size)

# 將lstm中的狀態初始化爲全0數組,BasicLSTMCell提供了zero_state來生成全0數組
# 在優化RNN時每次也會使用一個batch的訓練樣本,batch_size給出了一個batch的大小
state = lstm.zero_state(batch_size, tf.float32)

# 定義損失函數
loss = 0.0
# 爲了在訓練中避免梯度彌散的情況,規定一個最大的序列長度num_steps
for i in range(num_steps):
    # 在第一個時刻聲明lstm結構中使用的變量,在之後的時刻都需要重複使用之前定義好的變量
    if i>0:
        tf.get_variable_scope().reuse_variables()
    # 每一步處理時間序列中的一個時刻,將當前輸入current_input和前一時刻狀態state傳入LSTM結構
    # 就可以得到當前lstm結構的輸出lstm_output和更新後的狀態state
    lstm_output, state = lstm(current_input, state)
    # 將當前時刻lstm輸出傳入一個全連接層得到最後的輸出
    final_output = fully_connected(lstm_output)
    # 計算當前時刻輸出的損失
    loss += calc_loss(final_output, expected_output)

注: RNN中也有 dropout 方法,但是RNN一般只在不同層循環體結構之間使用dropout,而不在同一層傳遞的時候使用。
在tensorflow中,使用tf.nn.rnn_cell.DropoutWrapper類可以很容易實現dropout功能。

# 使用DropoutWrapper類來實現dropout功能,可以通過兩個參數來控制dropout概率
# input_keep_prob用來控制輸入的dropout概率,output_keep_prob用來控制輸出的dropout概率
# output_keep_prob=0.9爲被保留的數據爲90%,將10%的數據隨機丟棄
dropout_lstm = tf.nn.rnn_cell.DropoutWrapper(lstm, output_keep_prob=0.9)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章