PyTorchのTensorBoardで数エポックに一度バリデーションを行う場合の書き方
PyTorchのversion1.2から正式にTensorBoardが追加されました1. これまで損失や正解率などの推移は自分でmatplotlibで書き出していたのですが, これを機にtensorboardを使う方法に切り替えるつもりです. また, tensorboardは画像も記録できるようで, 画像生成の研究などをするときにも力を発揮しそうです.
ちなみに, TensorBoardX2を使えばPyTorchでtensorboardが使えたのですが, こちらはスルーしていました...
基本的な使い方
損失や正解率など, スカラー値はadd_scalar
やadd_scalars
などのメソッドを使い記録していくようです.
詳しい説明は以下のリンク先を参照してください
add_scalars
を使うと, 同じセルに複数の種類の値をプロットすることができます.
数エポックに一度バリデーションをする時の書き方
モデルの学習がうまくいっているか確認するために、バリデーション用のデータのロスや正解率を確認するようなシチュエーションを考えます。
毎エポック評価をする必要がないとき、数エポックに一度だけ評価をすることがあるかと思いますが、そのような場合のtensorboardを使ったコードの書き方は以下のようになります。
from torch.utils.tensorboard import SummaryWriter import numpy as np writer = SummaryWriter(log_dir='./log_test') for i in range(100): train_loss = np.random.randn() if (i + 1) % 5 == 0: # 5エポックに一度バリデーションロスを計算 val_loss = np.random.randn() writer.add_scalars( 'Loss', {'train_loss': train_loss, 'val_loss': val_loss}, # train_lossとval_lossの両方を記録 i+1) else: writer.add_scalars( 'Loss', {'train_loss': train_loss}, # train_lossのみを記録 i+1) writer.close()
バリデーションデータで評価をしたエポックとしないエポックで処理を変えています。
どちらもadd_scalars
メソッドを使いますが, 評価をしたエポックではtrainingとvalidationの両方の値を記録していて, しなかったエポックではtrainingの結果のみ記録します.