在Keras中控制每一层的学习率,通过层名的最长匹配前缀来确定学习率倍率,适用于按Keras规则写的优化器。
pip install keras-lr-multiplier
LRMultiplier
中第一个参数是原有的优化器,形式和compile
相同,可以是标志字符串(如'Adam'
),也可以是一个初始化后的优化器(如Adam(lr=1e-2)
)。第二个参数是一个dict
,是名称前缀到学习率倍率的映射,每一层在没有匹配到任何前缀的情况下默认倍率取1.0
,否则只采用最长匹配前缀的结果,如存在"Dense"
和"Dense-1"
时,"Dense-12"
采用"Dense-1"
对应的倍率。一个例子如下:
from keras.models import Sequential
from keras.layers import Dense
from keras_lr_multiplier import LRMultiplier
model = Sequential()
model.add(Dense(
units=5,
input_shape=(5,),
activation='tanh',
name='Dense',
))
model.add(Dense(
units=2,
activation='softmax',
name='Output',
))
model.compile(
optimizer=LRMultiplier('adam', {'Dense': 0.5, 'Output': 1.5}),
loss='sparse_categorical_crossentropy',
)
倍率也可以是一个可以被调用的对象,如匿名函数或实现了__call__
的object
。输入的参数是从0
开始的训练步数,需要返回对应的学习率倍率:
from keras import backend as K
from keras_lr_multiplier import LRMultiplier
LRMultiplier('adam', {'Dense': lambda t: 2.0 - K.minimum(1.9, t * 1e-4)})