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の結果のみ記録します.
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のスタイルが美しくて気に入っているので使っています。