誰でも簡単にディープラーニングが出来ると有名なkeras
初めのうちは簡単で便利だなあとしか思ってなかったのですが、使ってるうちにこうした方が良いというポイントを結構発見したのでそれをまとめようと思いました。
#初期化
kerasの初期設定を見てみましょう
keras.layers.Dense(units, activation=None, use_bias=True, kernel_initializer='glorot_uniform')
すると初期化はglorot_uniformとなっていることがわかります。
実はこの初期化は活性化関数が原点対称であると考えたときに使える関数なのです。(詳しくはニューラルネットにおける変数の初期化についてを読んでください
なのでreluで活性化するときにはhe_normalを使いましょう
keras.layers.Dense(units, activation=None, use_bias=True, kernel_initializer='he_normal')
#コールバック
使うと便利です
ModelCheckpoint
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
keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=0, verbose=0, mode='auto')
patienceに設定した値の間に更新がなかったら打ち切ります。これで電気代の無駄を防げます
ReduceLROnPlateau
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倍します。これで学習率を下げると学習が進むことがあるのでなかなか有用です。
こんな感じでまとめて使えます。
callbacks = [
EarlyStopping(patience=0),
ReduceLROnPlateau(patience=0),
ModelCheckpoint(filepath)
]
model.fit(x_train, y_train, callbacks=callbacks)
#Keras backend
backendを使えば好きな層を追加できて便利です。
でもLambda層でラップすることを知らないと
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層を使ってこのように書きましょう。
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は奥が深い
###参考元