Keras
Try in a Colab Notebook here →
The Weights & Biases Keras Callbacks
KerasとTensorFlowユーザー向けに、wandb v0.13.4から3つの新しいコールバックを追加しました。従来のWandbCallbackについては、下にスクロールしてください。
WandbMetricsLogger : Experiment Tracking 用のこのコールバックを使用してください。トレーニングと検証のメトリクスに加え、システムメトリクスをWeights and Biasesにログします。
WandbModelCheckpoint : モデルのチェックポイントをWeight and Biases Artifacts にログするために、このコールバックを使用してください。
WandbEvalCallback: この基本コールバックはモデルの予測をWeights and Biases Tables にログし、インタラクティブな可視化を行います。
これらの新しいコールバックは、
- Kerasの設計理念に準拠
- すべての操作を単一のコールバック(WandbCallback)で行う場合の認知負荷を軽減
- Kerasユーザーが自分の特定のユースケースに合わせてサブクラス化してコールバックを変更しやすくなります
WandbMetricsLoggerを使った実験管理
Try in a Colab Notebook here →
WandbMetricsLoggerは、on_epoch_endやon_batch_endなどのコールバックメソッドが引数として受け取るKerasのlogs辞書を自動的にログします。
これを使用すると、以下の情報が提供されます:
- model.compileで定義されたトレーニングと検証のメトリクス
- システム(CPU/GPU/TPU)メトリクス
- 固定値または学習率スケジューラの学習率
import wandb
from wandb.integration.keras import WandbMetricsLogger
# 新しいW&B runを初期化する
wandb.init(config={"bs": 12})
# WandbMetricsLoggerをmodel.fitに渡す
model.fit(
    X_train, y_train, validation_data=(X_test, y_test), callbacks=[WandbMetricsLogger()]
)
WandbMetricsLogger 参照
| パラメータ | 説明 | 
|---|---|
| log_freq | ("epoch", "batch", または int): "epoch"の場合、各エポックの終了時にメトリクスをログします。"batch"の場合、各バッチの終了時にメトリクスをログします。intの場合、そのバッチ数の終了時にメトリクスをログします。デフォルトは"epoch"です。 | 
| initial_global_step | (int): 学習率がスケジューラを使用している場合に、初期のエポックからトレーニングを再開する際に学習率を正しくログするために使用します。これはstep_size * initial_stepとして計算できます。デフォルトは0です。 | 
WandbModelCheckpointを使用したモデルのチェックポイント作成
Try in a Colab Notebook here →
WandbModelCheckpointコールバックを使用して、Kerasモデル(SavedModel形式)やモデルの重みを定期的に保存し、モデルのバージョン管理のためにW&Bのwandb.Artifactとしてアップロードします。
このコールバックは、tf.keras.callbacks.ModelCheckpoint からサブクラス化されているため、チェックポイントのロジックは親コールバックが処理します。
このコールバックは次の機能を提供します:
- "モニター"に基づいて"最高のパフォーマンス"を達成したモデルを保存します。
- パフォーマンスに関わらず、各エポックの終了時にモデルを保存します。
- エポックの終了時または特定のトレーニングバッチ数後にモデルを保存します。
- モデルの重みのみを保存するか、モデル全体を保存します。
- モデルをSavedModel形式または.h5形式で保存します。
このコールバックはWandbMetricsLoggerと一緒に使用する必要があります。
import wandb
from wandb.integration.keras import WandbMetricsLogger, WandbModelCheckpoint
# 新しいW&Bのrunを初期化する
wandb.init(config={"bs": 12})
# WandbModelCheckpointをmodel.fitに渡す
model.fit(
    X_train,
    y_train,
    validation_data=(X_test, y_test),
    callbacks=[
        WandbMetricsLogger(),
        WandbModelCheckpoint("models"),
    ],
)
WandbModelCheckpoint 参照
| Parameter | Description | 
|---|---|
| filepath | (str): モデルファイルを保存するパス。 | 
| monitor | (str): 監視するメトリック名。 | 
| verbose | (int): 冗長モード、0または1。モード0はサイレントで、モード1はコールバックがアクションを実行する際にメッセージを表示します。 | 
| save_best_only | (bool): save_best_only=Trueの場合、モデルが"最高"と見なされた場合にのみ保存され、監視される量に基づいて最新の最高のモデルは上書きされません。 | 
| save_weights_only | (bool): Trueの場合、モデルの重みだけが保存されます。 | 
| mode | ("auto", "min", または "max"): val_accの場合、これは‘max’であり、val_lossの場合、これは‘min’である必要があります。 | 
| save_weights_only | (bool): Trueの場合、モデルの重みだけが保存されます。 | 
| save_freq | ("epoch" または int): ‘epoch’を使用すると、各エポックの後にモデルが保存されます。整数を使用すると、そのバッチ数の終了時にモデルが保存されます。 val_accやval_lossなどの検証メトリクスを監視する場合、save_freqはエポックの終了時にのみ利用可能なため"epoch"に設定する必要があります。 | 
| options | (str): save_weights_onlyがtrueの場合はオプションのtf.train.CheckpointOptionsオブジェクト、save_weights_onlyがfalseの場合はオプションのtf.saved_model.SaveOptionsオブジェクト。 | 
| initial_value_threshold | (float): 監視するメトリックの初期"最高"値。 | 
Nエポック後にチェックポイントをログする方法は?
デフォルトでは(save_freq="epoch")、コールバックは各エポックの後にチェックポイントを作成し、それをアーティファクトとしてアップロードします。save_freqに整数を渡すと、そのバッチ数後にチェックポイントが作成されます。 Nエポック後にチェックポイントを作成するには、トレインデータローダーのカーディナリティを計算し、それをsave_freqに渡します:
WandbModelCheckpoint(
    filepath="models/",
    save_freq=int((trainloader.cardinality()*N).numpy())
)
TPUノードアーキテクチャーで効率的にチェックポイントをログする方法は?
TPUでチェックポイントを作成する際にUnimplementedError: File system scheme '[local]' not implementedエラーが発生することがあります。これは、モデルディレクトリ(filepath)がクラウドストレージバケットのパス(gs://bucket-name/...)を使用する必要があり、このバケットがTPUサーバーからアクセス可能である必要があるためです。 ただし、ローカルパスを使用してチェックポイントを作成し、それをArtifactsとしてアップロードすることは可能です。
checkpoint_options = tf.saved_model.SaveOptions(experimental_io_device="/job:localhost")
WandbModelCheckpoint(
    filepath="models/,
    options=checkpoint_options,
)
WandbEvalCallbackを使用したモデル予測の可視化
Try in a Colab Notebook here →
WandbEvalCallbackは、主にモデル予測およびデータセットの可視化のためにKerasコールバックを構築するための抽象基本クラスです。
この抽象コールバックは、データセットやタスクに依存しません。これを使用するには、この基本WandbEvalCallbackコールバッククラスから継承し、add_ground_truthおよびadd_model_predictionメソッドを実装します。
WandbEvalCallbackは以下の便利なメソッドを提供するユーティリティクラスです:
- データと予測のwandb.Tableインスタンスを作成
- データと予測テーブルをwandb.Artifactとしてログ
- on_train_beginでデータテーブルをログ
- on_epoch_endで予測テーブルをログ
例えば、以下の画像分類タスクのためにWandbClfEvalCallbackを実装しました。この例のコールバックは:
- W&Bに検証データ(data_table)をログ
- 推論を行い、各エポックの終了時に予測(pred_table)をW&Bにログ
import wandb
from wandb.integration.keras import WandbMetricsLogger, WandbEvalCallback
# モデル予測可視化コールバックを実装する
class WandbClfEvalCallback(WandbEvalCallback):
    def __init__(
        self, validation_data, data_table_columns, pred_table_columns, num_samples=100
    ):
        super().__init__(data_table_columns, pred_table_columns)
        self.x = validation_data[0]
        self.y = validation_data[1]
    def add_ground_truth(self, logs=None):
        for idx, (image, label) in enumerate(zip(self.x, self.y)):
            self.data_table.add_data(idx, wandb.Image(image), label)
    def add_model_predictions(self, epoch, logs=None):
        preds = self.model.predict(self.x, verbose=0)
        preds = tf.argmax(preds, axis=-1)
        table_idxs = self.data_table_ref.get_index()
        for idx in table_idxs:
            pred = preds[idx]
            self.pred_table.add_data(
                epoch,
                self.data_table_ref.data[idx][0],
                self.data_table_ref.data[idx][1],
                self.data_table_ref.data[idx][2],
                pred,
            )
# ...
# 新しいW&B runを初期化
wandb.init(config={"hyper": "parameter"})
# モデルにコールバックを追加
model.fit(
    X_train,
    y_train,
    validation_data=(X_test, y_test),
    callbacks=[
        WandbMetricsLogger(),
        WandbClfEvalCallback(
            validation_data=(X_test, y_test),
            data_table_columns=["idx", "image", "label"],
            pred_table_columns=["epoch", "idx", "image", "label", "pred"],
        ),
    ],
)
💡 テーブルはデフォルトでW&BのArtifact pageにログされ、Workspaceページには表示されません。
WandbEvalCallback 参照
| Parameter | Description | 
|---|---|
| data_table_columns | (list) data_tableのカラム名のリスト | 
| pred_table_columns | (list) pred_tableのカラム名のリスト | 
メモリ使用量はどのように削減されるか?
on_train_beginメソッドが呼び出されたときにdata_tableをW&Bにログします。一度W&B Artifactとしてアップロードされると、このテーブルへの参照を得ることができ、data_table_refクラス変数を使用してアクセスできます。data_table_refは2Dリストで、self.data_table_ref[idx][n]のようにインデックスすることができます。ここでidxは行番号を表し、nは列番号です。以下の例で使用方法を見てみましょう。
コールバックをさらにカスタマイズする
on_train_beginやon_epoch_endメソッドをオーバーライドして、より詳細に制御することができます。Nバッチ後にサンプルをログしたい場合は、on_train_batch_endメソッドを実装します。
💡 WandbEvalCallbackから継承して、モデル予測の可視化コールバックを実装している場合、何か明確にしたいことがあるか修正が必要な場合は、issueを開いてお知らせください。
WandbCallback [Legacy]
W&BライブラリのWandbCallbackクラスを使用して、model.fitで追跡されたすべてのメトリクスと損失値を自動的に保存します。
import wandb
from wandb.integration.keras import WandbCallback
wandb.init(config={"hyper": "parameter"})
...  # Kerasでモデルをセットアップするコード
# コールバックをmodel.fitに渡す
model.fit(
    X_train, y_train, validation_data=(X_test, y_test), callbacks=[WandbCallback()]
)
使用例
W&BとKerasの統合が初めての場合は、この1分間のステップバイステップビデオを参照してください:Get Started with Keras and Weights & Biases in Less Than a Minute
より詳細なビデオについては、Integrate Weights & Biases with Kerasをご覧ください。使用されたノートブックの例はこちらにあります:Colab Jupyter Notebook。
上記のビデオ例をColabノートブックで試してみてください。 またはexample repoを参照して、スクリプトやFashion MNIST exampleおよび生成されたW&Bダッシュボードを確認してください。
WandbCallbackクラスは、監視するメトリクスの指定、重みおよび勾配の追跡、トレーニングデータおよび検証データの予測のログなど、さまざまなログ設定オプションをサポートしています。
完全な詳細については、keras.WandbCallback のリファレンスドキュメントを参照してください。
WandbCallbackは次のことを行います:
- kerasによって収集された任意のメトリクスからの履歴データを自動的にログします:損失およびkeras_model.compile()に渡されたもの
- "best"なトレーニングステップに関連するrunのサマリーメトリクスを設定します。"best"はmonitorおよびmode属性によって定義されます。これはデフォルトで最小のval_lossを持つエポックです。WandbCallbackはデフォルトで最高のエポックに関連するモデルを保存します
- 勾配およびパラメーターのヒストグラムをオプションでログできます
- wandbで可視化するためのトレーニングおよび検証データをオプションで保存できます
WandbCallback 参照
| Arguments | |
|---|---|
| monitor | (str) 監視するメトリクス名。デフォルトは val_loss。 | 
| mode | (str) {auto, min, max}のいずれか。一番小さい monitor 値の時にモデルを保存する -min、一番大きい monitor 値の時にモデルを保存する -max、 自動的にモデルを保存する -auto(デフォルト)。 | 
| save_model | True - monitor が過去のエポックをすべて超えるとモデルを保存する。False - モデルを保存しない。 | 
| save_graph | (boolean) True の場合、モデルグラフを wandb に保存します(デフォルトは True)。 | 
| save_weights_only | (boolean) True の場合、モデルの重みだけが保存されます( model.save_weights(filepath))、そうでない場合はフルモデルが保存されます(model.save(filepath))。 | 
| log_weights | (boolean) True の場合、モデルの層の重みのヒストグラムが保存されます。 | 
| log_gradients | (boolean) True の場合、トレーニング勾配のヒストグラムがログされます。 | 
| training_data | (tuple) (X,y)のフォーマット。勾配の計算用に必要です - これはlog_gradientsがTrue の場合必須です。 | 
| validation_data | (tuple) (X,y)のフォーマット。wandb が視覚化するためのデータセット。これが設定されている場合、毎エポック後に小さな数の予測を行い、将来の視覚化のために結果を保存します。 | 
| generator | (generator) wandb が視覚化するための検証データを返すジェネレータ。このジェネレータは (X,y)のタプルを返すべきです。validate_dataまたは generator のどちらかが設定されるべきです。 | 
| validation_steps | (int) validation_dataがジェネレータの場合、ジェネレータをフル検証セットのために何ステップ走らせるか。 | 
| labels | (list) データを wandb で視覚化する場合、このラベルのリストは数値出力を理解しやすい文字列に変換します。バイナリ分類器を構築する場合、["false のラベル", "true のラベル"] のリストを渡すことができます。 validate_dataや generator のいずれも false の場合、効果はありません。 | 
| predictions | (int) 各エポックの視覚化のために行う予測の数、最大は 100。 | 
| input_type | (string) 視覚化を助けるためのモデル入力のタイプ。以下のいずれか: ( image,images,segmentation_mask)。 | 
| output_type | (string) 視覚化を助けるためのモデル出力のタイプ。以下のいずれか: ( image,images,segmentation_mask)。 | 
| log_evaluation | (boolean) True の場合、各エポックでの検証データとモデルの予測を含むテーブルが保存されます。 詳細については validation_indexes、validation_row_processor、output_row_processorを参照してください。 | 
| class_colors | ([float, float, float]) 入力または出力がセグメンテーションマスクである場合、各クラスの RGB タプル (0-1 の範囲) を含む配列。 | 
| log_batch_frequency | (integer) None の場合、コールバックは各エポックごとにログします。整数に設定すると、 log_batch_frequencyバッチごとにトレーニングメトリクスがログされます。 | 
| log_best_prefix | (string) Noneの場合、追加のサマリーメトリクスは保存されません。文字列に設定すると、監視されたメトリクスとエポックがこの値で先頭に付けられ、サマリーメトリクスとして保存されます。 | 
| validation_indexes | ([wandb.data_types._TableLinkMixin]) 各検証例と関連するインデックスキーの順序付きリスト。 log_evaluation が True であり validation_indexesが提供されている場合、検証データのテーブルは作成されず、各予測はTableLinkMixinによって表される行と関連付けられます。これらのキーを取得する同様の方法はTable.get_index()で返される行キーのリストを使用します。 | 
| validation_row_processor | (Callable) 検証データに適用される関数であり、視覚化によく使用されます。この関数は ndx(int) とrow(dict) を受け取ります。モデルが単一の入力を持つ場合はrow["input"]がその行の入力データになります。それ以外の場合は、入力スロットの名前に基づいてキー付けされます。フィット関数が単一のターゲットを取る場合、row["target"]はその行のターゲットデータになります。それ以外の場合は、出力スロットの名前に基づいてキー付けされます。例えば、入力データが単一の ndarry であるが、データを画像として視覚化したい場合、lambda ndx, row: {"img": wandb.Image(row["input"])}をプロセッサとして提供できます。 log_evaluation が False またはvalidation_indexesが存在する場合は無視されます。 | 
| output_row_processor | (Callable) validation_row_processorと同じですが、モデルの出力に適用されます。row["output"]はモデル出力の結果を含みます。 | 
| infer_missing_processors | (bool) validation_row_processorおよびoutput_row_processorが欠けている場合に推測するかどうかを決定します。 デフォルトは True です。 ラベルが提供されている場合、適切な場所に分類タイププロセッサを推測しようとします。 | 
| log_evaluation_frequency | (int) 評価結果がログされる頻度を決定します。 デフォルトは 0 (トレーニング終了時のみログ)。 毎エポックログする場合は 1 を設定し、他のエポック毎の場合は 2 を設定し、等々。 log_evaluation が False の場合は効果がありません。 | 
よくある質問
Keras のマルチプロセッシングを wandb で使用するにはどうすればよいですか?
use_multiprocessing=True を設定していると、次のようなエラーが発生する場合があります:
Error("You must call wandb.init() before wandb.config.batch_size")
その場合は次のようにしてみてください: