【Pytorch学習ノート十】Tensorboardを使ってPytorchで視覚化する(Tensorboard詳細チュートリアル)

ここに画像の説明を挿入

1. Tensorboard の概要

Tensorboard は tensorflow の組み込み可視化ツールであり、tensorflow プログラムが出力するログ ファイルの情報を可視化することで、tensorflow プログラムの理解、デバッグ、最適化をより簡単かつ効率的にします。これは、ニューラル ネットワーク全体の学習プロセス、データの分布、パフォーマンスのボトルネックなどを理解するのに役立ちます。
公式ウェブサイト: https: //tensorflow.google.cn/tensorboard

TensorBoard は、機械学習の実験に必要な視覚化とツールを提供します。

  • 損失や精度などの指標を追跡および視覚化する
  • モデル図 (オペレーションとレイヤー) を視覚化する
  • 重み、バイアス、またはその他のテンソルの経時的なヒストグラムを表示する
  • 埋め込みを低次元空間に投影する
  • 画像、テキスト、音声データを表示します
  • TensorFlow プログラムの分析
  • もっと

TensorBoardX 視覚化プロセスでは、まず Python コードを記述して視覚化するデータをイベント ファイルに保存し、次に TensorBoardX を使用してイベント ファイルを読み取り、Web ページに表示する必要があります。TensorBoard は現在、スカラー、画像、オーディオ、グラフ、分布、ヒストグラム、埋め込みの 7 つの視覚化をサポートしています。

画像

github URL: https://github.com/lanpa/tensorboardX

2. Tensorboard のインストールと使用

まずテンソルボードをインストールする必要があります

#安装tensorboard
pip install tensorboard
#安装tensorboardX
pip install tensorboardX
#安装crc32c加速
pip install crc32c

インストールが完了したら、visdom などの独立したコマンドを実行してtensorboard --logdir logs起動します。デフォルトのポートは 6006 です。ブラウザで開くとhttp://localhost:6006/Web ページが表示されます。Chrome を使用するのが最善ですが、他のブラウザでは読み込みに失敗する可能性があります。

GitHub の公式 Web サイトでコードを実行する例を次に示します。

ダウンロードコード: https://github.com/lanpa/tensorboardX

手順に従ってコードを実行します

画像-20220903162402364

オープンテンソルボード、

画像-20220903162503731

ブラウザに次のように入力します。

http://ローカルホスト:6006/

ここに画像の説明を挿入

3. テンソルボードでのページの導入

ページ 詳細は公式サイトをご覧ください
スカラー スカラー データを要約して記録します。通常、精度率 (val acc)、損失値 (トレーニング/テスト損失)、学習率 (学習率)、トレーニング プロセス中の各層の重みとバイアスを視覚化するために使用されます。統計の変化曲線 (平均、標準、最大/最小)など。
画像 現在のトレーニングラウンドで使用されているトレーニング/テスト画像または特徴マップを視覚化します。
グラフ 計算グラフの構造と計算グラフ上の情報を視覚化します。通常、ネットワークの構造と、各デバイスでのトレーニングに消費されるメモリと時間を示すために使用されます。
ヒストグラム テンソルの値の分布を視覚化し、変数のヒストグラムを記録します (統計的テンソルは反復回数に応じて変化します)。
分布 トレーニング中に記録されたデータを示すパーティション プロット。
プロジェクター フルネーム 可視化用のプロジェクター高次元ベクトルを埋め込む
オーディオ トレーニング中に録音された音声を表示します。
埋め込み 単語ベクトルを表示した後の投影除算。

ここに画像の説明を挿入

4. PyTorch での視覚化

4.1 画像表示

add_image(tag, img_tensor, global_step=None, walltime=None, dataformats='CHW')
#tag:图像的标签名,图像的唯一标识
#img_tensor:图像数据,需要注意尺度
#global_step:记录这是第几个子图
#dataformats:数据形式,取值有'CHW','HWC','HW'。如果像素值在 [0, 1] 之间,那么默认会乘以 255,放大到 [0, 255] 范围之间。如果有大于 1 的像素值,认为已经是 [0, 255] 范围,那么就不会放大。

コード例:

import torch
import numpy as np
import torch.nn as nn
import torch.nn.functional as F
from PIL import Image
from torchvision import transforms
from torchvision import models,datasets
from torch.utils.tensorboard import SummaryWriter
GZ_img  = Image.open('G:\Desktop\关注我呀.jpg')
print(GZ_img.size)
#变成224x224的图片
transform_224 = transforms.Compose([
        transforms.Resize(224),
        transforms.CenterCrop(224),
        transforms.ToTensor(),
    ])
GZ_img_224=transform_224(GZ_img )

writer = SummaryWriter(log_dir='./logs', comment='GZ image') # 这里的logs要与--logdir的参数一样
writer.add_image("GZ",cat_img_224)
writer.close()# 执行close立即刷新,否则将每120秒自动刷新

画像-20220903165656543

テンソルボードを開く:

tensorboard --logdir=runs

ブラウザに次のように入力します。

http://ローカルホスト:6006/

画像-20220903170017136

4.2 更新損失関数

x = torch.FloatTensor([100])
y = torch.FloatTensor([500])

