wide and deep

keras/tensorflowでoptimizersの学習率を層ごとに決定する

一昔前のDL論文を読んでいると,層ごとに違う学習率が設定されていることがある.
自分にはあまり馴染みがなかったが,Caffeでは簡単にその設定ができたために使われていたらしい.

keras(tensorflow)でこの設定をしようとしたとき,

keras.optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False)

lr: 0以上の浮動小数点数.学習率.
最適化 - Keras Documentation

上記のようにあり,learning_rateは整数しか取らず,全体としての学習率しか設定できない.
keras/optimizers.py at master · keras-team/keras · GitHub

solution

探しまくると下記記事に当たった.
ksaluja15.github.io
keras.optimizers.SGDに追加の引数multipliersを取らせ,対象のlayerの学習率を定数倍するというもの.
このあたりがポイントみたい.

matched_layer = [x for x in self.lr_multipliers.keys() if x in p.name]
if matched_layer:
    new_lr = lr * self.lr_multipliers[matched_layer[0]]
else:
    new_lr = lr

こんな感じで使う.
これは全結合層だけ10^-3,それ以外は10^-4といったところ.

from LR_SGD import LR_SGD
...
LR_mult_dict = {}
LR_mult_dict['fc1'] = 10
LR_mult_dict['fc2'] = 10
LR_mult_dict['predictions'] = 10
optimizer = LR_SGD(lr=10e-4, multipliers=LR_mult_dict)

なお,model.save()load_model()したときは,読み込む際にエラーが出るので

  File ".\train.py", line 69, in main
    base_model = load_model('./dst/model.h5')
ValueError: Unknown optimizer: LR_SGD

このようにすること

model = load_model('./dst/model.h5', compile=False)
# model.compile(loss=categorical_crossentropy, optimizer=optimizer, metrics=['accuracy'])


辞書を受け取って学習率更新というポイントをAdamに適用した有志もいる.
erikbrorson.github.io

公式で対応してくれ~~