WandbEvalCallback
2 minute read
Keras コールバックをモデル予測の可視化用に構築するための抽象基本クラス。
WandbEvalCallback(
data_table_columns: List[str],
pred_table_columns: List[str],
*args,
**kwargs
) -> None
エポック終了時 (on_epoch_end
) にモデル予測を可視化するためのコールバックを構築し、分類、オブジェクト検出、セグメンテーションなどのタスク用に model.fit()
に渡すことができます。
これを使用するには、このベースコールバッククラスから継承し、add_ground_truth
と add_model_prediction
メソッドを実装します。
この基本クラスは以下のことを処理します:
- 正解をログするための
data_table
と予測のためのpred_table
を初期化します。 data_table
にアップロードされたデータはpred_table
の参照として使用されます。これはメモリフットプリントを削減するためです。data_table_ref
は参照されたデータにアクセスするために使用できるリストです。以下の例を見て方法を確認してください。- W&B にテーブルを W&B Artifacts としてログします。
- 新しい
pred_table
はエイリアスとともに新しいバージョンとしてログされます。
例:
class WandbClfEvalCallback(WandbEvalCallback):
def __init__(self, validation_data, data_table_columns, pred_table_columns):
super().__init__(data_table_columns, pred_table_columns)
self.x = validation_data[0]
self.y = validation_data[1]
def add_ground_truth(self):
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):
preds = self.model.predict(self.x, verbose=0)
preds = tf.argmax(preds, axis=-1)
data_table_ref = self.data_table_ref
table_idxs = data_table_ref.get_index()
for idx in table_idxs:
pred = preds[idx]
self.pred_table.add_data(
epoch,
data_table_ref.data[idx][0],
data_table_ref.data[idx][1],
data_table_ref.data[idx][2],
pred,
)
model.fit(
x,
y,
epochs=2,
validation_data=(x, y),
callbacks=[
WandbClfEvalCallback(
validation_data=(x, y),
data_table_columns=["idx", "image", "label"],
pred_table_columns=["epoch", "idx", "image", "label", "pred"],
)
],
)
より詳細に制御したい場合は、on_train_begin
と on_epoch_end
メソッドをオーバーライドできます。N バッチごとにサンプルをログしたい場合は、on_train_batch_end
メソッドを実装することができます。
メソッド
add_ground_truth
@abc.abstractmethod
add_ground_truth(
logs: Optional[Dict[str, float]] = None
) -> None
正解データを data_table
に追加します。
このメソッドを使用して、init_data_table
メソッドを使用して初期化された data_table
にバリデーション/トレーニングデータを追加するロジックを書きます。
例:
for idx, data in enumerate(dataloader):
self.data_table.add_data(idx, data)
このメソッドは、on_train_begin
または同等のフックで呼び出されます。
add_model_predictions
@abc.abstractmethod
add_model_predictions(
epoch: int,
logs: Optional[Dict[str, float]] = None
) -> None
モデルからの予測を pred_table
に追加します。
このメソッドを使用して、init_pred_table
メソッドを使用して初期化された pred_table
にバリデーション/トレーニングデータのモデル予測を追加するロジックを書きます。
例:
# dataloader がサンプルをシャッフルしていないと仮定します。
for idx, data in enumerate(dataloader):
preds = model.predict(data)
self.pred_table.add_data(
self.data_table_ref.data[idx][0],
self.data_table_ref.data[idx][1],
preds,
)
このメソッドは、on_epoch_end
または同等のフックで呼び出されます。
init_data_table
init_data_table(
column_names: List[str]
) -> None
バリデーションデータ用の W&B テーブルを初期化します。
このメソッドを on_train_begin
または同等のフックで呼び出します。これに続いて、テーブルに行または列ごとにデータを追加します。
引数 | |
---|---|
column_names |
(list) W&B テーブルのカラム名です。 |
init_pred_table
init_pred_table(
column_names: List[str]
) -> None
モデルの評価用の W&B テーブルを初期化します。
このメソッドを on_epoch_end
または同等のフックで呼び出します。これに続いて、テーブルに行または列ごとにデータを追加します。
引数 | |
---|---|
column_names |
(list) W&B テーブルのカラム名です。 |
log_data_table
log_data_table(
name: str = "val",
type: str = "dataset",
table_name: str = "val_data"
) -> None
data_table
を W&B Artifacts としてログし、use_artifact
を呼び出します。
これにより、評価テーブルが既にアップロードされたデータ(画像、テキスト、スカラーなど)の参照を再アップロードせずに使用できます。
引数 | |
---|---|
name |
(str) このアーティファクトの人間が読める名前で、UIでこのアーティファクトを識別したり、use_artifact呼び出しで参照したりする方法です。(デフォルトは ‘val’) |
type |
(str) アーティファクトのタイプで、アーティファクトを整理し区別するために使用されます。(デフォルトは ‘dataset’) |
table_name |
(str) UIで表示されるテーブルの名前です。(デフォルトは ‘val_data’) |
log_pred_table
log_pred_table(
type: str = "evaluation",
table_name: str = "eval_data",
aliases: Optional[List[str]] = None
) -> None
モデルの評価用の W&B テーブルをログします。
テーブルは新しいバージョンを作成しながら複数回ログされます。これを使用して、異なる間隔でモデルをインタラクティブに比較します。
引数 | |
---|---|
type |
(str) アーティファクトのタイプで、アーティファクトを整理し区別するために使用されます。(デフォルトは ’evaluation’) |
table_name |
(str) UIで表示されるテーブルの名前です。(デフォルトは ’eval_data’) |
aliases |
(List[str]) 予測テーブルのエイリアスのリストです。 |
set_model
set_model(
model
)
set_params
set_params(
params
)
フィードバック
このページは役に立ちましたか?
Glad to hear it! If you have further feedback, please let us know.
Sorry to hear that. Please tell us how we can improve.