1. HOME
  2. ブログ
  3. IT技術
  4. TensorBoard in Colaboratory notebook で Pytorch の機械学習プロセスを可視化する

TensorBoard in Colaboratory notebook で Pytorch の機械学習プロセスを可視化する

Pytorch で TensorBoard を使用する

「TensorBoard」は、TensorFlow に付属した可視化を助けるツールです。

ですが、「Pytorch」でも、公式にサポートされていますので、Pytorch を使用すれば、TensorFlow と同じく、TensorBoard でグラフの作成などを行うことができます。

今回は、この Pytorch を使用して「Google Colaboratory」の Notebook 上で TensorBoard を起動し、活用する方法について解説したいと思います!

TensorBoard を使用するために TensorBoardX をセットアップ

Pytorch では、通常、 torch.utils.tensorboard  の「SummaryWriter」というクラスを使用して、TensorBoard を操作します。

ですが、Pytorch に特化した「TensorBoardX」というサードパーティのライブラリも用意されています。

そのため、TensorBoardX ライブラリを活用すれば、より torch.tensor のデータが扱いやすくなります。

TensorBoardX をインストールする

Colaboratory 上では、まず、TensorBoardX をインストールする必要があります。

TensorBoard を使用する流れ

TensorBoard を使用する流れは、以下の通りです。

  1. tensorboardX.SummaryWriter() を使用し、ログ保存用のファイルディレクトリを作成する
  2. add_something(tag name, object, iteration number) を用いて、各データに応じたログの保存を行う
  3. SummaryWriter を閉じる
  4. TensorBoard を起動し、ログデータを表示する

SummaryWriter クラスをインポートする

tensorboardX.SummaryWriter クラスをインポートして、まず、ログディレクトリ(logdir)を定義します。

SummaryWriter() に任意のログディレクトリを指定でき、指定しない場合は、デフォルトのディレクトリが作成されます。

ログを保存する場所を整理したり、複数のデータや設定を比較したりするときなどに使い分けることが可能です。

定義したログディレクトリ

ディレクトリを定義したら、次に、ログの保存を行っていきます。

ログ保存のフォーマット

ログを保存するフォーマットは、 add_something(tag name, object, iteration number) となっています。

そして、 something の部分は、データの種類に応じて、

  1. add_scalar
  2. add_image, add_images
  3. add_histogram
  4. add_figure
  5. add_graph
  6. add_embedding
  7. add_pr_curve

などのフォーマットが用意されています。

今回は、この中のいくつかを用い、TensorBoard で可視化していきたいと思います。

なお、詳細は、以下のサイトをご確認ください。

【TensorBoardX 公式ページ】
https://tensorboardx.readthedocs.io/en/latest/tensorboard.html

add_image, add_images で画像を表示する

MNIST の画像データを TensorBoard で表示してみましょう。

MNIST の画像データセットを用意

make_grid で画像データを作成し、writer に保存する

make_grid で作成した画像データを add_image() で「writer」に保存します。

「writer」への書き込み後は、  close()  で SummaryWriter を閉じます。

TensorBoard を起動し、img_grid を表示する

では、TensorBoard を起動し、保存した img_grid を表示してみます。

Colaboratory では、以下のコードで「TensorBoard notebook」の読み込みと起動を行います。

実行すると、Notebook 内で TensorBoard が起動し、保存した img_grid の画像が指定したタグ名で表示されています。

img_grid の画像

add_image() には、タグ名(tag)画像データを渡します。

画像データは、uint8(0, 255)、もしくは、float32(0, 1)の Tensor です。

形状は、[channel, height, width] がデフォルトですが、dataformats に 'HW' や 'HWC' など渡すことで対応できます。

この img_grid は、torchvision の make_grid で画像を並べたものを add_image() で表示しています。

add_images() で複数枚の画像を並べて表示する

ですが、 add_images() を使えば、複数枚の画像 [n, channel, height, width] を1枚ずつ並べることができます。

同じ様に、add_images でログを保存したら、先ほど起動した TensorBoard のリロードアイコンで更新すると新しく追加したログデータを表示できます。

並べて表示した16枚の画像

これらは、画像を表示しただけですが、add_embedding を使用することで、より TensorBoard の威力を発揮することができます。

add_embedding による次元削減と可視化

データ分析では、高次元データの次元削減や特徴空間上への可視化を、以下などの手法を使って行います。

  1. PCA(Principal Component Analysis)
  2. t-SNE(t-distributed Stochastic Neighbor Embedding)
  3. UMAP(Uniform Manifold Approximation and Projection)

