iT邦幫忙

2023 iThome 鐵人賽

DAY 1
0
AI & Data

CNN/DNN Training by using Google TensorFlow系列 第 5

【Day 05】簡介與示範 Convolutional 與 Recurrent 神經網路

  • 分享至 

  • xImage
  •  

零、歷史背景

在 2014 年,也就是 Google 發表 TensorFlow 的隔年,Google 研究人員便嘗試在 TensorFlow 之中整合 CNN 與 RNN,使整個系統可以做到將人類行為進行分析與分類,之後便經過不斷改良,使其不僅能更準確分析純圖像並做文字說明、更是透過反覆訓練而大幅改善其系統的精準度。如今,CNN 與 RNN 的模型被廣泛應用在語音辨識、影片自生成字幕等,也使許多整合開發功能更加有效率,其能處理的難度與深度也大幅提升。不可諱言,這樣的整合為人們帶來前所未有的便利性。那 CNN 與 RNN 到底是什麼呢?

一、簡介RNN 與 CNN 是什麼?

本章節會對 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 的 TensorFlow 範例[2]

我們先用 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 視覺化景象的資料表現中,是屬於哪一分類的機率為何。

https://ithelp.ithome.com.tw/upload/images/20230922/20163203XZumbaCVfO.jpg

2.在模型建立後,我們指定 Loss Function、Optimizer 以及 Metrics 進行編譯與訓練

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=10)

https://ithelp.ithome.com.tw/upload/images/20230922/20163203PqDcnOE0XG.jpg

3.模型經過訓練後,我們就可以在 Model.fit() 內所設定的 Validation Split 當中,所被留下的資料集做評估。我們最後得到 65.71% 的準確度

test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
print(test_acc)

https://ithelp.ithome.com.tw/upload/images/20230922/20163203xZdIZl4VI4.jpg

三、用於 RNN 的 TensorFlow 範例

接下來我們來試運行 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 層,可以用來做二分法的分類任務。

https://ithelp.ithome.com.tw/upload/images/20230922/20163203m1x4IyDJVY.jpg

2.在模型建立後,我們指定 Loss Function、Optimizer 以及 Metrics 進行編譯與訓練

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=10)

https://ithelp.ithome.com.tw/upload/images/20230922/20163203xijh9mQcmY.jpg

3.模型經過訓練後,我們就可以在 Model.fit() 內所設定的 Validation Split 當中,所被留下的資料集做評估。我們最後得到 82.51% 的準確度

test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
print(test_acc)

https://ithelp.ithome.com.tw/upload/images/20230922/20163203G1PYrPY4hg.jpg

四、 總結
我們已經藉由上面 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


上一篇
【Day 04】利用 TensorFlow 分析心血管疾病之發生率
下一篇
【Day 06】概略了解 Keras API 的摘要 - Part 1. Layers / Model / Module
系列文
CNN/DNN Training by using Google TensorFlow12
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言