LoginSignup
36
34

More than 5 years have passed since last update.

kerasの初心者向け豆知識

Last updated at Posted at 2018-11-14

誰でも簡単にディープラーニングが出来ると有名なkeras

初めのうちは簡単で便利だなあとしか思ってなかったのですが、使ってるうちにこうした方が良いというポイントを結構発見したのでそれをまとめようと思いました。

初期化

kerasの初期設定を見てみましょう

glorot_uniform.py
keras.layers.Dense(units, activation=None, use_bias=True, kernel_initializer='glorot_uniform')

すると初期化はglorot_uniformとなっていることがわかります。

実はこの初期化は活性化関数が原点対称であると考えたときに使える関数なのです。(詳しくはニューラルネットにおける変数の初期化についてを読んでください



なのでreluで活性化するときにはhe_normalを使いましょう

he_normal.py
keras.layers.Dense(units, activation=None, use_bias=True, kernel_initializer='he_normal')

コールバック

使うと便利です

ModelCheckpoint

ModelCheckpoint.py
keras.callbacks.ModelCheckpoint(filepath, monitor='val_loss', verbose=0, save_best_only=False, save_weights_only=False, mode='auto', period=1)

#学習が終わった後
model.load_weights(filepath)

monitorしている指標が一番よかった時のものを保存してくれます。これで常にベストな結果を使えます。

EarlyStopping

EarlyStopping.py
keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=0, verbose=0, mode='auto')

patienceに設定した値の間に更新がなかったら打ち切ります。これで電気代の無駄を防げます

ReduceLROnPlateau

ReduceLROnPlateau.py
keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=10, verbose=0, mode='auto', epsilon=0.0001, cooldown=0, min_lr=0)

patienceに設定した値の間に更新がなかったら学習率をfactor倍します。これで学習率を下げると学習が進むことがあるのでなかなか有用です。



こんな感じでまとめて使えます。

matome.py
callbacks = [
    EarlyStopping(patience=0),
    ReduceLROnPlateau(patience=0),
    ModelCheckpoint(filepath)
]
model.fit(x_train, y_train, callbacks=callbacks)

Keras backend

backendを使えば好きな層を追加できて便利です。
でもLambda層でラップすることを知らないと

error.py
from keras import backend as K
from keras.layers import Dense,Input
from keras.models import Model
model_input = Input(shape=(10,))
calculated = K.sqrt(model_input + 1.0)
calculated = Dense(1)(calculated)
model = Model(inputs=model_input, outputs=calculated)

#AttributeError: 'Tensor' object has no attribute '_keras_history'
#AttributeError: 'NoneType' object has no attribute '_inbound_nodes'

みたいなエラーが出て意味が分からないことになります。



なのでちゃんとLambda層を使ってこのように書きましょう。

Lambda.py
from keras import backend as K
from keras.layers import Dense,Input,Lambda
from keras.models import Model
model_input = Input(shape=(10,))
calculated = Lambda(lambda x: K.sqrt(x + 1.0), output_shape=(10,))(model_input)
calculated = Dense(1)(calculated)
model = Model(inputs=model_input, outputs=calculated)

これに気づくのに大分時間を溶かしました。

まとめ

簡単使えるけどkerasは奥が深い

参考元

kerasで頭に描いたネットワーク構造を実現するためのTips ~ Lambda 編 ~

36
34
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
34