add_embedding() では、これらを TensorBoard 上で簡単に行うことができます。

add_embedding() に渡すのは、プロットする [n : プロット数, d : 次元数] の Tensor、リストのラベルデータラベルの画像データ[N,C,H,W] です。

今回は、MNIST の784次元、1000枚の画像をプロットしています。

【PROJECTOR】タブが作成され、3次元空間上に MNIST の手書き数字画像が描画されます。

PCA を用いて可視化

このプロジェクター上では、自由に軸を動かしたり、ズームしたりできます。

また、画像をクリックすると近い特徴量をもつ周りの画像を表示してくれたりします。

「PCA」の他に、「t-SNE(下画像)」や「UMAP」タブがあり、それぞれの方法で「学習」、「クラスタリング」、「可視化」を行うことができます。

そのほか、見た目などを設定することができるので、試してみてください。

t-SNE を用いて可視化

add_graph でネットワークモデルをグラフ化する

次に、学習ネットワークモデルを構築し、それを TensorBoard でグラフ化したいと思います。

学習ネットワークモデルを構築

構築したネットワークモデルをグラフ化

ここで、 add_graph() を使用するのですが、TensorBoardX で add_graph を使用して作成すると、不完全なグラフになってしまったり、表示がされないという不具合がみられました。

ただ、通常の torch.utils.tensorboard の SummaryWriter クラスを使用して、同様に add_graph() で作成すれば問題なく Tensorboard で表示することができました。

add_graph は、ネットワークモデルと学習データを渡すことで、そのネットワークがどういう構造で構成されているかを模式的に表示させることができます。

データの流れやネットワークの構造を視覚的に確認できるので、モデルを整理して見直すことができます。

グラフ化したネットワーク構造

add_scalar による学習の可視化

ここからは、モデルの学習を行い、 add_scalar() を用いて損失関数値のグラフ化を行いたいと思います。

モデルの学習を実施

学習の進行を可視化

add_scalar() は、スカラー値のシンプルなグラフ化を行うことができます。

今回は、学習中の損失関数の値を「5」イテレーション毎に、ログを保存する形でグラフ化をしました。

【SCALARS】というタブに、損失関数値のグラフ(縦軸が損失、横軸はイテレーション)が表示されています。

損失関数値のグラフ

このように、対数グラフでの表示もできます。

イテレーション数が「250」を超えると、損失関数の値が減少し、学習が進んでいる様子が分かりますね。

マウスをグラフに乗せると、ピンポイントの数値を確認できたり、スムージングやデータのダウンロードなどを行うことができます。

add_pr_curve による PR 曲線描画

最後に、学習済みモデルの検証のため、テストデータによる精度算出と add_pr_curve() を用いて TensorBoard 上に PR(Precision - Recall)曲線を描画します。

テストデータでモデルの精度を算出

算出したモデルの精度

TensorBoard 上に PR 曲線を描画

add_pr_curve() に与えるデータは、テストデータのバイナリーラベル(0、1、もしくは、True、False)モデルの予測確率値(0~1)で、どちらも Tensor です。

これを、各クラス毎(今回は0〜9)にグラフ化していくと、それぞれの PR 曲線が得られます。

また閾値(num_thresholds)は、デフォルトで「127」であり、自由に設定してグラフを確認することができます。

PR 曲線のグラフ

さいごに

TensorBoard は、便利であると同時に、視覚に訴えるので楽しみながら使うことができます。

データからネットワークモデルの学習・検証まで、一連の機械学習プロセスを場面に応じて可視化でき、より効率的で直感的な分析ができるようになります。

ぜひ、他の機能についても調べてみてください!

こちらの記事もオススメ!

書いた人はこんな人

広告メディア事業部
広告メディア事業部
「好きを仕事にするエンジニア集団」の(株)ライトコードです!

ライトコードは、福岡、東京、大阪の3拠点で事業展開するIT企業です。
現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。
いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。

システム開発依頼・お見積もり大歓迎!

また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」「WEBディレクター」を積極採用中です!
インターンや新卒採用も行っております。

以下よりご応募をお待ちしております!
https://rightcode.co.jp/recruit

関連記事

採用情報

\ あの有名サービスに参画!? /

バックエンドエンジニア

\ クリエイティブの最前線 /

フロントエンドエンジニア

\ 世界を変える…! /

Androidエンジニア

\ みんなが使うアプリを創る /

iOSエンジニア