首頁 > 軟體

Python實現雙向RNN與堆疊的雙向RNN的範例程式碼

2022-07-04 14:02:44

1、雙向RNN

雙向RNN(Bidirectional RNN)的結構如下圖所示。

雙向的 RNN 是同時考慮“過去”和“未來”的資訊。上圖是一個序列長度為 4 的雙向RNN 結構。

雙向RNN就像是我們做閱讀理解的時候從頭向後讀一遍文章,然後又從後往前讀一遍文章,然後再做題。有可能從後往前再讀一遍文章的時候會有新的不一樣的理解,最後模型可能會得到更好的結果。

2、堆疊的雙向RNN

堆疊的雙向RNN(Stacked Bidirectional RNN)的結構如上圖所示。上圖是一個堆疊了3個隱藏層的RNN網路。

注意,這裡的堆疊的雙向RNN並不是只有雙向的RNN才可以堆疊,其實任意的RNN都可以堆疊,如SimpleRNN、LSTM和GRU這些迴圈神經網路也可以進行堆疊。

堆疊指的是在RNN的結構中疊加多層,類似於BP神經網路中可以疊加多層,增加網路的非線性。

3、雙向LSTM實現MNIST資料集分類

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import LSTM,Dropout,Bidirectional
from tensorflow.keras.optimizers import Adam
import matplotlib.pyplot as plt

# 載入資料集
mnist = tf.keras.datasets.mnist
# 載入資料,資料載入的時候就已經劃分好訓練集和測試集
# 訓練集資料x_train的資料形狀為(60000,28,28)
# 訓練集標籤y_train的資料形狀為(60000)
# 測試集資料x_test的資料形狀為(10000,28,28)
# 測試集標籤y_test的資料形狀為(10000)
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 對訓練集和測試集的資料進行歸一化處理,有助於提升模型訓練速度
x_train, x_test = x_train / 255.0, x_test / 255.0
# 把訓練集和測試集的標籤轉為獨熱編碼
y_train = tf.keras.utils.to_categorical(y_train,num_classes=10)
y_test = tf.keras.utils.to_categorical(y_test,num_classes=10)

# 資料大小-一行有28個畫素
input_size = 28
# 序列長度-一共有28行
time_steps = 28
# 隱藏層memory block個數
cell_size = 50 

# 建立模型
# 迴圈神經網路的資料輸入必須是3維資料
# 資料格式為(資料數量,序列長度,資料大小)
# 載入的mnist資料的格式剛好符合要求
# 注意這裡的input_shape設定模型資料輸入時不需要設定資料的數量
model = Sequential([
    Bidirectional(LSTM(units=cell_size,input_shape=(time_steps,input_size),return_sequences=True)),
    Dropout(0.2),
    Bidirectional(LSTM(cell_size)),
    Dropout(0.2),
    # 50個memory block輸出的50個值跟輸出層10個神經元全連線
    Dense(10,activation=tf.keras.activations.softmax)
])

# 迴圈神經網路的資料輸入必須是3維資料
# 資料格式為(資料數量,序列長度,資料大小)
# 載入的mnist資料的格式剛好符合要求
# 注意這裡的input_shape設定模型資料輸入時不需要設定資料的數量
# model.add(LSTM(
#     units = cell_size,
#     input_shape = (time_steps,input_size),
# ))

# 50個memory block輸出的50個值跟輸出層10個神經元全連線
# model.add(Dense(10,activation='softmax'))

# 定義優化器
adam = Adam(lr=1e-3)

# 定義優化器,loss function,訓練過程中計算準確率            使用交叉熵損失函數
model.compile(optimizer=adam,loss='categorical_crossentropy',metrics=['accuracy'])

# 訓練模型
history=model.fit(x_train,y_train,batch_size=64,epochs=10,validation_data=(x_test,y_test))

#列印模型摘要
model.summary()

loss=history.history['loss']
val_loss=history.history['val_loss']

accuracy=history.history['accuracy']
val_accuracy=history.history['val_accuracy']


# 繪製loss曲線
plt.plot(loss, label='Training Loss')
plt.plot(val_loss, label='Validation Loss')
plt.title('Training and Validation Loss')
plt.legend()
plt.show()
# 繪製acc曲線
plt.plot(accuracy, label='Training accuracy')
plt.plot(val_accuracy, label='Validation accuracy')
plt.title('Training and Validation Loss')
plt.legend()
plt.show()

這個可能對文字資料比較容易處理,這裡用這個模型有點勉強,只是簡單測試下。

模型摘要:

acc曲線:

loss曲線:

到此這篇關於Python實現雙向RNN與堆疊的雙向RNN的範例程式碼的文章就介紹到這了,更多相關Python 雙向RNN內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com