コールバックの使い方

コールバックはトレーニング手順の段階で適用される関数セットです。トレーニング中にモデル内部の状態と統計を可視化する際に、コールバックを使います。Sequentialモデルの.fit()メソッドに(キーワード引数callbacksとして)コールバックのリストを渡すことができます。コールバックに関連するメソッドは、トレーニングの各段階で呼び出されます。


[source]

Callback

keras.callbacks.Callback()

この抽象基底クラスは新しいコールバックを構築するために使用されます。

プロパティ

  • params: 辞書型。トレーニングのパラメータ(例: 冗長性,バッチサイズ,エポック数...)。
  • model: keras.models.Modelのインスタンス.トレーニングされたモデルのリファレンス。

コールバック関数が引数としてとる辞書型のlogsは、現在のバッチ数かエポック数に関連したデータのキーを含みます。

現在、Sequentialモデルクラスの.fit()メソッドは、そのコールバックに渡すlogsに次のデータが含まれます。

  • on_epoch_end: ログはacclossを含み、オプションとして(fit内のバリデーションが有効になっている場合は)val_loss、(バリデーションと精度の監視が有効になっている場合は)val_accを含みます。
  • on_batch_begin: ログは現在のバッチのサンプル数sizeを含みます。
  • on_batch_end: ログはlossと(精度の監視が有効になっている場合は)オプションとしてaccを含みます。

[source]

BaseLogger

keras.callbacks.BaseLogger()

監視されているメトリクスのエポック平均を蓄積するコールバックです。

このコールバックはすべてのKerasモデルに自動的に適用されます。


[source]

ProgbarLogger

keras.callbacks.ProgbarLogger()

標準出力にメトリクスを出力するコールバックです。


[source]

History

keras.callbacks.History()

Historyオブジェクトにイベントを記録するコールバックです。

このコールバックはすべてのKersモデルに自動的に適用されます。Historyオブジェクトはモデルのfitメソッドで返り値を取得します。


[source]

ModelCheckpoint

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

全エポック終了後にモデルを保存します。

filepathは、(on_epoch_endで渡された)epochの値とlogsのキーで埋められた書式設定オプションを含むことができます。

例えば、filepathweights.{epoch:02d}-{val_loss:.2f}.hdf5の場合、複数のファイルがエポック数とバリデーションロスの値を付与して保存されます。

引数

  • filepath: 文字列型, モデルファイルを保存するパス。
  • monitor: 監視するデータ。
  • verbose: 冗長モード, 0 または 1。
  • save_best_only: save_best_only=Trueの場合、監視しているデータによって最新の最良モデルが上書きされることはありません。
  • mode: {auto, min, max}の内、一つが選択されます。save_best_only=Trueならば、現在保存されているファイルを上書きするかは、監視されている値を最大化もしくは最小化によって決定されます。val_accの場合、この引数はmaxとなり、val_lossの場合はminになります。autoモードでは、この傾向は自動的に監視されているデータから推測されます。
  • save_weights_only: Trueなら,モデルの重みが保存されます (model.save_weights(filepath)),そうでないなら,モデルの全体が保存されます(model.save(filepath))。

[source]

EarlyStopping

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

監視されているデータの変化が停止した時にトレーニングを終了します。

引数

  • monitor: 監視されるデータ。
  • patience: トレーニングが停止し、値が改善しなくなった時のエポック数。
  • verbose: 冗長モード。
  • mode: {auto, min, max}の内、一つが選択されます。minモードでは、監視されているデータの減少が停止した際に、トレーニングを終了します。また、maxモードでは、監視されているデータの増加が停止した際に、トレーニングを終了します。

[source]

RemoteMonitor

keras.callbacks.RemoteMonitor(root='http://localhost:9000', path='/publish/epoch/end/', field='data')

このコールバックはサーバーにイベントをストリームするときに使用されます。

requestsライブラリが必要となります。

引数

  • root: イベントのルートURLは(すべてのエポックの終わりに)送信されます。イベントはデフォルトでroot + '/publish/epoch/end/'に送信されます。コールすることによって、イベントデータをJSONエンコードした辞書型のdata引数をHTTP POSTされます。

[source]

LearningRateScheduler

keras.callbacks.LearningRateScheduler(schedule)

学習率のスケジューラ。

引数

  • schedule: この関数はエポックのインデックス(数値型, 0から始まるインデックス)を入力とし、新しい学習率(float)を返します。

[source]

TensorBoard

keras.callbacks.TensorBoard(log_dir='./logs', histogram_freq=0, write_graph=True)

Tensorboardによる基本的な可視化。

このコールバックはTensorBoardのログを出力します。TensorBoardでは、異なる層への活性化ヒストグラムと同様に、トレーニングとテストのメトリクスを動的にグラフ化し、可視化することができます。

TensorBoardはTensorFlowによって提供されている可視化ツールです。

pipからTensorFlowをインストールしているならば、コマンドラインからTensorBoardを起動することができます。

tensorboard --logdir=/full_path_to_your_logs

TensorBoardに関する詳細な情報は以下を参照してください。 - __here.

引数

  • log_dir: tensorfboardによって解析されたログファイルを保存するディレクトリのパス
  • histogram_freq: モデルの層の活性化ヒストグラムを計算する(エポック中の)頻度。この値を0に設定するとヒストグラムが計算されることはありません。
  • write_graph: tensorboardのグラフを可視化するか。write_graphがTrueに設定されている場合、ログファイルが非常に大きくなることがあります。

