PyTorch入门(七)TensorBoard入门
创始人
2025-05-31 15:39:24
0

  PyTorch模型的可视化工具:

  • Visdom
  • TensorBoard
  • Pytorchviz
  • Netron

TensorBoard简介

  TensorBoard是TensorFlow自带的一个强大的可视化工具,也是一个Web应用程序套件,可以记录训练过程的数字、图像等内容,以方便研究人员观察神经网络训练过程。

  对于PyTorch等其它深度学习框架来说,目前还没有功能像TensorBoard一样全面的类似工具,一些已有的工具功能也有限,或使用起来比较困难。

  TensorBoard提供的机器学习实验所需的可视化功能和工具如下:

  • 跟踪和可视化损失及准确率等指标
  • 可视化模型图
  • 查看权重、偏差或其它张量随时间变化的直方图
  • 将嵌入向量投影到较低维度空间
  • 显示图片、文字和音频数据
  • 剖析TensorFlow程序

  如果要使用TensorBoard,首先需要安装tensorflow, tensorboard, tensorboardX, 代码如下:

pip3 install tensorflow
pip3 install tensorboard
pip3 install tensorboardX

其中,tensorboardX这个工具可使得TensorFlow外的其它深度学习框架也可以使用TensorBoard的便捷功能。

  TensorBoard目前支持7种可视化,包括Scalars, Images, Audio, Graphs, Distributions, Histograms, Embeddings, 主要功能如下:

  • Scalars: 展示训练过程中的准确率、损失值、权重/偏差的变化情况
  • Images: 展示训练过程中记录的图像
  • Audio: 展示训练过程中记录的音频
  • Graphs: 展示模型的数据流图,以及训练在各个设备上消耗的内存和时间
  • Distributions: 展示训练过程中记录的数据的分布图
  • Histograms: 展示训练过程中记录的数据的柱状图
  • Embeddings: 展示词向量的投影分布

  启动TensorBoard:

tonsorboard --logdir=./run/

TensorBoard基础操作

  1. 可视化数值

使用add_scalar方法来记录数字常量,一般使用add_scalar方法来记录训练过程中的loss, arrcuracy, learning rate等数值的变化,直观地监控训练过程。

示例代码:

# import modules
from tensorboardX import SummaryWriter
# add_scalar
writer = SummaryWriter('run/scalar')for i in range(10):writer.add_scalar('指数', 3**i, global_step=i)

在tensorboard中查看scalar

  1. 可视化图片

使用add_images方法来记录图像数据,一般会使用add_images来实时观察模型的生成效果,或者可视化分割、目标检测的结果,帮助调试模型。

示例代码:

# add_images
import cv2writer = SummaryWriter('run/image')for i in range(1, 4):writer.add_images('', cv2.cvtColor(cv2.imread('./image/image{}.png'.format(i)), cv2.COLOR_BGR2RGB), global_step=i, dataformats='HWC')

在tensorboard中查看图片

  1. 可视化统计图

使用add_histogram方法来记录一组数据的直方图。可以通过观察数据、训练参数、特征的直方图了解到它们大致的分布情况,辅助神经网络的训练过程。

示例代码:

# add_histogram
import numpy as npwriter = SummaryWriter('run/histogram')
writer.add_histogram('正态分布中心化', np.random.normal(0, 1, 1000), global_step=1)
writer.add_histogram('正态分布中心化', np.random.normal(0, 2, 1000), global_step=50)
writer.add_histogram('正态分布中心化', np.random.normal(0, 3, 1000), global_step=100)

在TensorBoard可视化界面中,我们会发现DISTRIBUTIONS和HISTOGRAMS两栏,它们都是用来观察数据分布的。在HISTOGRAMS中,同一数据不同步数的直方图可以上下错位排布(OFFSET)也可以重叠排布(OVERLAY)。

在tensorboard中查看柱状图
4. 可视化模型图

使用add_graph方法来可视化一个神经网络。该方法可以将神经网络模型可视化,显示模型中的操作和网络层。

示例代码如下:

import torch
import torch.nn as nn
import torch.nn.functional as Fdummy_input = (torch.zeros(1, 3),)
writer = SummaryWriter('run/graph')# simple MLP model
class LinearInLinear(nn.Module):def __init__(self):super(LinearInLinear, self).__init__()self.l = nn.Linear(3, 5)def forward(self, x):return self.l(x)writer.add_graph(LinearInLinear(), dummy_input)

在tensorboard中查看模型图

  1. 可视化向量

使用add_embedding方法可以在二维或三维空间可视化Embedding向量。add_embedding方法是一个很实用的方法,不仅可以将高维特征使用PCA, T-SNE等方法降维至二维平面或三维空间,还可以观察每一个数据点在降维前的特征空间的K近邻情况。

