機器學習Basics-第十期-卷積神經網絡代碼Keras

背景

機器學習Basics-第十期-卷積神經網絡代碼Keras

上一期已經完整地介紹卷積神經網絡的組成部分。本期將用Keras 代碼建立一個簡單的卷積神經網絡。代碼來自於Toward Datascience的Rohith Gandhi

卷積神經網絡的理解,原理及細節已經在第九期介紹,所以本期主要介紹的代碼過程

如果對於基本神經網絡不太熟悉,可以看下本系列第八期。

什麼是卷積神經網絡

機器學習Basics-第十期-卷積神經網絡代碼Keras

卷積神經網絡類似於一個多層的基礎全聯接的神經網絡。主要的區別在於 該神經網絡學習的是什麼、網絡結構和主要的用途。卷積神經網絡主要應用於計算機視覺並且表現優異。

隱藏神經網絡學的是什麼?

卷積神經網絡的隱藏層會由卷積層和池化層組成。在每個卷積層,我們把一個小型的過濾器,在原始圖片中掃過和進行卷積操作。卷積操作就是矩陣相乘,然後把結果加總。

機器學習Basics-第十期-卷積神經網絡代碼Keras

與此同時,該過濾器也在訓練過程中被優化。在訓練幾遍後,過濾器會篩選出不同的特徵。

機器學習Basics-第十期-卷積神經網絡代碼Keras

接下來來到池化層。池化層一般用於降低緯度。圖片會包含很多像素點,當圖片特徵緯度大幅下降時,將會使得神經網絡學習變得簡單很多。池化層在減少參數的個數(緯度)時有非常顯著的作用。也會減少計算成本,避免過擬和。目前有兩種普遍的池化操作:

  • Max Pooling-選擇最大值;
  • Average Pooling-彙總所有值,然後取平均

不過大部分場景還是使用Max Pooling

機器學習Basics-第十期-卷積神經網絡代碼Keras

代碼

本次使用的是MNIST Dataset,手寫數字圖片庫。並且我們將使用Keras Lib

import keras
from keras.datasets import mnist

from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
import numpy as np

首先,引入所有必須的lib。Keras在建立神經網絡的時候非常非常方便。由於是對於基礎簡單的神經網絡。並且我們從Keras.dataset 中引入MNIST數據庫。同時,我們從Keras自帶模型中導入Sequential,在導入Sequential之後我們可以在後面接著引入各種層。

同時,我們也需要DropOut層,可以防止Overfitting(參見本系列第五期)。


batch_size = 128
num_classes = 10
epochs = 12
# input image dimensions
img_rows, img_cols = 28, 28
# the data, split between train and test sets
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(60000,28,28,1)
x_test = x_test.reshape(10000,28,28,1)
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')
# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

首先,我們需要reshape我們的圖片,因為CNN需要四位的矩陣。60000代表著圖片的數量,28代表圖片大小,而1代表著是圖片顏色RGB。

與此同時,我們用to_category 將 最終類型轉換為ont-hot格式,如下面所示

Y = 2 # the value 2 represents that the image has digit 2 
Y = [0,0,1,0,0,0,0,0,0,0] # The 2nd position in the vector is made 1
# Here, the class value is converted into a binary class matrix
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
activation='relu',
input_shape=(28,28,1)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))

我們建立一個Sequential Model並且增加捲積層、池化層。同時我們也在每層增加了Dropout層。最後我們增加了Dense層,並且使用的是Softmax可以用於分類。

model.compile(loss=keras.losses.categorical_crossentropy,
optimizer=keras.optimizers.Adadelta(),
metrics=['accuracy'])
model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(x_test, y_test))
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

我們的loss function是cross entropy。然後通過model.fit將圖片數據導入模型。在我們訓練12次之後,測試模型準確度

結果

機器學習Basics-第十期-卷積神經網絡代碼Keras


分享到:


相關文章: