[Pytorch Study Notes Ten] Utilisez Tensorboard pour visualiser dans Pytorch (tutoriel détaillé de Tensorboard)

insérer la description de l'image ici

1. Introduction à Tensorboard

Tensorboard est un outil de visualisation intégré de tensorflow, qui rend la compréhension, le débogage et l'optimisation du programme tensorflow plus faciles et plus efficaces en visualisant les informations du fichier journal généré par le programme tensorflow. Cela peut nous aider à comprendre le processus d'apprentissage de l'ensemble du réseau neuronal, la distribution des données, les goulots d'étranglement des performances, etc.
Site officiel : https://tensorflow.google.cn/tensorboard

TensorBoard fournit la visualisation et les outils nécessaires aux expériences d'apprentissage automatique :

  • Suivez et visualisez des mesures telles que la perte et la précision
  • Visualiser des diagrammes de modèles (opérations et couches)
  • Afficher des histogrammes de poids, de biais ou d'autres tenseurs au fil du temps
  • Projeter l'intégration dans un espace de dimension inférieure
  • Afficher des images, du texte et des données audio
  • Disséquer un programme TensorFlow
  • et plus

Le processus de visualisation TensorBoardX doit d'abord écrire du code Python pour enregistrer les données à visualiser dans le fichier d'événement, puis utiliser TensorBoardX pour lire le fichier d'événement et l'afficher sur la page Web. TensorBoard prend actuellement en charge 7 visualisations, scalaires, images, audio, graphiques, distributions, histogrammes et intégrations.

img

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

2. Installation et utilisation du Tensorboard

Vous devez d’abord installer le tensorboard

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

Une fois l'installation terminée, exécutez une commande indépendante comme visdom tensorboard --logdir logspour le démarrer. Le port par défaut est 6006. Ouvrez-le dans un navigateur http://localhost:6006/pour voir la page Web. Il est préférable d'utiliser Chrome, d'autres navigateurs peuvent ne pas se charger.

Voici un exemple d'exécution du code sur le site officiel de GitHub :

Code de téléchargement : https://github.com/lanpa/tensorboardX

Suivez les étapes pour exécuter le code

image-20220903162402364

tableau tenseur ouvert,

image-20220903162503731

Tapez dans votre navigateur :

http://localhost:6006/

insérer la description de l'image ici

3. Introduction de la page dans Tensorboard

page Pour plus de détails, veuillez vous référer au site officiel
SCALAIRE Résumer et enregistrer les données scalaires, généralement utilisées pour visualiser le taux de précision (val acc), la valeur de perte (perte de train/test), le taux d'apprentissage (taux d'apprentissage), les poids et les biais de chaque couche pendant le processus de formation. La courbe de changement des statistiques ( moyenne, standard, max/min), etc.
IMAGES Visualisez les images de formation/test ou les cartes de fonctionnalités utilisées dans le cycle de formation en cours
GRAPHIQUES Visualisez la structure du graphique de calcul et les informations sur le graphique de calcul, généralement utilisées pour montrer la structure du réseau ainsi que la mémoire et le temps consommés par l'entraînement sur chaque appareil.
HISTOGRAMMES Visualisez la distribution des valeurs du tenseur et enregistrez l'histogramme de la variable (le tenseur statistique change avec le nombre d'itérations)
Distribution Graphique de partition montrant les données enregistrées pendant l'entraînement.
PROJECTEUR Nom complet Embedding Projecteur vecteur haute dimension pour la visualisation
l'audio Affiche l'audio enregistré pendant l'entraînement.
Intégrations Division projetée après affichage des vecteurs de mots.

insérer la description de l'image ici

4. Visualisation dans PyTorch

4.1 Affichage des images

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] 范围,那么就不会放大。

Exemple de code :

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秒自动刷新

image-20220903165656543

Tableau tenseur ouvert :

tensorboard --logdir=exécute

Tapez dans votre navigateur :

http://localhost:6006/

image-20220903170017136

4.2 Fonction de perte de mise à jour

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)

Histogramme de distribution des données : la position sur la figure indique que 234 sont apparus une fois à la septième époque

image-20220903172651571

Les figures suivantes sont des diagrammes de distribution de données

image-20220903172831238

4.3 Utilisation de PROJECTOR pour visualiser des vecteurs de grande dimension

add_embedding enregistre le vecteur d'intégration et prend en charge l'analyse visuelle 2D/3D. En réduisant les caractéristiques de haute dimension à un plan bidimensionnel ou à un affichage spatial tridimensionnel, il nous est pratique d'effectuer une analyse de corrélation.

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):嵌入的名称

Exemple de code :

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()

insérer la description de l'image ici

4.4 Dessiner la structure du réseau

Dans pytorch, nous pouvons utiliser print pour imprimer directement la structure du réseau, mais cette méthode a un mauvais effet de visualisation. Étant donné que pytorch utilise des calculs de graphiques dynamiques, nous devons ici effectuer manuellement une propagation vers l'avant.
Utilisez vgg16 comme affichage :

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

résultat:

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)
  )
)

Visualisez avec le tableau tensoriel :

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

Exemple de code :

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)

image-20220903210639051

Les références:

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

https://handbook.pytorch.wiki/chapter4/4.2.2-tensorboardx.html
Bienvenue pour prêter attention au compte public [Smart Construction Xiaoshuo] (partager la programmation informatique, l'intelligence artificielle, la construction intelligente, l'apprentissage quotidien et l'expérience de recherche scientifique, etc., invitez tout le monde à faire attention et à communiquer.)

Je suppose que tu aimes

Origine blog.csdn.net/QH2107/article/details/126682944
conseillé
Classement