fbpx

Keras 教學 - 訓練卷積神經網路

什麼是卷積神經網路 (CNN, Convolutional Neural Networks)?

前面的幾個學習範例都是針對數值進行訓練,近年來由於半導體與 GPU 成長快速,大家開始讓類神經網路大量學習多媒體資訊,其中 CNN 的架構特別在圖像領域有很好的學習效果。CNN 在影像辨識中發揮很大的成效,卷積層可以學習到影像中的特徵,比如形狀、紋理、顏色等等...但卷積層的訓練是很耗費運算的一項工作~如果沒有大量的資料不容易訓練出優異的卷積層網路。

在實際的原理上 CNN 是透過不同大小 Mask 對影像進行掃描,相當於將平面資料投射到另一個複雜的特徵空間,典型的 CNN 架構如下:

CNN

如果你想了解卷積如何運算,可以參考這一篇文章「What is Convolution Neural Network?」。

由於 CNN 的訓練需要大量的圖片資料與計算,我們先介紹一下機器學習中的「資料集」概念,開始訓練網路以前一定要先有正確的資料集,這樣獲得的效果才會好一些。

關於機器學習訓練資料集的基本概念

一般來說資料集的組成我們分為「訓練、驗證、測試」三種資料集與未來真正會碰到的新資料,每種資料及可能的比例如下:

dataset-distribute

為什麽要分為「訓練、驗證、測試」三種資料集?

由於在訓練模型的過程中,我們會不停的調整參數,好讓準確性提高 (對於驗證資料集越來越高)。但是每一次調整都會將驗證資料集的資訊洩漏到模型中,如果沒有切割出乾淨的「測試資料」,就會在調整參數時被我們手動 Over Fitting,就會發生在實驗測試的時候效果很好,但是實際上線遇到真實的資料反而表現不如預期

最終我們期望訓練出來的模型是可以預測「未來的資料」的,因此把測試資料分開是比較好的作法。

如果原始的資料集數量太少,也可以利用「K 折驗證」來獲得一點改善的空間。

在進行 CNN 也是一樣的道理,我們需要大量建立訓練的資料集,然而圖片與一般數字型態資料集不太一樣,在資料集不足的情況下我們可以透過擴增資料技術來產生更多的影像數據,讓網路可以學習更多元的特徵。一般樣本足夠的情況會像下面這樣切分資料集:

dataset-normal

如果原始樣本數量不夠,K 折驗證的方式是把所有樣本除了測試以外剩下的資料分成 K 群,每次都用不同的組合訓練 Model,最後取平均值作為評估的依據。如下:

dataset-kclass

除了以上介紹的 K 折驗證方法來訓練模型,實際上獲得的改善空間有限,接下來我們持續介紹其他可以提升訓練成效的方法,並且透過實際的案例進行模型訓練。