下面的例子中我们取MNIST训练集中的前30个数据,将图像展开成一维向量作为Embedding,使用TensorBoardX进行可视化。

示例代码如下:

# add_embedding
import torchvisionwriter = SummaryWriter('run/vector')
mnist = torchvision.datasets.MNIST('./', download=False)
writer.add_embedding(mnist.data.reshape((-1, 28*28))[:30, :],metadata=mnist.targets[:30],label_img = mnist.data[:30, :, :].reshape((-1, 1, 28, 28)).float()/255,global_step=0)

可以发现,虽然还没有做任何特征提取工作,但MNIST数据已经呈现出聚类的效果,相同数字之间距离更近一些。
在tensorboard中查看向量嵌入

TensorBoard实战

  1. 例子1:在模型训练过程中记录loss和accuracy. Python示例代码如下:
# -*- coding: utf-8 -*-
import torch
from numpy import vstack
from numpy import argmax
from pandas import read_csv
from sklearn.preprocessing import LabelEncoder, LabelBinarizer
from sklearn.metrics import accuracy_score
from torch.optim import SGD, Adam
from torch.utils.data import Dataset, DataLoader, random_split
from torch.nn import Linear, ReLU, Softmax, Module, CrossEntropyLoss
from torch.nn.init import kaiming_uniform_, xavier_uniform_from tensorboardX import SummaryWriter# dataset definition
class CSVDataset(Dataset):# load the datasetdef __init__(self, path):# load the csv file as a dataframedf = read_csv(path, header=None)# store the inputs and outputsself.X = df.values[:, :-1]self.y = df.values[:, -1]# ensure input data is floatsself.X = self.X.astype('float32')# label encode target and ensure the values are floatsself.y = LabelEncoder().fit_transform(self.y)# number of rows in the datasetdef __len__(self):return len(self.X)# get a row at an indexdef __getitem__(self, idx):return [self.X[idx], self.y[idx]]# get indexes for train and test rowsdef get_splits(self, n_test=0.3):# determine sizestest_size = round(n_test * len(self.X))train_size = len(self.X) - test_size# calculate the splitreturn random_split(self, [train_size, test_size])# model definition
class MLP(Module):# define model elementsdef __init__(self, n_inputs):super(MLP, self).__init__()# input to first hidden layerself.hidden1 = Linear(n_inputs, 5)kaiming_uniform_(self.hidden1.weight, nonlinearity='relu')self.act1 = ReLU()# second hidden layerself.hidden2 = Linear(5, 6)kaiming_uniform_(self.hidden2.weight, nonlinearity='relu')self.act2 = ReLU()# third hidden layer and outputself.hidden3 = Linear(6, 3)xavier_uniform_(self.hidden3.weight)# forward propagate inputdef forward(self, X):# input to first hidden layerX = self.hidden1(X)X = self.act1(X)# second hidden layerX = self.hidden2(X)X = self.act2(X)# output layerX = self.hidden3(X)return Xclass Model(object):def __init__(self, file_path, model):self.writer = SummaryWriter('./run/mlp_demo')# load the datasetdataset = CSVDataset(file_path)# calculate splittrain, test = dataset.get_splits()# prepare data loadersself.train_dl = DataLoader(train, batch_size=4, shuffle=True)self.test_dl = DataLoader(test, batch_size=1024, shuffle=False)# modelself.model = model# train the modeldef train(self):criterion = CrossEntropyLoss()optimizer = Adam(self.model.parameters())# enumerate epochsfor epoch in range(100):init_loss = torch.Tensor([0.0])# enumerate mini batchesfor i, (inputs, targets) in enumerate(self.train_dl):targets = targets.long()# clear the gradientsoptimizer.zero_grad()# compute the model outputyhat = self.model(inputs)# calculate lossloss = criterion(yhat, targets)# credit assignmentloss.backward()print("epoch: {}, batch: {}, loss: {}".format(epoch, i, loss.data))init_loss += loss.data# update model weightsoptimizer.step()self.writer.add_scalar('Loss/Train', init_loss/(i+1), epoch)test_accuracy = self.evaluate_model()self.writer.add_scalar('Accuracy/Test', test_accuracy, epoch)# evaluate the modeldef evaluate_model(self):predictions, actuals = [], []for i, (inputs, targets) in enumerate(self.test_dl):# evaluate the model on the test setyhat = self.model(inputs)# retrieve numpy arrayyhat = yhat.detach().numpy()actual = targets.numpy()# convert to class labelsyhat = argmax(yhat, axis=1)# reshape for stackingactual = actual.reshape((len(actual), 1))yhat = yhat.reshape((len(yhat), 1))# storepredictions.append(yhat)actuals.append(actual)predictions, actuals = vstack(predictions), vstack(actuals)# calculate accuracyacc = accuracy_score(actuals, predictions)return accif __name__ == '__main__':# train the modelModel('iris.csv', MLP(4)).train()

