用 Keras 構(gòu)建神經(jīng)網(wǎng)絡(luò)
(摘錄自udacity)
要使用 Keras,你需要知道以下幾個核心概念。
序列模型
from keras.models import Sequential
#Create the Sequential model
model = Sequential()
keras.models.Sequential 類是神經(jīng)網(wǎng)絡(luò)模型的封裝容器。它會提供常見的函數(shù),例如 fit()、evaluate() 和 compile()。我們將介紹這些函數(shù)(在碰到這些函數(shù)的時候)。我們開始研究模型的層吧。
層
Keras 層就像神經(jīng)網(wǎng)絡(luò)層。有全連接層、最大池化層和激活層。你可以使用模型的 add() 函數(shù)添加層。例如,簡單的模型可以如下所示:
from keras.models import Sequential
from keras.layers.core import Dense, Activation, Flatten
#創(chuàng)建序列模型
model = Sequential()
#第一層 - 添加有128個節(jié)點的全連接層以及32個節(jié)點的輸入層
model.add(Dense(128, input_dim=32))
#第二層 - 添加 softmax 激活層
model.add(Activation('softmax'))
#第三層 - 添加全連接層
model.add(Dense(10))
#第四層 - 添加 Sigmoid 激活層
model.add(Activation('sigmoid'))
Keras 將根據(jù)第一層自動推斷后續(xù)所有層的形狀。這意味著,你只需為第一層設(shè)置輸入維度。
上面的第一層 model.add(Dense(input_dim=32)) 將維度設(shè)為 32(表示數(shù)據(jù)來自 32 維空間)。第二層級獲取第一層級的輸出,并將輸出維度設(shè)為 128 個節(jié)點。這種將輸出傳遞給下一層級的鏈繼續(xù)下去,直到最后一個層級(即模型的輸出)??梢钥闯鲚敵鼍S度是 10。
構(gòu)建好模型后,我們就可以用以下命令對其進行編譯。我們將損失函數(shù)指定為我們一直處理的 categorical_crossentropy。我們還可以指定優(yōu)化程序,稍后我們將了解這一概念,暫時將使用 adam。最后,我們可以指定評估模型用到的指標(biāo)。我們將使用準(zhǔn)確率。
model.compile(loss="categorical_crossentropy", optimizer="adam", metrics = ['accuracy'])
我們可以使用以下命令來查看模型架構(gòu):
model.summary()
然后使用以下命令對其進行擬合,指定 epoch 次數(shù)和我們希望在屏幕上顯示的信息詳細(xì)程度。
然后使用fit命令訓(xùn)練模型并通過 epoch 參數(shù)來指定訓(xùn)練輪數(shù)(周期),每 epoch 完成對整數(shù)據(jù)集的一次遍歷。 verbose 參數(shù)可以指定顯示訓(xùn)練過程信息類型,這里定義為 0 表示不顯示信息。
model.fit(X, y, nb_epoch=1000, verbose=0)
注意:在 Keras 1 中,nb_epoch 會設(shè)置 epoch 次數(shù),但是在 Keras 2 中,變成了 epochs。
最后,我們可以使用以下命令來評估模型:
model.evaluate()
Keras 優(yōu)化程序
Keras 中有很多優(yōu)化程序,建議你訪問此鏈接或這篇精彩博文(此鏈接來自外網(wǎng),國內(nèi)網(wǎng)絡(luò)可能打不開),詳細(xì)了解這些優(yōu)化程序。這些優(yōu)化程序結(jié)合使用了上述技巧,以及其他一些技巧。最常見的包括:
SGD
這是隨機梯度下降。它使用了以下參數(shù):
- 學(xué)習(xí)速率。
- 動量(獲取前幾步的加權(quán)平均值,以便獲得動量而不至于陷在局部最低點)。
- Nesterov 動量(當(dāng)最接近解決方案時,它會減緩梯度)。
Adam
Adam (Adaptive Moment Estimation) 使用更復(fù)雜的指數(shù)衰減,不僅僅會考慮平均值(第一個動量),并且會考慮前幾步的方差(第二個動量)。
RMSProp
RMSProp (RMS 表示均方根誤差)通過除以按指數(shù)衰減的平方梯度均值來減小學(xué)習(xí)速率。