本文我們将學習使用Keras一步一步搭建一個卷積神經網絡。具體來說,我們将使用卷積神經網絡對手寫數字(MNIST資料集)進行識别,并達到99%以上的正确率。
我們還将介紹Colaboratory——一個免費的Jupyter notebook環境,關鍵的是可以免費使用GPU(學生黨買不起呀)!
為什麼選擇Keras呢?主要是因為簡單友善。更多細節請看:https://keras.io/
什麼卷積神經網絡?簡單地說,卷積神經網絡(CNNs)是一種多層神經網絡,它可以有效地減少全連接配接神經網絡參數量太大的問題。如果對其背後的原理感興趣的話,鬥膽推薦一些學習資料:
深度學習入門:基于Python的理論與實作
Neural Networks and Deep Learning
CS231n: Convolutional Neural Networks for Visual Recognition
下面就直接進入主題吧!
1. 搭建環境
如果想要在個人電腦上搭建的話,我們需要先安裝好Python,進入:https://www.python.org/
下載下傳安裝就好。
之後,打開終端輸入
pip install -i https://pypi.douban.com/simple keras
輸入以下指令可以确認正常安裝:
python -c "import keras;print(keras.__version__)"
當然,如果想直接使用Colaboratory的話,直接打開你的Google雲端硬碟
為了友善起見,建立一個名為Keras的檔案夾,進入Keras檔案夾,單擊滑鼠右鍵
選擇
Colaboratory
就可建立一個Jupyter notebok啦!
如果沒有看到
Colaboratory
這一項的話,就選擇關聯更多應用
搜尋
Colaboratory
,并關聯即可。
2. 導入庫和子產品
我們導入
Sequential
模型(相當于放積木的桌子)
from keras.models import Sequential
接下來,我們導入各種層(各種形狀各異積木)
from keras.layers import Conv2D, MaxPool2D
from keras.layers import Dense, Flatten
最後,我們導入
to_categorical
函數,以便之後對資料進行轉換
from keras.utils import to_categorical
3. 加載資料
MNIST是一個非常有名的手寫數字資料集,我們可以使用Keras輕松加載它。
from keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
檢視一下訓練集的大小
print(x_train.shape)
# (60000, 28, 28)
可以看到60000個樣本,它們都是28像素x28像素的。
看一下這些手寫數字長什麼樣
import matplotlib.pyplot as plt
%matplotlib inline
plt.imshow(x_train[0])
4. 預處理資料
使用Keras是必須顯式聲明輸入圖像深度的尺寸。例如,具有所有3個RGB通道的全色圖像的深度為3。
我們的MNIST圖像的深度為1,但我們必須明确聲明。
也就是說,我們希望将資料集從形狀
(n,rows,cols)
轉換為
(n,rows,cols,channels)
。
img_x, img_y = 28, 28
x_train = x_train.reshape(x_train.shape[0], img_x, img_y, 1)
x_test = x_test.reshape(x_test.shape[0], img_x, img_y, 1)
除此之外,我們将資料标準化一下:
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
之後,将标記值(y_train, y_test)轉換為
One-Hot Encode
的形式,至于為什麼要這麼做?請檢視:https://machinelearningmastery.com/why-one-hot-encode-data-in-machine-learning/
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
print(y_train.shape)
# (60000, 10)
5. 定義模型結構
我們參照下圖定義一個模型結構
代碼如下:
model = Sequential()
model.add(Conv2D(32, kernel_size=(5,5), activation='relu', input_shape=(img_x, img_y, 1)))
model.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))
model.add(Conv2D(64, kernel_size=(5,5), activation='relu'))
model.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))
model.add(Flatten())
model.add(Dense(1000, activation='relu'))
model.add(Dense(10, activation='softmax'))
是不是有點搭積木的既視感?
6. 編譯
現在,隻需要編譯模型,就可以開始訓練了。當編譯模型時,我們聲明了損失函數和優化器(SGD,Adam等)。
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
Keras有很多損失函數和優化器供你選擇。
7. 訓練
接下來,我們傳入訓練集進行訓練
model.fit(x_train, y_train, batch_size=128, epochs=10)
以下是在
Colaboratory
上訓練的過程
以下是在個人電腦上訓練的過程
可以看到,花費的時間差别還是很大的!
8. 評估模型
最後,傳入測試集對模型模型進行評估
score = model.evaluate(x_test, y_test)
print('acc', score[1])
# acc 0.9926
準确率達到了%99以上!
完整代碼如下:
# 2. 導入庫和子產品
from keras.models import Sequential
from keras.layers import Conv2D, MaxPool2D
from keras.layers import Dense, Flatten
from keras.utils import to_categorical
# 3. 加載資料
from keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 4. 資料預處理
img_x, img_y = 28, 28
x_train = x_train.reshape(x_train.shape[0], img_x, img_y, 1)
x_test = x_test.reshape(x_test.shape[0], img_x, img_y, 1)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
# 5. 定義模型結構
model = Sequential()
model.add(Conv2D(32, kernel_size=(5,5), activation='relu', input_shape=(img_x, img_y, 1)))
model.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))
model.add(Conv2D(64, kernel_size=(5,5), activation='relu'))
model.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))
model.add(Flatten())
model.add(Dense(1000, activation='relu'))
model.add(Dense(10, activation='softmax'))
# 6. 編譯
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
# 7. 訓練
model.fit(x_train, y_train, batch_size=128, epochs=10)
# 8. 評估模型
score = model.evaluate(x_test, y_test)
print('acc', score[1])
參考
[1] https://elitedatascience.com/keras-tutorial-deep-learning-in-python
[2] http://adventuresinmachinelearning.com/keras-tutorial-cnn-11-lines/