iT邦幫忙

2023 iThome 鐵人賽

DAY 22
0
AI & Data

30天深度學習-從零到英雄系列 第 22

優化器(Optimizer)👉進化神經網路

  • 分享至 

  • xImage
  •  
  • 前言:今天會介紹優化器,以及使用前幾天提到的dropout(丟棄法)跟批次正規化繼續升級我們的神經網路

優化器(Optimizer)

優化器(Optimizer)是機器學習中用於調整模型參數以最小化損失函數。如果覺得太複雜,就記得那些最常用的SGD及Adam就可以了,剩下就當作多認識的!常見的優化器種類:

  1. 梯度下降法(Gradient Descent):梯度下降是最基本的優化算法之一,我們在Day14有介紹過,其中又可以細分為:

    • 批次梯度下降(Batch Gradient Descent)
    • 隨機梯度下降(Stochastic Gradient Descent)
    • 小批次梯度下降(Mini-batch Gradient Descent)
  2. Nesterov動量優化器(Momentum Optimizer):動量優化器是梯度下降的變體,它引入了動量項,有助於克服梯度下降中的局部極小值問題,加速收斂。動量優化器(Momentum Optimizer)在深度學習中的作用是加速收斂,有助於克服損失函數表面上的平緩區域或局部極小值。

  • 幫助大家更理解動量優化器的概念,我們來舉一個例子:假設我們正在一個凹凸不平的地板玩滾球遊戲,目標是將球盡 快推到終點,有了動量的加持,球不僅可以更快地穿越平緩區,就算面對低點也可以輕鬆越過。
  1. AdaGrad:全名為Adaptive Gradient Algorithm,也就是自適應梯度演算法。AdaGrad的好處是會根據每個參數的過去梯度調整學習率,對於不同參數具有不同的學習率。

  2. RMSProp:RMSProp是AdaGrad的變體,它使用移動平均來調整學習率,以平滑學習過程中的梯度變化。

  3. Adadelta:Adadelta是另一種自適應學習率的優化器,類似於RMSProp,但它不需要手動調整學習率。

  4. Adam(Adaptive Moment Estimation):Adam是一種結合了動量和RMSProp的優化器,也可以說是所有優化器集大成。廣泛用於深度學習中,通常具有很好的性能。

這僅僅是一些常見的優化器,還有許多其他優化器和它們的變體,每種優化器都有優點跟缺點,適用的地方也不同,取決於問題的特性,可以多加嘗試不同優化器,看模型做適合哪種。


接下來我們就要繼續升級神經網路啦~
我們拿之前之前打好的程式碼在匯入模組的地方繼續往裡面import Dropout跟BatchNormalization就可以了

#匯入模組
from tensorflow.keras.datasets import mnist     
from tensorflow.keras.models import Sequential   
from tensorflow.keras.layers import Dense  
from tensorflow.keras.layers import Dropout #加入丟棄法(Dropout)
from tensorflow.keras.layers import BatchNormalization #加入批次正規化        
from tensorflow.keras.utils import to_categorical  
from tensorflow.keras.optimizers import SGD

下面這一段都與之前一樣沒有加入新東西

#下載MNIST資料集 
(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 

#標籤預處理 :
y_train=to_categorical(y_train, 10) 
y_test=to_categorical(y_test, 10) 

在構建神經網路的地方我們在之前的基礎上增加兩層隱藏層,使用批次正規化,並且在最後一個隱藏層添加丟棄層

#建構神經網路
model = Sequential()
#輸入層+第一隱藏層
model.add(Dense(64, activation='relu', input_shape=(784,)))
model.add(BatchNormalization())
#第二隱藏層
model.add(Dense(64, activation='relu'))
model.add(BatchNormalization())
#第三隱藏層
model.add(Dense(64, activation='relu'))
model.add(BatchNormalization()) #批次正規化
model.add(Dropout(0.2)) #每批次隨機丟棄此層 20% (1/5)神經元
#輸出層
model.add(Dense(10, activation='softmax'))

做完後我們可以查看模型摘要,當然也可以省略

#檢視模型摘要
model.summary()

https://ithelp.ithome.com.tw/upload/images/20231004/20161909dDNLOL4T0T.png


損失函數一樣用交叉熵,優化器我們用上面介紹廣泛用於深度學習中,且具有很好性能的Adam

#編譯模型
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

最後來訓練我們的模型看看準確率如何吧!

#訓練模型
model.fit(X_train, y_train, batch_size=128, epochs=20, verbose=1,validation_data=(X_test, y_test))

還記得第一次沒有升級的結果是200週期86%的準確率嗎?
第二次升級了激活函數還有學習率結果是20週期96%的準確率
結果這次跑到97%了!
https://ithelp.ithome.com.tw/upload/images/20231004/20161909eVBOgi7gz4.png

跑了那麼多次的手寫數字資料集,明天我們再來介紹其他不同的例子!


上一篇
過度配適(Overfitting)那就抑制吧!
下一篇
回歸模型(regression)-加州房價預測
系列文
30天深度學習-從零到英雄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言