[source]

ReduceLROnPlateau

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

評価関数の改善が止まった時に学習率を減らします.

モデルは学習が停滞した時に学習率を2〜10で割ることで恩恵を受けることがあります. このコールバックは評価関数を監視し,patienceで指定されたエポック数の間改善が見られなかった場合,学習率を減らします.

    reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.2,
                  patience=5, min_lr=0.001)
    model.fit(X_train, Y_train, callbacks=[reduce_lr])

引数

  • monitor: 監視するデータ.
  • factor: 学習率を減らす割合.new_lr = lr * factor
  • patience: 何エポックエポック改善が見られなかったら学習率の削減を行うか.
  • verbose: 整数.0: 何も表示しない.1: 学習率削減時メッセージを表示.
  • mode: autominmaxのいずれか. minの場合,評価関数の減少が止まった時に学習率を更新します. maxの場合,評価関数の増加が止まった時に学習率を更新します. autoの場合,monitorの名前から自動で判断します.
  • epsilon: 改善があったと判断する閾値.重要な変化だけに注目するために用います.
  • cooldown: 学習率を減らした後,通常の学習を再開するまで待機するエポック数.
  • min_lr: 学習率の下限.

[source]

CSVLogger

keras.callbacks.CSVLogger(filename, separator=',', append=False)

各エポックの結果をcsvファイルに保存するコールバックです. np.ndarrayのような1次元イテラブルを含む,文字列表現可能な値をサポートしています.

    csv_logger = CSVLogger('training.log')
    model.fit(X_train, Y_train, callbacks=[csv_logger])

引数

  • filename: csvファイルの名前.例えば'run/log.csv'.
  • separator: csvファイルで各要素を区切るために用いられる文字.
  • append: True: ファイルが存在する場合,追記します.(学習を続ける場合に便利です) False: 既存のファイルを上書きします.

[source]

LambdaCallback

keras.callbacks.LambdaCallback(on_epoch_begin=None, on_epoch_end=None, on_batch_begin=None, on_batch_end=None, on_train_begin=None, on_train_end=None)

シンプルな自作コールバックを急いで作るためのコールバックです.

このコールバックは,適切なタイミングで呼び出される無名関数で構築されます. 以下のような位置引数が必要であることに注意してください: - on_epoch_beginon_epoch_end は2つの位置引数が必要です: epochlogs - on_batch_beginon_batch_end は2つの位置引数が必要です: batchlogs - on_train_beginon_train_end は1つの位置引数が必要です: logs

引数

  • on_epoch_begin: すべてのエポックの開始時に呼ばれます.
  • on_epoch_end: すべてのエポックの終了時に呼ばれます.
  • on_batch_begin: すべてのバッチの開始時に呼ばれます.
  • on_batch_end: すべてのバッチの終了時に呼ばれます.
  • on_train_begin: 学習の開始時に呼ばれます.
  • on_train_end: 学習の終了時に呼ばれます.

# すべてのバッチの開始時にバッチ番号を表示
batch_print_callback = LambdaCallback(on_batch_begin=lambda batch, logs: print(batch))

# すべてのエポックの終了時に損失をプロット
import numpy as np
import matplotlib.pyplot as plt
plot_loss_callback = LambdaCallback(on_epoch_end=lambda epoch, logs: plt.plot(np.arange(epoch), logs['loss']))

# 学習の終了時にいくつかのプロセスを終了
processes = ...
cleanup_callback = LambdaCallback(on_train_end=lambda logs: [p.terminate() for p in processes if p.is_alive()])

model.fit(..., callbacks=[batch_print_callback, plot_loss_callback, cleanup_callback])

コールバックを作成する

基本クラスのkeras.callbacks.Callbackを拡張することで、カスタムコールバックを作成することができます。コールバックは、self.modelプロパティによって、関連したモデルにアクセスすることができます。

トレーニング中の各バッチの損失のリストを保存する簡単な例は、以下のようになります。

class LossHistory(keras.callbacks.Callback):
    def on_train_begin(self, logs={}):
        self.losses = []

    def on_batch_end(self, batch, logs={}):
        self.losses.append(logs.get('loss'))

例: 損失の履歴を記録する

class LossHistory(keras.callbacks.Callback):
    def on_train_begin(self, logs={}):
        self.losses = []

    def on_batch_end(self, batch, logs={}):
        self.losses.append(logs.get('loss'))

model = Sequential()
model.add(Dense(10, input_dim=784, init='uniform'))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='rmsprop')

history = LossHistory()
model.fit(X_train, Y_train, batch_size=128, nb_epoch=20, verbose=0, callbacks=[history])

print history.losses
# 出力
'''
[0.66047596406559383, 0.3547245744908703, ..., 0.25953155204159617, 0.25901699725311789]
'''

例: モデルのチェックポイント

from keras.callbacks import ModelCheckpoint

model = Sequential()
model.add(Dense(10, input_dim=784, init='uniform'))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='rmsprop')

'''
バリデーションロスが減少した場合に、各エポック終了後、モデルの重みを保存します
'''
checkpointer = ModelCheckpoint(filepath="/tmp/weights.hdf5", verbose=1, save_best_only=True)
model.fit(X_train, Y_train, batch_size=128, nb_epoch=20, verbose=0, validation_data=(X_test, Y_test), callbacks=[checkpointer])