今天要來帶大家把我們之前在第8天做出來的神經網路模型升級一下,話不多說馬上來看
這段與第八天的內容都一樣,這次我們要升級的地方是增加一層隱藏層,還有修改一些小細節
#匯入模組及下載mnist資料
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.utils import plot_model
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras import optimizers
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
(X_train,y_train),(X_test,y_test)=mnist.load_data()
#資料預處理的部分
X_train=X_train.reshape(60000,784).astype('float32')
X_test=X_test.reshape(10000,784).astype('float32')
X_train /= 255
X_test /= 255
X_train=X_train.reshape(60000,784).astype('float32')
X_test=X_test.reshape(10000,784).astype('float32')
複習Day10-relu激活函數將負數輸入變為零,而正數輸入保持不變。它是目前最常用的激活函數之一,因為它訓練速度較快。
model=Sequential()
model.add(Dense(64,activation='relu' , input_shape=(784,))) #sigmoid激活函數我們改使用relu激活函數
model.add(Dense(64,activation='relu' )) #這邊我們多增加了一層隱藏層
model.add(Dense(10,activation='softmax'))
用model.summary()來看看模型的摘要
第二隱藏層的神經元有4160參數,還記得怎麼來的嗎?
公式:X (前一層隱層藏神經元) * W(現在計算的隱層藏神經元) + b(神經元)
第一隱藏層與第二隱藏層之間總共有64 * 64=4096個連接數,然後第二隱藏層有64個神經元,所以4096+64=4160個參數。
這邊修改了損失函數,上次使用均方誤差損失函數(mean_squared_error)這次我們寫交叉熵損失(categorical_crossentropy),因為這次增加了一層隱藏層,又修改了這麼多小細節,因此我們讓他訓練20次,減少訓練週期看看結果吧!
model.compile(loss='categorical_crossentropy',optimizer=optimizers.SGD(learning_rate=0.001),metrics=['accuracy']) #損失函數改為loss='categorical_crossentropy'
model.fit(X_train,y_train,batch_size=128,epochs=20,verbose=1,validation_data=(X_test,y_test)) #訓練週期改為20 epochs=20
之前寫的程式跑200次訓練才能達到85%的準確率,這次訓練出來的只跑了20次就有94%的準確率!
我把隱藏層加到四層,並且把學習率降低為0.001
model=Sequential()
model.add(Dense(64,activation='relu' , input_shape=(784,)))
model.add(Dense(64,activation='relu' ))
model.add(Dense(64,activation='relu' ))
model.add(Dense(10,activation='softmax'))
model.compile(loss='categorical_crossentropy',optimizer=optimizers.SGD(learning_rate=0.001),metrics=['accuracy'])
跑出來的結果來到96%,真是令人為之振奮。
不過啊,我們不能那麼輕易就下定結論,有可能是因為模型過度配適(模型在訓練過程中過度擬合、符合訓練數據),讓我們搭配其他數據來驗證神經網路跑出來的效果吧!
資料的損失值(val_loss)也確實漸漸下降(0.1255-0.1209),資料的準確率(val_acc)也提高了(0.9615-0.9625)
或許大家還可以訓練出準確率高達97%的神經網路,動手改改看吧!