for epoch in range(30):
    x = x * 1.2
    y = y / 1.1
    loss = np.random.random()
    with SummaryWriter(log_dir='./logs', comment='train') as writer: #可以直接使用python的with语法,自动调用close方法
        #数据分布直方图
        writer.add_histogram('his/x', x, epoch)
        writer.add_histogram('his/y', y, epoch)
        #绘制x,y随epoch变化图像
        writer.add_scalar('data/x', x, epoch)
        writer.add_scalar('data/y', y, epoch)
        #损失函数图像
        writer.add_scalar('data/loss', loss, epoch)
        writer.add_scalars('data/data_group', {
    
    'x': x,
                                                'y': y}, epoch)

データ分布ヒストグラム:図内の位置は、7 番目のエポックに 234 が 1 回出現したことを示しています

画像-20220903172651571

次の図はデータ分布図です。

画像-20220903172831238

4.3 PROJECTOR を使用した高次元ベクトルの視覚化

add_embedding は、埋め込みベクトルを記録し、2D/3D 視覚分析をサポートしており、高次元特徴を 2 次元平面または 3 次元空間表示に縮小することで、相関分析を実行するのに便利です。

add_embedding(mat, metadata=None, label_img=None, global_step=None, tag='default', metadata_header=None)
#add_embedding参数:mat (torch.Tensor or numpy.array):一个矩阵,每一行都是数据点的特征向量,要求形状(N, D),其中 N 是数据数量,D 是特征维度。
#metadata (list):标签列表,每个元素将被转换为字符串
#label_img (torch.Tensor):图像对应每个数据点,要求形状(N,C,H,W)。
#global_step (int):要记录的全局步长值
#tag (string):嵌入的名称

サンプルコード:

from torch.utils.tensorboard import SummaryWriter
import torchvision

writer = SummaryWriter('exp1')
num = 200#取MNIST训练集中的200个数据添加到Summary
mnist = torchvision.datasets.MNIST('mnist', download=True)
mat = mnist.train_data.reshape((-1, 28 * 28))[:num,:]#图像展开成一维向量
metadata = mnist.train_labels[:num]
label_img = mnist.train_data[:num,:,:].reshape((-1, 1, 28, 28)).float()/255#归一化

writer.add_embedding(mat,metadata=metadata,label_img = label_img,global_step=0)
writer.close()

ここに画像の説明を挿入

4.4 ネットワーク構造の描画

pytorch では、print を使用してネットワークの構造を直接出力できますが、この方法では視覚化効果が不十分です。pytorch は動的グラフ計算を使用するため、ここで順伝播を手動で実行する必要があります。
vgg16 をディスプレイとして使用します。

vgg16 = models.vgg16(pretrained=True) # 这里下载预训练好的模型
print(vgg16) # 打印一下这个模型

結果:

VGG(
  (features): Sequential(
    (0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (1): ReLU(inplace=True)
    (2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (3): ReLU(inplace=True)
    (4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (5): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (6): ReLU(inplace=True)
    (7): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (8): ReLU(inplace=True)
    (9): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (10): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (11): ReLU(inplace=True)
    (12): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (13): ReLU(inplace=True)
    (14): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (15): ReLU(inplace=True)
    (16): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (17): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (18): ReLU(inplace=True)
    (19): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (20): ReLU(inplace=True)
    (21): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (22): ReLU(inplace=True)
    (23): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (24): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (25): ReLU(inplace=True)
    (26): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (27): ReLU(inplace=True)
    (28): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (29): ReLU(inplace=True)
    (30): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  )
  (avgpool): AdaptiveAvgPool2d(output_size=(7, 7))
  (classifier): Sequential(
    (0): Linear(in_features=25088, out_features=4096, bias=True)
    (1): ReLU(inplace=True)
    (2): Dropout(p=0.5, inplace=False)
    (3): Linear(in_features=4096, out_features=4096, bias=True)
    (4): ReLU(inplace=True)
    (5): Dropout(p=0.5, inplace=False)
    (6): Linear(in_features=4096, out_features=1000, bias=True)
  )
)

テンソルボードで視覚化します。

add_graph(model, input_to_model=None, verbose=False)
#model:模型,必须继承自 nn.Module
#input_to_model:输入给模型的数据,形状为 BCHW
#verbose:是否打印图结构信息

コード例:

transform_2 = transforms.Compose([
    transforms.Resize(224), 
    transforms.CenterCrop((224,224)),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406],
                                std=[0.229, 0.224, 0.225])
])
 #因为pytorch的是分批次进行的,所以我们这里建立一个批次为1的数据集
# np.newaxis,当作为第一个元素时对行增加一维,作为第二个元素时对列增加一个维度   
vgg16_input=transform_2(cat_img)[np.newaxis]#
out = vgg16(vgg16_input)
_, preds = torch.max(out.data, 1)
label=preds.numpy()[0]
with SummaryWriter(log_dir='./exp1', comment='vgg161') as writer:
    writer.add_graph(vgg16, vgg16_input)

画像-20220903210639051

参考文献:

https://zhuanlan.zhihu.com/p/414644289

https://handbook.pytorch.wiki/chapter4/4.2.2-tensorboardx.html
公開アカウント [スマート建設 Xiaoshuo] へようこそ (コンピューター プログラミング、人工知能、インテリジェント建設、日々の学習と科学研究の経験を共有し、など、コミュニケーションに注目してください。)

おすすめ

転載: blog.csdn.net/QH2107/article/details/126682944