🤩

【Python】TensorBoardのlogをpandas.DataFrame型にしグラフを描画する

2022/03/13に公開

作成したライブラリ↓

はじめに

はじめに,本記事で筆者が使用している環境や必要なライブラリについてまとめます.

なお,一部以下の記事の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

acc

loss

loss

lr

lr
ちなみにこの形の学習率は機械学習でよく利用されていて,その理由として

  • はじめに徐々に上昇 (warmup) させるのは,ロードした学習重みを大きく崩すことなく使用できることが多い
  • 徐々に学習率を減衰 (decay) させるのは過学習を防ぐことができる
    が挙げられるます.他にもたくさん理由があると思うので,ご存じでしたら教えてください!

そのためYOLOXなどのメジャーなモデルにも使用されています↓

おわりに

本記事ではTensorBoardで記録したログを扱いやすい拡張子で記録することを目的としてきました.
機械学習をしている方等の少しでも助けになれば幸いです.

ZennGitHubTwitterをフォローしていただけると励みになります.

GitHubで編集を提案

Discussion