在训练过程中的训练集的损失值以及验证集的准确率如下:

在tensorboard中查看loss和accuracy

  1. 例子2: 利用TensorBoard查看ONNX文件

需安装Python第三方模块onnx, Python代码如下:

# -*- coding: utf-8 -*-
from tensorboardX import SummaryWriterwith SummaryWriter('./run/onnx') as w:w.add_onnx_graph('iris.onnx')

在TensorBoard中选择Graphs, Run选项选择onnx,模型图如下:

在tensorboard中查看onnx模型图
从中可以看出,TensorBoard对于ONNX模型文件支持不是太好,可以尝试使用Netron.

参考文献

  1. tensorboardX Tutorials: https://tensorboardx.readthedocs.io/en/latest/tutorial.html#tutorials
  2. 动手学PyTorch深度学习建模与应用,王国平著
  3. PyTorch 使用 TensorboardX 进行网络可视化:https://www.pytorchtutorial.com/pytorch-tensorboardx/

相关内容

热门资讯

员工工作不力失误操作的检讨书 ...  尊敬的领导:  鉴于近期工作不力,我作出如下深刻检讨。  每周工作报送是我的本职工作之一,就是将每...
公司员工失职检讨书 公司员工失... 尊敬的领导:  我怀着十二万分的愧疚以及十二万分的懊悔向你们写下这份检讨书,我为自己睡岗行为感到了深...
医院职工上班迟到检讨书800字...   尊敬的领导:  近段时间,由于一些个人原因,以至于出现了几次上班迟到的现象,不管是上班太晚,熬夜...
大学生旷课检讨书范文3000字...  尊敬的老师:  今天我怀着愧疚和懊悔写下这份检讨书,以表示我对旷课这种不良行为的深刻认识以及再也不...
忘记穿校服的检讨书 忘记穿校服...  尊敬的老师:  今天,我怀着十二万分的愧疚以及十二万分的懊悔给您写下这份检讨书。 早在我刚踏进这个...
学生会工作失误的检讨书 检查卫... 尊敬的书记:  您好!  针对近期学生会工作开展及任务完成情况,出现的一系列的问题,我作为新上任的系...
预备党员缺席会议检讨书范文 机...   敬爱的党组织:  今天我怀着愧疚和懊悔向党组织公布这封检讨书,以表示我作为一名预备党员对缺席党组...
缺席预备党员转正会议的检讨书5...  敬爱的党组织:  对于本周×举行的预备党员转正会议,我没能参加,为此我感到非常抱歉,违反了组织的规...
学生逃课检讨书范本3000字 ...  尊敬的老师:  学生主要任务是学习,就像老师忙着点名一样,本职工作不做好,还有什么理由?旷课是错的...
工作不认真玩手机检讨书300字...   尊敬的各位领导:  首先由于我的工作不认真的原因,没有把工作做好出现了不应该的工作失误在此我做出...
最新或2023(历届)机关单位...   3月xxx同志被提拔为区公路局综合办公室副主任,主要从事文字材料工作。从一个局二级单位办公室主任...
最新或2023(历届)优秀党员...   范文一:  作为一名一直奋战在基层农村的普通党员,始终保持坚强的党性,无条件地服从组织安排,从不...
最新或2023(历届)党委书记...   让党性在世界之巅绽放光彩  ——记西藏自治区浪卡子县普玛江塘乡党委书记、人大主席次仁罗布  在西...
先进个人事迹材料怎么写,先进个... 先进个 人事迹写作技巧  相对于其他公文的写作来说,不管是先进个 人事迹材料,还是先进集体事迹材料的...
医院优秀党员先进事迹材料 医院... 本人自参加工作以来,处处以共产党员的标准严格要求自己,立足本职,爱岗敬业,恪尽职守,努力学习,勤奋工...
公司优秀员工共产党员先进事迹材... 海南岛,1995年毕业于长江学院电子工程系应用电子专业。在分配至XXXX公司电气分场电子一班将近十年...
最新或2023(历届)教师优秀...  我,出生于xx年,本科学历,现小学一级数学教师,任职于xx县xx中心学校小学部。  xx年9月,我...
医院医生护士的先进个人事迹材料...  她留给我们的是无尽的感动,而这感动还在延续。  时光中会不会有永恒的感动?很多人都在寻找这个问题的...
先进个人事迹材料,先进个人事迹...  “‘又是一年芳草绿,依然十里杏花红’,在这个春意渐浓的时刻,回顾之前的点点滴滴,那一幕幕昔日的画面...
最新或2023(历届)幼儿园教...  她1997年来到教育实验幼儿园,一直到今天,十几年如一日,默默的奉献着她的青春,送走了一批又一批的...