人工智慧 (Artificial Intelligence, AI),一直是大家對於科技的想像,希望電腦能像人類一樣聰明。其實,AI 已經充斥在我們生活中;而現今的代表技術正是機器學習 (Machine Learning),而眾多機器學習演算法中,深度學習 (Deep Learning) 是近期最熱絡,成長最快的技術。這篇將從最基本的數字便式學習如何實現深度學習網路。
深度學習的應用中,可以大致區分兩大類
一、使用影像資料進行分析的卷積神經網路 (Convolution Neural Networks, CNN)
二、用自然語言資料進行分析的遞歸神經網路 (Recurrent Neural Networks, RNN)
其中使用影像作為學習資料的 CNN,應用範圍最廣泛,幾乎各個領域都能看到它的蹤跡,再加上現在有許多工具或是開源軟體套件降低開發門檻,讓我們要進入 AI 的世界變得更容易,而且許多教學也都是從 CNN 開始入門,因此本文從最基本的數字辨識開始說起,這在深度學習領域來說可是像 Hello World 的存在呢。
本文將會提到
tf.keras 環境建立 MINST 資料集 CNN 模型講解 數字辨識的測試結果
其實關於 CNN 模型我已經在碩士班期間實作很多遍了,也做過更複雜的模型,這篇文章主要目的,是將之前一些經驗記錄下來,也會重新紀錄一下自己參考的東西,畢竟越久沒碰越容易忘記,順便紀錄一下可能會遇到的坑,這樣之後如果有需要重新開啟人工智慧的項目,至少還有東西可以參考,不用從頭去啃別人的文章。
環境建立 (假設有 GPU 的情況)
1. 安裝 Anaconda/Miniconda
我自己使用 Python 已經習慣用 Anaconda 了,最主要是因為它在管理各個虛擬環境實在太方便了,再加上我常常會在同台電腦同時搞好幾件事,這樣將各個環境獨立區分開來也讓我好管理。(安裝時記得要加入環境變數,這樣使用 CMD 就能用 Conda 指令了)
2. 建立支援 GPU 的開發環境 (CUDA & cudnn)
通常最多坑都是出現在這邊,因為這邊必須考慮到 Tensorflow 及 Nvidia 的 Cuda 函式庫的版本,若是沒有對到可是會出大事。
為了能確實將環境裝好,我會先去看官網安裝說明,確定所需要的版本再去下載 CUDA 及 cudnn,這邊基本上可以直接用 Google 搜尋去找就好,然後再去下載,要注意的事情是 cudnn 需要先註冊會員才能下載。載完的 CUDA 及 cudnn 分別是執行檔 (.exe) 跟壓縮檔 (.zip),要先安裝 CUDA 再裝 cudnn。
安裝 CUDA 的時候我會選擇自訂安裝,然後只裝 CUDA,沒改的話會連驅動跟其他一些東西一起裝,有時候會降驅動版本,我自己平常都會更新顯卡驅動,如果今天是新電腦的話其實也可以快速安裝,讓它自動都到它所需要的版本。
安裝 cudnn 是將解壓縮之後的檔案放到 CUDA 的資料夾中。 上面都弄好之後可以用 nvcc -V
去檢查 CUDA 是否裝成功。
3. 建立 Python 虛擬環境
我自己喜歡在全新的環境下安裝,所以像是 Jupyter Notebook 或是 Spyder 等等 IDE 都要重新用 conda 安裝。
(1) 打開 CMD,用 conda 來建立 Python 虛擬環境
conda create -n tf2 python=3.7
conda activate tf2
接下來都要在 tf2 環境下安裝套件。
(2) 使用 pip 來安裝套件
pip install tensorflow==2.X.X (2.1 - 2.4)
pip install numpy==1.19.0
pip install pydot==1.2.2
pip install h5py==2.9.0
pip install scikit-image==0.16.2
pip install Pillow
pip install opencv-python
pip install matplotlib
pip install pandas
pip install scipy
tensorflow 2.1 - 2.4 我都安裝過,目前應該是 2.4 最穩定。 (搭配 CUDA 11 + cudnn v8.0.5.39)
(3) 安裝 Spyder 及 Jupyter Notebook
現在也可以使用 VS Code,最常見的 py、ipynb 檔案都支援。
conda install spyder
conda install jupyter
MINST 資料集
- MNIST 是一個經典的手寫數字資料集
- 數字分別有從 0 到 9,共 10 種數字
- 每張圖片是 28 像素 x 28 像素 = 784 個像素來紀錄
- 60000 張訓練資料
- 10000 張測試資料
CNN 模型講解
Input → C1 → S2 → C3 → S4 → C5 → F6 → Output
LeNet-5 模型結構。 (取自 https://www.programmersought.com/article/773110617/)
數字辨識的測試結果
相關程式碼其實網路上就有很多,這邊就不再贅述,這裡放的結果都是我很久以前做的。
載入資料集並秀出第一筆影像資料。
對標記資料進行 One-hot Encoding。
每個層的輸出特徵圖。
模型的訓練過程。(左圖為準確度變化,右圖為損失變化。)
Train on 48000 samples, validate on 12000 samples
Epoch 1/10
- 16s - loss: 0.4794 - acc: 0.8641 - val_loss: 0.1600 - val_acc: 0.9547
Epoch 2/10
- 16s - loss: 0.1261 - acc: 0.9624 - val_loss: 0.0972 - val_acc: 0.9713
Epoch 3/10
- 16s - loss: 0.0824 - acc: 0.9747 - val_loss: 0.0693 - val_acc: 0.9797
Epoch 4/10
- 16s - loss: 0.0613 - acc: 0.9817 - val_loss: 0.0616 - val_acc: 0.9819
Epoch 5/10
- 16s - loss: 0.0502 - acc: 0.9846 - val_loss: 0.0573 - val_acc: 0.9831
Epoch 6/10
- 16s - loss: 0.0431 - acc: 0.9868 - val_loss: 0.0516 - val_acc: 0.9831
Epoch 7/10
- 16s - loss: 0.0355 - acc: 0.9892 - val_loss: 0.0547 - val_acc: 0.9833
Epoch 8/10
- 16s - loss: 0.0293 - acc: 0.9913 - val_loss: 0.0498 - val_acc: 0.9851
Epoch 9/10
- 16s - loss: 0.0266 - acc: 0.9918 - val_loss: 0.0424 - val_acc: 0.9880
Epoch 10/10
- 16s - loss: 0.0219 - acc: 0.9938 - val_loss: 0.0450 - val_acc: 0.9891
可以看到當時我訓練 10 個週期就達到接近 99% 的準確度,再加上當時是用 GPU 運算,其實訓練時間很短,基本上在前兩次就已經開始收斂了。
結語
在這次終於趁連假補了一個深度學習的坑,其實這篇文章是將以前做過的事情做一個紀錄,一直想將當時的東西記錄下來,但一直沒去做,因此並沒有做太詳細的說明及實作過程,程式碼其實也找不到了,但現在已經有這麼多工具及參考資料下,對我而言從頭開始寫自己模型並不困難,比較麻煩的事情其實是安裝Tensorflow,因為它每隔段時間就會更新,我那時剛學根本還沒出第2代,而每次更新或重新配置電腦時,都會發現安裝過程或是所需的檔案不一樣,經過幾次嘗試,最保險方法就是先看清楚官方文件寫的安裝說明,才是最妥的。