TensorFlow1.x入門(10)——循環神經網絡(RNN)

系列文章

1. 計算圖的創建與啓動

2. 變量的定義及其操作

3. Feed與Fetch

4. 線性迴歸

5. 構建非線性迴歸模型

6. 簡單分類問題

7. Dropout與優化器

8. 手動調整學習率與TensorBoard

9. 卷積神經網絡(CNN)

循環神經網絡(RNN)

引言

循環神經網絡(Recurrent Neural Network, RNN)是深度神經網絡中重要組成部分,常用於處理時序問題。但是它本身不適用於對圖片信息的理解,所以在圖像識別領域不常用,但是在NLP和語音識別領域較爲常用。

知識點

tf.contrib.rnn.BasicLSTMCell()用於定義LSTM網絡,LSTM作爲RNN族中的一種可以很好的控制梯度爆炸和梯度消失的問題。參數lstm_size代表了當前LSTM的維度如何。

tf.nn.dynamic_rnn()是RNN的動態展開函數,接收輸入的數據inputs和lstm_cell,訓練時按照序列長度進行展開。返回的結果爲outputs和final_state,前者爲網絡中的每個時間步的輸出的綜合,後者爲最後一個cell的state。

示例

#%% md
# 循環神經網絡(RNN)
#%% md
循環神經網絡(RNN)主要用於處理序列問題,針對時序建模,通過時間步遞歸(循環)來更新參數。
#%% md
導包
#%%
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
#%% md
載入數據
#%%
mnist = input_data.read_data_sets("MNIST", one_hot=True)
#%% md
超參數設置
#%%
n_inputs = 28  # 每個輸入的維度
max_times = 28 # 序列的最大輸入步數
lstm_size = 100 # LSTM的hidden_dim(可認爲是RNN)
n_classes = 10 # 類別
batch_size = 32
n_batchs = mnist.train.num_examples // batch_size
#%% md
定義placeholder
#%%
x = tf.placeholder(tf.float32, [None, 784])
y = tf.placeholder(tf.float32, [None, 10])
#%% md
初始化網絡的權值和偏置值
#%%
weights = tf.Variable(tf.truncated_normal([lstm_size, n_classes], stddev=0.1))
biases = tf.Variable(tf.constant(0.1,shape=[n_classes]))
#%% md
定義RNN網絡
#%%
def RNN(x, w, b):
    inputs = tf.reshape(x, [-1, max_times, n_inputs])
    lstm_cell = tf.contrib.rnn.BasicLSTMCell(lstm_size)
    output, final_state = tf.nn.dynamic_rnn(lstm_cell, inputs, dtype=tf.float32)
    result = tf.nn.softmax(tf.matmul(final_state[1], w) + b)
    return result
#%%
prediction = RNN(x, weights, biases)
#%%
prediction
#%% md
定義損失函數與優化器
#%%
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=prediction, labels=y))
train_step = tf.train.AdamOptimizer(1e-4).minimize(loss)
#%% md
獲取測評結果
#%%
correct_prediction = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
#%% md
初始化計算圖中的變量
#%%
init = tf.global_variables_initializer()
#%% md
訓練
#%%
with tf.Session() as sess:
    sess.run(init)
    for epc in range(100):
        for batch in range(n_batchs):
            batch_xs, batch_ys = mnist.train.next_batch(batch_size)
            sess.run([train_step],{x:batch_xs, y:batch_ys})
        acc, l = sess.run([accuracy, loss], {x:mnist.test.images, y:mnist.test.labels})
        print("Iter: " +str(epc) + " Accurcay: " + str(acc) + " Loss: " + str(l))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章