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

jupyter notebookをlatexに変換して編集&コンパイル

授業の課題をjupyter notebookで解いたのち、latexに変換して編集できるようにする方法の紹介です。 ちなみに, markdownに変換する方が楽だったのでそちらも追記します。

latexに変換する方法

jupyter-nbconvert --to latex hogehoge.ipynb

これで, 同じ名前でtexファイルが生成されます.

その後, macbookコンパイルするために以下の操作を行いました

  • 文章クラスをjsarticleに変更(日本語を使っている場合)
  • fontspec パッケージのコメントアウト(エラーが出ます)
  • 画像をepsファイルで出力しておく(pngだとコンパイルできない。僕の環境だけ?)
  • 著者名の挿入、図のサイズの変更などで体裁を整える

markdownに変換する

jupyter-nbconvert --to markdown hogehoge.ipynb

その後markdownのビューワーで開いてpdfに変換します。個人的にTyporaのスタイルが美しくて気に入っているので使っています。