优化器 (optimizer) 是编译 Keras 模型的所需的两个参数之一:
from keras import optimizers
model = Sequential()
model.add(Dense(64, kernel_initializer='uniform', input_shape=(10,)))
model.add(Activation('softmax'))
sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='mean_squared_error', optimizer=sgd)
您可以在将优化器传递给model.compile()之前实例化它,如上面的示例所示,也可以通过它的字符串标识符传递它。在后一种情况下,将使用优化器的默认参数。
# 传入优化器名称: 默认参数将被采用
model.compile(loss='mean_squared_error', optimizer='sgd')
参数 clipnorm 和 clipvalue 能在所有的优化器中使用,用于控制梯度裁剪(Gradient Clipping):
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)
Adam是0.001,SGD是0.01
Adam class
tf.keras.optimizers.Adam(
learning_rate=0.001,
beta_1=0.9,
beta_2=0.999,
epsilon=1e-07,
amsgrad=False,
name="Adam",
**kwargs
)
# 传入优化器名称: 默认参数将被采用
model.compile(optimizer='adam', loss='mean_squared_error')
# 自定义设置参数
from keras import optimizers
adam = optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)
model = Sequential()
model.compile(optimizer='adam', loss='mean_squared_error')
# 自定义学习率:通过回调函数实现
import keras.backend as K
from keras.callbacks import LearningRateScheduler
def scheduler(epoch):
# 每隔100个epoch,学习率减小为原来的1/10
if epoch % 100 == 0 and epoch != 0:
lr = K.get_value(model.optimizer.lr)
K.set_value(model.optimizer.lr, lr * 0.1)
print("lr changed to {}".format(lr * 0.1))
return K.get_value(model.optimizer.lr)
reduce_lr = LearningRateScheduler(scheduler)
model.fit(train_x, train_y, batch_size=32, epochs=300, callbacks=[reduce_lr])
Kingma et al., 2014: [Adam: A Method for Stochastic Optimization]
Reddi et al., 2018: [On the Convergence of Adam and Beyond]
参考来源:
1.keras中文文档
2.keras API reference