2021-03-24
阿新 • • 發佈:2021-03-26
使用Keras進行神經網路架構學習
前段時間學習了CS231N的相關課程,對於神經網路有了一定的瞭解,也做了幾個assignment。就正如每個作業對於神經網路內部有較好的學習掌握,但是例如編寫一個VGG16網路可就太麻煩了,需要一層層搭建。經過師兄推薦使用Keras架構搭建方便多了。
我眼中的Keras
根據已知的Tensorflow的架構,擴張內容,減少編寫的難度,簡單入手,但是要是理解內部每個函式的多種引數的用法需要認真學習深度學習內的內容。筆者舉個例子,普通的搭建神經網路,編寫前向傳播反向傳播就好比手寫計算題;而使用Keras搭建就好比使用計算器計算計算題,只需要輸入公式和引數就可以得到結果。
計劃任務
該學習需要和神經網路學習相輔相成,兩塊內容都會更新。
任務一 MNIST手寫體識別
任務簡介:使用MNIST資料集,用訓練集訓練一個神經網路,使用測試集去檢測網路的準確性。
任務分析:MNIST資料集,60000個訓練集和10000個測試集組成的資料庫,且每一個數據都有一個標籤,標記該資料為什麼數字。每個資料都是由28*28的畫素組成,再增加一個標籤,那麼一個數據為785個引數。
然後將訓練集資料放入編寫的神經網路,訓練神經網路的引數。之後使用測試集,我們假裝標籤未知,從而讓網路進行預測,若輸出結果與標籤一致則記為1,否則為0。
最後計算測試集的準確率,即最後輸出得分/10000即可。
程式
# 即使在python2. X,使用print就得像python3.X那樣加括號使用
from __future__ import print_function
import numpy as np
from keras.datasets import mnist
#Sequential model表示所有層輸出都是一個,多個輸出使用API model
from keras.models import Sequential
#Dense 全連結層, Activation **層
from keras.layers.core import Dense, Activation
#SGD 優化方式,即對於學習率的一個縮減的優化方法
from keras.optimizers import SGD
#一種矩陣處理標頭檔案
from keras.utils import np_utils
#重複性設定
np.random.seed(1671)
NB_EPOCH = 200
BATCH_SIZE = 128
VERBOSE = 1
#輸出個數等於數字個數
NB_CLASSES = 10
OPTIMIZER = SGD()
N_HIDDEN = 128
#訓練集中用作驗證集的資料比例
VALIDATION_SPLIT = 0.2
#資料:混合並劃分訓練集和測試集資料,無需下載資料集
(X_train, y_train), (X_test, y_test) = mnist.load_data()
#X_train是60000行28*28的資料,變形為60000*784
RESHAPE = 784
X_train = X_train.reshape(60000, RESHAPE)
X_test = X_test.reshape(10000, RESHAPE)
#轉化陣列的資料型別
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
#歸一化處理,將畫素值資料縮小到[0,1]之間
X_train /= 255
X_test /= 255
print(X_train.shape[0], 'train samples')
print(X_test.shape[0], 'test samples')
# 是把類別標籤轉換為onehot編碼, reshape函式類似
Y_tarin = np_utils.to_categorical(y_train, NB_CLASSES)
Y_test = np_utils.to_categorical(y_test, NB_CLASSES)
#10個輸出
#最後是softmax**函式
model = Sequential()
model.add(Dense(NB_CLASSES, input_shape=(RESHAPE, )))
model.add(Activation('softmax'))
model.summary()
#編譯模型,確定損失函式為交叉熵,優化器使用SGD方式,輸出指標正確率
model.compile(loss='categorical_crossentropy', optimizer=OPTIMIZER, metrics=['accuracy'])
#epochs為訓練輪數,優化器嘗試調整權重;batch_size是群眾更新前要觀察的訓練例項數
history = model.fit(X_train, Y_tarin,batch_size=BATCH_SIZE, epochs=NB_EPOCH,verbose=VERBOSE, validation_split=VALIDATION_SPLIT)
#測試集執行
score = model.evaluate(X_test, Y_test, verbose=VERBOSE)
print("TEST score:", score[0])
print("TEST accuracy", score[1])
實驗結果
該網路由全連結和softmax構造的神經網路輸出,輸出準確率在92.2%左右,後續要提升其準確率會對網路進行一定的更新。