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
公式で対応してくれ~~