2019年1月5日 星期六

深度學習 - MNIST數據集 - 實際操作

深度學習 - MNIST數據集 - 實際操作

先載入MNIST 數據集(透過Keras的datasets)
from keras.datasets import mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

載入Keras 庫的models, layers
from keras import models
from keras import layers

深度學習操作流程如下圖:


將訓練資料X透過訓練model輸入到 layer 中,其中layer 是某種線性矩陣幾何運算,在本例中用到的layer Y'=relu(dot(w,X)+b) ,w,b 為此 layer的權重(weights)。輸入X經過layer 後的預測值跟實際值計經由損失函數(loss function)算出損失值(loss score)後,利用優化器(optimizer)藉由此損失值來調整權重,再一次迭代訓練,此例用到2層,但在實際情況可能使用到好幾層,這也是所謂deep learning。

這邊先定義訓練model ,使用Sequential,定義模型的方法有兩種:一種是使用 Sequential (僅用於層的線性堆疊,是目前最常使用的方法。另一種是函數式API(functional API),我還不懂XD。
使用兩層做迭代訓練,這邊先姑且跳過其原理,後續再來了解。

使用優化器RMSPROP, 損失函categorical_crossentropy,指標accuracy
network = models.Sequential()
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
network.add(layers.Dense(10, activation='softmax'))
network.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])

在開始訓練之前,要將資料預處理,讓其符合network要求的形狀,並且轉換值到[0,1]之間
train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images.astype('float32') / 255

準備標籤
from keras.utils import to_categorical
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)

開始訓練網絡
network.fit(train_images, train_labels, epochs=5, batch_size=128)
這裡透過fit的方式來做訓練循環,其中總共迭代訓練5次,每次將資料分成128個小批量的樣本,所以每輪訓練會更新權重60000/128~= 469次,總共更新469*5=2345次。
經過多次修正後,損失值會越來越小,使得訓練後的網絡能夠精確的判斷手寫數字。

最後,我們使用訓練後的網絡,對測試資料來進行驗證訓練結果。
test_loss, test_acc = network.evaluate(test_images, test_labels)
print('test_acc:', test_acc)



沒有留言:

張貼留言