在 2014 年,也就是 Google 發表 TensorFlow 的隔年,Google 研究人員便嘗試在 TensorFlow 之中整合 CNN 與 RNN,使整個系統可以做到將人類行為進行分析與分類,之後便經過不斷改良,使其不僅能更準確分析純圖像並做文字說明、更是透過反覆訓練而大幅改善其系統的精準度。如今,CNN 與 RNN 的模型被廣泛應用在語音辨識、影片自生成字幕等,也使許多整合開發功能更加有效率,其能處理的難度與深度也大幅提升。不可諱言,這樣的整合為人們帶來前所未有的便利性。那 CNN 與 RNN 到底是什麼呢?
本章節會對 CNN 與 RNN 做簡介,與簡單說明他們與 TensorFlow 有甚麼關係。有關 CNN 與 RNN 的詳細內容,會另有文章針對其原理做更詳細的說明。[1]
1.Convolutional Neural Network(CNN)捲積神經網路
CNN 主要適合進行影像處理任務,其工作原理是透過從圖像提取空間特徵,再使用這些特徵對影像進行分類與分割。主要可以分為這三層:
(1)Convolution Layer(卷積層):可以從輸入影像中提取空間特徵。
(2)Pooling Layer(池化層):以減少 Convolution Layer 產生之特徵圖的大小。
(3)Fully Connected Layer(全連接層):被用做分類或分割影像
2.Recurrent Neural Network(RNN)循環神經網路
RNN 相較起來較為通用,可用於影像、自然語言處理、以及機器自動翻譯,其工作原理是透過學習所輸入資料的一系列轉換,再產生用做「分類」或「預測」後輸出。主要可以分為這三層:
(1)Input Layer(輸入層):讓資料輸入給 Hidden Layer。
(2)Hidden Layer(隱藏層):目的在將輸入的資料做轉換。
(3)Output Layer(輸出層):這層就會進行分類與預測,而後輸出。
我們先用 CNN 做舉例,並參考之前【Day 03】與【Day 04】的程式架構,我們會引用 CIFAR10 datasets做 CNN 的示範與訓練。CIFAR10 是一種小型的影像資料集,由10 種 不同類別的 6萬張 32×32 彩色圖像組合,每個類別有 6,000 張圖片;其中有 83% 用於訓練;17% 用於測試。我們便透過 CNN 來將這些圖片做分類
0.導入必要之 Library ,以及 CIFAR10 的資料集並分為訓練組與測試組
Import tensorflow as tf
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()
並將其 Labels 轉為 one-hot 編碼的分類格式:
y_train = tf.keras.utils.to_categorical(y_train, 10)
y_test = tf.keras.utils.to_categorical(y_test, 10)
1.透過 tf.keras.Sequential
來將每個 Layer 堆疊再一起,以先建立模型
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)),
tf.keras.layers.MaxPooling2D((2, 2)),
tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
tf.keras.layers.MaxPooling2D((2, 2)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')])
model.summary()
在 Sequential 程式模型中
(1)第一個 Convolution Layer 具有 32 個大小為 3x3 的濾波器,用以提取輸入影像的特徵,再以具有 2x2 大小的 pool 的 Pooling Layer 將解析度減半
(2)第二個 Convolution Layer 具有 64 個大小為 3x3 的濾波器,經由上層中提取更加複雜的輸入影像的特徵,再以相同的 Pooling Layer 將解析度再次減半
(3)第五行的 Flatterning Layer將 2D 特性圖轉換成 1D 向量;
(4)後兩行的第一個 Dense Layer 具 64 個神經元,用 ReLU
來學習輸入影像中較高級的資料表現
(5)後兩行的第二個 Fully-Connected Layer (Dense Layer) 具 10 個神經元,用 Softmax
函數來預測一個 2D 視覺化景象的資料表現中,是屬於哪一分類的機率為何。
2.在模型建立後,我們指定 Loss Function、Optimizer 以及 Metrics 進行編譯與訓練
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=10)
3.模型經過訓練後,我們就可以在 Model.fit()
內所設定的 Validation Split 當中,所被留下的資料集做評估。我們最後得到 65.71% 的準確度
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
print(test_acc)
接下來我們來試運行 RNN,我們參考上方的程式架構,我們會引用 IMDb datasets 做 RNN 的示範與訓練。IMDb 是影評與其評分的大型資料庫,裡面超過 50,000 個影評,並附上 1-10 的評分。我們接下來會透過 RNN 來區分正面或負面的影評:
(以下是直接引用現成於 TensorFlow 當中的函式庫)
0.導入必要之Library ,以及 IMDb資料集並分為訓練組與測試組
import tensorflow as tf
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.imdb.load_data(num_words=10000)
並把其讀取到的陣列中的空格填充起來,確保每個 Sequence 都有相同的資料長度。我們就把長度設為 100,再將多餘的空格填充起來。
x_train = tf.keras.preprocessing.sequence.pad_sequences(x_train, maxlen=100)
x_test = tf.keras.preprocessing.sequence.pad_sequences(x_test, maxlen=100)
1.透過 tf.keras.Sequential
先建立模型:
model = tf.keras.models.Sequential([
tf.keras.layers.Embedding(10000, 128, input_length=100),
tf.keras.layers.LSTM(64),
tf.keras.layers.Dense(1, activation='sigmoid')
])
在 Sequential 程式模型中
(1)在 Input Layer 中,我們讓輸入的詞彙量是 10,000 個單字,每個單字都以 128 維度的向量表示,再將輸入的長度設為 100。
(2)在 Hidden Layer 中,是我們應用 RNN 當中其一種類的 LSTMs
函數,會依照序列來處理任務
(3)在 Output Layer 中,我們設定一位元的 Sigmoid
的 Dense 層,可以用來做二分法的分類任務。
2.在模型建立後,我們指定 Loss Function、Optimizer 以及 Metrics 進行編譯與訓練
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=10)
3.模型經過訓練後,我們就可以在 Model.fit()
內所設定的 Validation Split 當中,所被留下的資料集做評估。我們最後得到 82.51% 的準確度
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
print(test_acc)
四、 總結
我們已經藉由上面 CNN 與 RNN 的兩個示範程式,了解到 TensorFlow 結合其他深度學習模型的應用。接下來我們將會持續擴充 TensorFlow 的其他功能,如:分散式訓練、視覺文字音訊、結構化資料、模型最佳化 等章節前進。
五、 參考資料
[1] Compare and contrast of CNN & RNN:
https://hackernoon.com/intro-to-neural-networks-cnn-vs-rnn-it193tug
[2] CNN codes reference is from the link below and RNN codes are modified based on CNN codes.
https://www.tensorflow.org/tutorials/images/cnn