一、keras优化器(自用记录)

与compile()&fit()一起使用

优化器 (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')

Keras 优化器的公共参数

参数 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

1.adam

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
)
  • 实现Adam算法的优化器。
  • Adam优化是一种基于一阶和二阶矩自适应估计的随机梯度下降方法。
  • 根据Kingma等人的说法,2014年,该方法“计算效率高,内存需求少,对梯度的对角缩放不变性,非常适合于数据/参数较大的问题”。
  • 参数
    learning_rate:张量、浮点值或是tf.keras.optimizers.schedules的调度。LearningRateSchedule,或一个不带参数并返回要使用的实际值的可调用函数,即学习率。默认为0.001
    beta_1:浮点值或常量浮点张量,或不带参数并返回要使用的实际值的可调用函数。一阶矩的指数衰减率估计。默认为0.9。
    beta_2:浮点值或常量浮点张量,或不带参数并返回实际值的可调用函数,二阶矩的指数衰减率估计值。默认为0.999。
    ε:数值稳定性的小常数。这个ε是Kingma和Ba论文中的“ε帽”(在第2.1节之前的公式中),而不是论文算法1中的ε。默认为1e-7。
    amsgrad:布尔值。是否应用论文“关于Adam及其后的收敛性”中该算法的AMSGrad变体。默认为False。
    name:应用渐变时创建的操作的可选名称。默认为“Adam”。
    **kwargs:关键字参数。允许的参数为clipvalue、clipnorm、global_clipnorm。如果设置了clipvalue(float),则每个权重的梯度将被剪裁为不高于该值。如果设置了clipnorm(float),则每个权重的梯度将被单独剪裁,以使其范数不高于该值。如果设置了global_clipnorm(float),则会剪裁所有权重的梯度,以使其全局范数不高于该值。
  • 使用
# 传入优化器名称: 默认参数将被采用
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

你可能感兴趣的:(python,keras,深度学习,python)