🤩
【Python】TensorBoardのlogをpandas.DataFrame型にしグラフを描画する
作成したライブラリ↓
はじめに
はじめに,本記事で筆者が使用している環境や必要なライブラリについてまとめます.
なお,一部以下の記事のlog
を使用しています↓
環境
PC | MacBook Pro (16-inch, 2019) |
---|---|
OS | Monterey |
CPU | 2.3 GHz 8コアIntel Core i9 |
メモリ | 16GB |
Python | 3.9 |
使用するライブラリ
本記事で用いるライブラリとバージョンをまとめますが,特に気にせず
terminal
pip install matplotlib pandas seaborn tensorboard
で問題ないかと思います.
ライブラリ | バージョン |
---|---|
matplotlib | 3.5.1 |
pandas | 1.4.1 |
seaborn | 0.11.2 |
tensorboard | 2.8.0 |
念の為ライブラリとバージョンも記しておきます.
なお,本記事のコードは以下のコマンドで簡単に利用することができるようになっています.是非利用して感想等くだされば幸いです.
terminal
pip install git+https://github.com/a5chin/awesome-board
実際にコードを書いていく
main.py
import logging
import pandas as pd
import matplotlib.pyplot as plt
# seabornのstyleに変更
import seaborn as sns; sns.set()
from typing import Dict
from pathlib import Path
from tensorboard.backend.event_processing.event_accumulator import EventAccumulator
class Board:
WALL_TIME = 0
STEP = 1
VALUE = 2
def __init__(self, log_dir: str) -> None:
self.log_files = [path for path in Path(log_dir).glob("**/*") if path.is_file()]
self.scalars = self.get_scalars()
self._logger = get_logger()
def get_scalars(self) -> Dict:
data = {log_file.parent.name: {} for log_file in self.log_files}
for log_file in self.log_files:
event = EventAccumulator(str(log_file))
event.Reload()
# tags == ["loss", "accuracy", "lr"]
tags = event.Tags()["scalars"]
for tag in tags:
scalars = event.Scalars(tag)
data[log_file.parent.name][tag] = []
# データの格納
for scalar in scalars:
data[log_file.parent.name][tag].append(scalar[Board.VALUE])
return data
def savefig(self, output_dir: str, extention: str="png") -> None:
Path(output_dir).mkdir(parents=True, exist_ok=True)
for file in self.scalars.keys():
for tag in self.scalars[file].keys():
df = pd.DataFrame(self.scalars[file][tag])
df.plot(kind="line", title=tag, legend=False)
plt.savefig(f"{output_dir}/{file}_{tag}.{extention}")
plt.close()
if __name__ == "__main__":
board = Board("logs")
board.savefig("outputs")
結果
accuracy
loss
lr
ちなみにこの形の学習率は機械学習でよく利用されていて,その理由として
- はじめに徐々に上昇 (warmup) させるのは,ロードした学習重みを大きく崩すことなく使用できることが多い
- 徐々に学習率を減衰 (decay) させるのは過学習を防ぐことができる
が挙げられるます.他にもたくさん理由があると思うので,ご存じでしたら教えてください!
そのためYOLOX
などのメジャーなモデルにも使用されています↓
おわりに
本記事ではTensorBoard
で記録したログを扱いやすい拡張子で記録することを目的としてきました.
機械学習をしている方等の少しでも助けになれば幸いです.
Discussion