Keras : Callbacks : コールバックの使用方法

Keras : Callbacks : コールバックの使用方法 (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 06/21/2018 (2.2.0)

* 本ページは、Keras 本家サイトの – Callbacks を翻訳した上で適宜、補足説明したものです:

* Keras 本家サイトには日本語訳も用意されていますが、それとは無関係に翻訳したものです。
* サンプルコードの動作確認はしておりますが、適宜、追加改変している場合もあります。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

コールバックの使用方法

コールバックは訓練手続きの与えられたステージで適用される関数のセットです。訓練中のモデルの内部状態と統計情報のビューを得るためにコールバックを使用できます。コールバックのリストを (キーワード引数 callbacks として) Sequential か Model クラスの .fit() メソッドに渡すことができます。それからコールバックの関連するメソッドは訓練の各ステージで呼び出されます。

 

TerminateOnNaN

keras.callbacks.TerminateOnNaN()

NaN 損失に遭遇するときに訓練を停止するコールバックです。

 

Callback

keras.callbacks.Callback()

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

プロパティ

  • params: 辞書。訓練パラメータ (eg. verbosity、バッチサイズ、エポック数…)。
  • model: keras.models.Model のインスタンス。訓練されるモデルへの参照。

logs 辞書、callback メソッドが引数として取り、現在のバッチかエポックに関連する量 (= quantities) のためのキーを含みます。

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

  • on_epoch_end: logs は acc と loss を含みます、そしてオプションで (validation が fit で有効であれば) val_loss、そして (validation と accracy 監視が有効であれば) val_acc を含みます。
  • on_batch_begin: logs は size を含みます、これは現在のバッチのサンプル数です。
  • on_batch_end: logs は loss、そしてオプションで (accuracy 監視が有効であれば) acc を含みます。

 

BaseLogger

keras.callbacks.BaseLogger(stateful_metrics=None)

メトリクスのエポック平均を累積するコールバックです。

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

引数

  • stateful_metrics: エポックに渡り平均されるべきでないメトリクスの文字列名の Iterable です。このリストのメトリクスは on_epoch_end に as-is でログされます。他の総ては on_epoch_end で平均されます。

 

ProgbarLogger

keras.callbacks.ProgbarLogger(count_mode='samples', stateful_metrics=None)

stdout にメトリクスをプリントするコールバック。

引数

  • count_mode: “steps” か “samples” の一つ。進捗バーがサンプルかステップ (バッチ) をカウントするべきかです。
  • stateful_metrics: エポックに渡り平均されるべきでないメトリクスの文字列名の Iterable です。このリストのメトリクスは as-is でログされます。他の総ては時間とともに平均されます (e.g., loss, etc.)。

Raises

  • ValueError: 不正な count_mode の場合。

 

History

keras.callbacks.History()

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

このコールバックは自動的に総ての Keras モデルに適用されます。History オブジェクトはモデルの fit メソッドにより返されます。

 

ModelCheckpoint

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

 
総てのエポック後にモデルをセーブします。

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

例えば: filepath が weights.{epoch:02d}-{val_loss:.2f}.hdf5 である場合、モデル・チェックポイントはファイル名にエポック数と検証損失を伴ってセーブされます。

引数

  • filepath: 文字列、モデル・ファイルをセーブするパス。
  • monitor: quantity to monitor.
  • verbose: verbosity モード, 0 または 1。
  • save_best_only: save_best_only=True の場合には、監視されている量に従って最新のベスト・モデルは上書きされません。
  • mode: {auto, min, max} の一つ。save_best_only=True の場合には、現在のセーブファイルを上書きするかの決定は監視されている量の最大化か最小化をベースに成されます。val_acc については、これは max で、val_loss についてはこれは min であるべきです、etc.。auto モードでは、その方向は監視されている量の名前から自動的に推定されます。
  • save_weights_only: True の場合、モデルの重みだけがセーブされ (model.save_weights(filepath))、そうでないならば完全なモデルがセーブされます (model.save(filepath))。
  • period: チェックポイントの間の間隔 (エポック数)。

 

EarlyStopping

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

 
監視されている量が改善することを停止するときに訓練を停止します。

引数

  • monitor: 監視される量。
  • min_delta: 改良と認定される監視される量の最小限の変更、i.e. min_delta よりも絶対的変更が小さければ改善されていないとカウントされます。
  • patience: 改善のないエポック数でその後訓練は停止されます。
  • verbose: verbosity モード。
  • mode: {auto, min, max} の一つ。min モードでは、監視される量が減少を止めたときに訓練は停止します ; max モードでは監視される量が増加を止めたときにそれは停止します ; auto モードでは、方向は監視される量の名前から自動的に推定されます。
  • baseline: 監視される量の到達すべき基準値。モデルが基準値を超えて改良を示さない場合には訓練は停止します。

 

RemoteMonitor

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

 
イベントをサーバにストリームするために使用されるコールバックです。

requests ライブラリが必要です。イベントはデフォルトで root + ‘/publish/epoch/end/’ に送られます。呼び出しは HTTP POST で、イベント・データの JSON エンコードされた辞書である data 引数を伴います。send_as_json が True に設定される場合、リクエストの content type は application/json です。そうでなければシリアライズされた JSON はフォーム内で送られます。

引数

  • root: 文字列; ターゲットサーバの root url です。
  • path: root への相対パスでそこにイベントは送られます。
  • field: 文字列; JSON フィールドでその下にデータはストアされます。フィールドはペイロードがフォーム内で送られるとき (i.e. send_as_json が False に設定) に限り使用されます。
  • headers: 辞書; オプションのカスタム HTTP ヘッダ。
  • send_as_json: Boolean; リクエストが application/json として送られるべきか否か。

 

LearningRateScheduler

keras.callbacks.LearningRateScheduler(schedule, verbose=0)

学習率スケジューラ。

引数

  • schedule: 入力としてエポック index (整数, 0 からのインデックス) と現在の学習率を取り出力として新しい学習率 (float) を返す関数です。
  • verbose: int. 0: quiet, 1: メッセージ更新。

 

TensorBoard

keras.callbacks.TensorBoard(log_dir='./logs', histogram_freq=0, batch_size=32, write_graph=True, write_grads=False, write_images=False, embeddings_freq=0, embeddings_layer_names=None, embeddings_metadata=None, embeddings_data=None)

 
TensorBoard 基本可視化。

TensorBoard は TensorFlow とともに提供される可視化ツールです。

このコールバックは TensorBoard のためのログを書き、これは訓練の動的グラフとテスト・メトリクス、更にモデルの異なる層の活性ヒストグラムの可視化を可能にします。

TensorFlow を pip でインストールした場合、次のコマンドラインで TensorBoard を起動することができるはずです :

tensorboard --logdir=/full_path_to_your_logs

TensorFlow 以外のバックエンドを使用するとき、(TensorFlow がインストールされていれば) TensorBoard は依然として動作しますが、利用可能な特徴は損失とメトリクスのプロットの表示だけです。

引数

  • log_dir: TensorBoard で解析されるログファイルをセーブするディレクトリのパスです。
  • histogram_freq: モデルの層のための活性と重みヒストグラムを計算する頻度 (エポックで) です。0 に設定される場合、ヒストグラムは計算されません。ヒストグラム可視化のためには検証データ (または split) が指定されなければなりません。
  • write_graph: TensorBoard でグラフを可視化するか否か。 write_graph が True に設定されているときログファイルは非常に巨大になるかもしれません。
  • write_grads: TensorBoard で勾配ヒストグラムを可視化するか否か。histogram_freq は 0 より大きくなければなりません。
  • batch_size: ヒストグラム計算のためにネットワークに供給される入力のバッチサイズ。
  • write_images: モデル重みを TensorBoard で画像として可視化するために書くか否か。
  • embeddings_freq: 選択された埋め込み層をセーブする頻度 (エポックで)。0 に設定された場合、埋め込みは計算されません。TensorBoard の埋め込みタブで可視化されるデータは embeddings_data として渡されなければなりません。
  • embeddings_layer_names: 監視する層の名前のリストです。None か空リストであれば総ての埋め込み層が監視されます。
  • embeddings_metadata: 層名をファイル名にマップする辞書です、そこでは埋め込み層のメタデータがセーブされます。メタデータ・ファイルフォーマットについての 詳細 を見てください。総ての埋め込み層に対して同じメタデータ・ファイルが使用される場合には、文字列を渡すことができます。
  • embeddings_data: embeddings_layer_names で指定される層で埋め込まれるデータです。Numpy 配列 (モデルが単一の入力を持つ場合) か Numpy 配列のリスト (モデルが複数入力を持つ場合) です。埋め込みについて更に 学習してください。

 

ReduceLROnPlateau

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

 
メトリックが改善を止めたとき学習率を減じます。

学習が停滞したときに 2-10 の factor により学習率を減じることの恩恵をモデルはしばしば受けます。このコールバックは量を監視して ‘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: 学習率は factor により減じられます。new_lr = lr * factor
  • patience: 改良されないエポック数の後で学習率は減じられます。
  • verbose: int. 0: quiet, 1: メッセージを更新します。
  • mode: {auto, min, max} の一つ。min モードでは、監視される量が減少を止めたときに lr が減じられます ; max モードでは監視される量が増加を止めたときに lr が減じられます ; auto モードでは、方向は監視される量の名前から自動的に推定されます。
  • min_delta: 本質的な変更だけにフォーカスするための、新しい最適条件を測定するための閾値。
  • cooldown: lr が減じられた後通常の演算を再開する前に待つエポック数。
  • min_lr: 学習率の下限。

 

CSVLogger

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

エポック結果を csv ファイルにストリームするコールバックです。

np.ndarray のような1D iterable を含む、文字列として表せる総ての値をサポートします。

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

引数

  • filename: csv ファイルのファイル名です、e.g. ‘run/log.csv’。
  • separator: csv ファイルの要素を分離するために使用される文字列です。
  • append: True: ファイルが存在すればアペンドします (連続的な訓練のために有用です)。False: 既存のファイルに上書きします。

 

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-the-fly に作成するためのコールバックです。

このコールバックは適切な時に呼び出される無名関数とともに構築されます。コールバックは次のように位置引数を想定していることに注意してください :

  • on_epoch_begin と on_epoch_end は 2 つの位置引数: epoch, logs を想定します。
  • on_batch_begin と on_batch_end は 2 つの位置引数: batch, logs を想定します。
  • on_train_begin と on_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))

