The End of the World

勉強したことのメモが中心。たまに日々の雑感。

PyTorchのTensorBoardで数エポックに一度バリデーションを行う場合の書き方

PyTorchのversion1.2から正式にTensorBoardが追加されました1. これまで損失や正解率などの推移は自分でmatplotlibで書き出していたのですが, これを機にtensorboardを使う方法に切り替えるつもりです. また, tensorboardは画像も記録できるようで, 画像生成の研究などをするときにも力を発揮しそうです.

ちなみに, TensorBoardX2を使えばPyTorchでtensorboardが使えたのですが, こちらはスルーしていました...

基本的な使い方

損失や正解率など, スカラー値はadd_scalaradd_scalarsなどのメソッドを使い記録していくようです.

詳しい説明は以下のリンク先を参照してください

pytorch.org

pytorch.org

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の結果のみ記録します.