天天看點

keras卷積處理rgb輸入_用Keras搭建卷積神經網絡 以及 使用Colaboratory

本文我們将學習使用Keras一步一步搭建一個卷積神經網絡。具體來說,我們将使用卷積神經網絡對手寫數字(MNIST資料集)進行識别,并達到99%以上的正确率。

keras卷積處理rgb輸入_用Keras搭建卷積神經網絡 以及 使用Colaboratory

我們還将介紹Colaboratory——一個免費的Jupyter notebook環境,關鍵的是可以免費使用GPU(學生黨買不起呀)!

keras卷積處理rgb輸入_用Keras搭建卷積神經網絡 以及 使用Colaboratory
為什麼選擇Keras呢?

主要是因為簡單友善。更多細節請看:https://keras.io/

什麼卷積神經網絡?

簡單地說,卷積神經網絡(CNNs)是一種多層神經網絡,它可以有效地減少全連接配接神經網絡參數量太大的問題。如果對其背後的原理感興趣的話,鬥膽推薦一些學習資料:

深度學習入門:基于Python的理論與實作

Neural Networks and Deep Learning

CS231n: Convolutional Neural Networks for Visual Recognition

下面就直接進入主題吧!

1. 搭建環境

如果想要在個人電腦上搭建的話,我們需要先安裝好Python,進入:https://www.python.org/

keras卷積處理rgb輸入_用Keras搭建卷積神經網絡 以及 使用Colaboratory

下載下傳安裝就好。

之後,打開終端輸入

pip install -i https://pypi.douban.com/simple keras

keras卷積處理rgb輸入_用Keras搭建卷積神經網絡 以及 使用Colaboratory

輸入以下指令可以确認正常安裝:

python -c "import keras;print(keras.__version__)"
           
keras卷積處理rgb輸入_用Keras搭建卷積神經網絡 以及 使用Colaboratory

當然,如果想直接使用Colaboratory的話,直接打開你的Google雲端硬碟

keras卷積處理rgb輸入_用Keras搭建卷積神經網絡 以及 使用Colaboratory

為了友善起見,建立一個名為Keras的檔案夾,進入Keras檔案夾,單擊滑鼠右鍵

keras卷積處理rgb輸入_用Keras搭建卷積神經網絡 以及 使用Colaboratory

選擇

Colaboratory

就可建立一個Jupyter notebok啦!

如果沒有看到

Colaboratory

這一項的話,就選擇關聯更多應用

keras卷積處理rgb輸入_用Keras搭建卷積神經網絡 以及 使用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])
           
keras卷積處理rgb輸入_用Keras搭建卷積神經網絡 以及 使用Colaboratory

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. 定義模型結構

我們參照下圖定義一個模型結構

keras卷積處理rgb輸入_用Keras搭建卷積神經網絡 以及 使用Colaboratory

代碼如下:

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

上訓練的過程

keras卷積處理rgb輸入_用Keras搭建卷積神經網絡 以及 使用Colaboratory

以下是在個人電腦上訓練的過程

keras卷積處理rgb輸入_用Keras搭建卷積神經網絡 以及 使用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/