# エポック損失を JSON フォーマットのファイルにストリームします。
# ファイル・コンテンツは well-formed JSON ではなく、行毎に JSON オブジェクトを持ちます。
import json
json_log = open('loss_log.json', mode='wt', buffering=1)
json_logging_callback = LambdaCallback(
    on_epoch_end=lambda epoch, logs: json_log.write(
        json.dumps({'epoch': epoch, 'loss': logs['loss']}) + '\n'),
    on_train_end=lambda logs: json_log.close()
)

# モデル訓練の終了後に幾つかのプロセスを停止します。
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,
                     json_logging_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, kernel_initializer='uniform'))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='rmsprop')

history = LossHistory()
model.fit(x_train, y_train, batch_size=128, epochs=20, verbose=0, callbacks=[history])

print(history.losses)
# outputs
'''
[0.66047596406559383, 0.3547245744908703, ..., 0.25953155204159617, 0.25901699725311789]
'''

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

from keras.callbacks import ModelCheckpoint

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

'''
saves the model weights after each epoch if the validation loss decreased
'''
checkpointer = ModelCheckpoint(filepath='/tmp/weights.hdf5', verbose=1, save_best_only=True)
model.fit(x_train, y_train, batch_size=128, epochs=20, verbose=0, validation_data=(X_test, Y_test), callbacks=[checkpointer])
 

以上