1. 優化器的使用
-
優化器(optimizer)是編譯Keras模型的所需的兩個參數之一:
from keras import optimizers model = Sequential() model.add(Dense(64, kernel_initializer='uniform', input_shape=(10,))) model.add(Activation('tanh')) model.add(Activation('softmax')) # 你可以先實例化一個優化器對象,然后將它傳入model.compile() sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) model.compile(loss='mean_squared_error', optimizer=sgd) # 或者你可以通過名稱來調用優化器。在后一種情況下,將使用優化器的默認參數。 # 傳入優化器名稱: 默認參數將被采用 model.compile(loss='mean_squared_error', optimizer='sgd')
2. Keras優化器的公共參數
-
參數
clipnorm
和clipvalue
能在所有的優化器中使用,用於控制梯度裁剪(Gradient Clipping):# Gradient Clipping可以理解為:gradient過大時把它降一點,比如取其一半;梯度過小時把它放大一點,比如取其1.5倍 from keras import optimizers # 所有參數梯度將被裁剪,讓其l2范數最大為1:g * 1 / max(1, l2_norm) sgd = optimizers.SGD(lr=0.01, clipnorm=1.) from keras import optimizers # 所有參數d 梯度將被裁剪到數值范圍內: # 最大值0.5 # 最小值-0.5 sgd = optimizers.SGD(lr=0.01, clipvalue=0.5)
3. keras支持的Optimizers
- SGD
- 隨機梯度下降優化器。包含擴展功能的支持: - 動量(momentum)優化, - 學習率衰減(每次參數更新后) - Nestrov動量(NAG)優化
- RMSprop
- RMSProp優化器。建議使用優化器的默認參數 (除了學習率lr,它可以被自由調節)。這個優化器通常是訓練循環神經網絡RNN的不錯選擇。
- Adagrad
- Adagrad優化器。Adagrad是一種具有特定參數學習率的優化器,它根據參數在訓練期間的更新頻率進行自適應調整。 參數接收的更新越多,更新越小。建議使用優化器的默認參數。
- Adadelta
- Adadelta優化器。Adadelta是Adagrad的一個具有更強魯棒性的的擴展版本,它不是累積所有過去的梯度,而是根據漸變更新的移動窗口調整學習速率。 這樣,即使進行了許多更新,Adadelta仍在繼續習。與Adagrad相比,在Adadelta的原始版本中,您無需設置初始學習率。 在此版本中,與大多數其他Keras優化器一樣,可以設置初始學習速率和衰減因子。建議使用優化器的默認參數。
- Adam(cs231n推薦用這個)
- Adam優化器。默認參數遵循原論文中提供的值。
- Adamax
- Adamax優化器,來自Adam論文的第七小節。它是Adam算法基於無窮范數(infinity norm)的變種。 默認參數遵循論文中提供的值。
- Nadam
- Nesterov版本Adam優化器。正像Adam本質上是RMSProp與動量momentum的結合, Nadam是采用Nesterov momentum版本的Adam優化器。默認參數遵循論文中提供的值。 建議使用優化器的默認參數。
4. TFOptimizer
- 原生Tensorlfow優化器的包裝類(wrapper class)。