使用Tensorboard在 PyTorch 中进行可视化

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
torch.__version__

Tensorboard 简介

Tensorboard是tensorflow内置的一个可视化工具,它通过将tensorflow程序输出的日志文件的信息可视化使得tensorflow程序的理解、调试和优化更加简单高效。 Tensorboard的可视化依赖于tensorflow程序运行输出的日志文件,因而tensorboard和tensorflow程序在不同的进程中运行。 TensorBoard给我们提供了极其方便而强大的可视化环境。它可以帮助我们理解整个神经网络的学习过程、数据的分布、性能瓶颈等等。

tensorboard虽然是tensorflow内置的可视化工具,但是他们跑在不同的进程中,所以Github上已经有大神将tensorboard应用到Pytorch中 链接在这里

Tensorboard 安装

首先需要安装tensorboard

pip install tensorboard

~~ 然后再安装tensorboardx ~~

~~ pip install tensorboardx ~~ pytorch 1.1以后的版本内置了SummaryWriter 函数,所以不需要再安装tensorboardx了

安装完成后与 visdom一样执行独立的命令 tensorboard --logdir logs 即可启动,默认的端口是 6006,在浏览器中打开 http://localhost:6006/ 即可看到web页面。

这里要说明的是 微软的Edge浏览器css会无法加载,使用chrome正常显示

页面

与visdom不同,tensorboard针对不同的类型人为的区分多个标签,每一个标签页面代表不同的类型。 下面我们根据不同的页面功能做个简单的介绍,更多详细内容请参考官网

SCALAR

对标量数据进行汇总和记录,通常用来可视化训练过程中随着迭代次数准确率(val acc)、损失值(train/test loss)、学习率(learning rate)、每一层的权重和偏置的统计量(mean、std、max/min)等的变化曲线

IMAGES

可视化当前轮训练使用的训练/测试图片或者 feature maps

GRAPHS

可视化计算图的结构及计算图上的信息,通常用来展示网络的结构

HISTOGRAMS

可视化张量的取值分布,记录变量的直方图(统计张量随着迭代轮数的变化情况)

PROJECTOR

全称Embedding Projector 高维向量进行可视化

使用

在使用前请先去确认执行tensorboard --logdir logs 并保证 http://localhost:6006/ 页面能够正常打开

图像展示

首先介绍比较简单的功能,查看我们训练集和数据集中的图像,这里我们使用现成的图像作为展示。这里使用wikipedia上的一张猫的图片这里

引入 tensorboardX 包

# 这里的引用也要修改成torch的引用
#from tensorboardX import SummaryWriter
from torch.utils.tensorboard import SummaryWriter
cat_img = Image.open('./1280px-Felis_silvestris_catus_lying_on_rice_straw.jpg')
cat_img.size

(1280, 853)

这是一张1280x853的图,我们先把她变成224x224的图片,因为后面要使用的是vgg16

transform_224 = transforms.Compose([
        transforms.Resize(224), # 这里要说明下 Scale 已经过期了,使用Resize
        transforms.CenterCrop(224),
        transforms.ToTensor(),
    ])
cat_img_224=transform_224(cat_img)

将图片展示在tebsorboard中:

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

浏览器访问 http://localhost:6006/#images 即可看到猫的图片

更新损失函数

更新损失函数和训练批次我们与visdom一样使用模拟展示,这里用到的是tensorboard的SCALAR页面

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

浏览器访问 http://localhost:6006/#scalars 即可看到图形

使用PROJECTOR对高维向量可视化

PROJECTOR的的原理是通过PCA,T-SNE等方法将高维向量投影到三维坐标系(降维度)。Embedding Projector从模型运行过程中保存的checkpoint文件中读取数据,默认使用主成分分析法(PCA)将高维数据投影到3D空间中,也可以通过设置设置选择T-SNE投影方法,这里做一个简单的展示。

我们还是用第三章的mnist代码

BATCH_SIZE=512 
EPOCHS=20 
train_loader = torch.utils.data.DataLoader(
        datasets.MNIST('data', train=True, download=True, 
                       transform=transforms.Compose([
                           transforms.ToTensor(),
                           transforms.Normalize((0.1307,), (0.3081,))
                       ])),
        batch_size=BATCH_SIZE, shuffle=True)
class ConvNet(nn.Module):
    def __init__(self):
        super().__init__()
        # 1,28x28
        self.conv1=nn.Conv2d(1,10,5) # 10, 24x24
        self.conv2=nn.Conv2d(10,20,3) # 128, 10x10
        self.fc1 = nn.Linear(20*10*10,500)
        self.fc2 = nn.Linear(500,10)
    def forward(self,x):
        in_size = x.size(0)
        out = self.conv1(x) #24
        out = F.relu(out)
        out = F.max_pool2d(out, 2, 2)  #12
        out = self.conv2(out) #10
        out = F.relu(out)
        out = out.view(in_size,-1)
        out = self.fc1(out)
        out = F.relu(out)
        out = self.fc2(out)
        out = F.log_softmax(out,dim=1)
        return out
model = ConvNet()
optimizer = torch.optim.Adam(model.parameters())
def train(model, train_loader, optimizer, epoch):
    n_iter=0
    model.train()
    for batch_idx, (data, target) in enumerate(train_loader):
        optimizer.zero_grad()
        output = model(data)
        loss = F.nll_loss(output, target)
        loss.backward()
        optimizer.step()
        if(batch_idx+1)%30 == 0: 
            n_iter=n_iter+1
            print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
                epoch, batch_idx * len(data), len(train_loader.dataset),
                100. * batch_idx / len(train_loader), loss.item()))
            #相对于以前的训练方法 主要增加了以下内容
            out = torch.cat((output.data, torch.ones(len(output), 1)), 1) # 因为是投影到3D的空间,所以我们只需要3个维度
            with SummaryWriter(log_dir='./logs', comment='mnist') as writer: 
                #使用add_embedding方法进行可视化展示
                writer.add_embedding(
                    out,
                    metadata=target.data,
                    label_img=data.data,
                    global_step=n_iter)

这里节省时间,只训练一次

train(model, train_loader, optimizer, 0)
Train Epoch: 0 [14848/60000 (25%)]	Loss: 0.352312
Train Epoch: 0 [30208/60000 (50%)]	Loss: 0.202950
Train Epoch: 0 [45568/60000 (75%)]	Loss: 0.156494

打开 http://localhost:6006/#projector 即可看到效果。

目前测试投影这部分也是有问题的,根据官网文档的代码进行测试,也显示不出来,正在找原因

绘制网络结构

在pytorch中我们可以使用print直接打印出网络的结构,但是这种方法可视化效果不好,这里使用tensorboard的GRAPHS来实现网络结构的可视化。 由于pytorch使用的是动态图计算,所以我们这里要手动进行一次前向的传播.

使用Pytorch已经构建好的模型进行展示

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

在前向传播前,先要把图片做一些调整

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

使用上一张猫的图片进行前向传播

vgg16_input=transform_2(cat_img)[np.newaxis]# 因为pytorch的是分批次进行的,所以我们这里建立一个批次为1的数据集
vgg16_input.shape
torch.Size([1, 3, 224, 224])

开始前向传播,打印输出值

out = vgg16(vgg16_input)
_, preds = torch.max(out.data, 1)
label=preds.numpy()[0]
label
287

将结构图在tensorboard进行展示

with SummaryWriter(log_dir='./logs', comment='vgg161') as writer:
    writer.add_graph(vgg16, vgg16_input)

对于Pytorch的版本来说,实测 SummaryWriter在处理结构图的时候是有问题的(或者是需要加什么参数,目前我还没找到),所以建议大家继续使用tensorboardx。

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: PyTorch使用TensorBoard可以通过安装TensorBoardX库来实现。TensorBoardX是一个PyTorch的扩展库,它提供了一种将PyTorch的数据可视化的方法,可以将训练过程的损失函数、准确率等指标以图表的形式展示出来,方便用户对模型的训练过程进行监控和调试。具体使用方法可以参考TensorBoardX的官方文档。 ### 回答2: PyTorch是一款流行的深度学习框架,用于实现神经网络模型和训练过程。TensorBoard是与TensorFlow框架一起使用的一个可视化工具,方便进行模型训练和性能调优。但是,PyTorch用户也可以充分利用TensorBoard来监控他们的模型。 在PyTorch使用TensorBoard主要包括以下几个步骤: 1. 安装TensorBoard和TensorFlow:需要在PyTorch的虚拟环境安装TensorFlow和TensorBoard,这可以使用pip来完成。 2. 导入所需的库:首先,需要导入PyTorch库和TensorFlow库。在这里,PyTorch库用于定义、训练和测试模型,而TensorFlow库用于可视化和监视模型训练过程。可以使用以下代码导入这些库: ``` import tensorflow as tf from torch.utils.tensorboard import SummaryWriter ``` 3. 创建SummaryWriter对象:SummaryWriter是TensorBoard类的主要接口。可以使用它来创建TensorBoard的摘要文件和事件文件。在下面的代码,可以创建一个名为“runs/xxx”的摘要写入器: ``` writer = SummaryWriter('runs/xxx') ``` 4. 定义模型:在PyTorch定义模型。在下面的代码,定义了一个包含两个全连接层的简单线性模型: ``` import torch.nn as nn class LinearModel(nn.Module): def __init__(self): super(LinearModel, self).__init__() self.fc1 = nn.Linear(784, 100) self.fc2 = nn.Linear(100, 10) def forward(self, x): x = x.view(-1, 784) x = nn.functional.relu(self.fc1(x)) x = self.fc2(x) return x ``` 5. 记录数据:使用writer对象记录数据。可以使用以下代码来记录训练数据: ``` for epoch in range(num_epochs): for i, (images, labels) in enumerate(train_loader): # 定义前向传递 outputs = model(images) # 计算损失 loss = criterion(outputs, labels) # 后向传递和优化器的更新 optimizer.zero_grad() loss.backward() optimizer.step() # 记录损失和准确率 writer.add_scalar('Training/Loss', loss.item(), epoch * len(train_loader) + i) total = labels.size(0) _, predicted = torch.max(outputs.data, 1) correct = (predicted == labels).sum().item() writer.add_scalar('Training/Accuracy', 100 * correct / total, epoch * len(train_loader) + i) ``` 6. 可视化和监控:在运行完上述代码后,可以返回到TensorBoard可视化和监视训练过程。输入以下命令,启动TensorBoard服务: ``` tensorboard --logdir=runs ``` 然后,在Web浏览器,输入http://localhost:6006访问TensorBoard服务器。此时,可以看到图形界面显示了许多模型指标,例如损失和准确率。点击“Scalars”选项卡,就可以查看训练过程的损失和准确率曲线。 总之,在PyTorch使用TensorBoard可以方便地监视模型的训练和性能,并且TensorBoard可以提供可视化和交互式工具来帮助调试模型。 ### 回答3: PyTorch是近年来开发迅速的深度学习框架之一,基于Python语言,操作简便易学,广受欢迎。其应用范围广泛,包括图像识别、文本分类、语言模型等多种场景。 TensorBoard是TensorFlow框架提供的可视化工具,能够展现模型训练过程的各类参数、数据和图形化结果。然而,使用PyTorch的开发者也可以使用TensorBoardPyTorch支持使用TensorBoard进行训练过程可视化。 下面是关于使用TensorBoard来监测PyTorch训练过程的几种方法: 一、使用TensorboardX TensorBoardX是一种基于PyTorch创建的TensorBoard工具,它使用了TensorFlow的tensorboard接口。使用该工具需要对PyTorch进行一些包的安装。 首先安装TensorboardX包: ```python !pip install tensorboardX ``` 然后,创建一个SummaryWriter,监测损失函数、准确率、图像等数据: ```python from tensorboardX import SummaryWriter writer = SummaryWriter("tb_dir") for i in range(100): writer.add_scalar('loss/train', i**2, i) writer.add_scalar('loss/test', 0.7*i**2, i) writer.add_scalar('accuracy/test', 0.9*i, i) writer.add_scalar('accuracy/train', 0.6*i, i) ``` 最后启动TensorBoard,运行 pytorch使用tensorboard的命令行。 ``` tensorboard --logdir tb_dir --host localhost --port 8088 ``` 二、使用PyTorch内置的TensorBoard可视化 pytorch 1.2版本以上,又增加了 PyTorch自带的TensorBoard可视化PyTorch 内置的与TensorBoard的API兼容,创建SummaryWriter的方法更加简便,而不需要安装多个包。在训练过程,与使用TensorBoardX类似,将需要监测的数据文件写入到SummaryWriter: ```python from torch.utils.tensorboard import SummaryWriter writer = SummaryWriter() for i in range(100): writer.add_scalar('loss/train', i**2, i) writer.add_scalar('loss/test', 0.7*i**2, i) writer.add_scalar('accuracy/test', 0.9*i, i) writer.add_scalar('accuracy/train', 0.6*i, i) ``` 运行 tensorboard --logdir , 输入PyTorch写入的文件即可。 三、使用Fastai集成的TensorBoardCallback 除了TensorboardX和PyTorch内置的TensorBoard可视化外,有另外一个可选方案,即使用FastaiTensorBoardCallback。Fastai是基于PyTorch的高级深度学习框架,其包含了处理端到端的许多好用工具,包括用于监控训练进程的TensorBoardCallback。下面是使用方法: ```python from fastai.basics import * path = untar_data(URLs.MNIST_SAMPLE) data = ImageDataBunch.from_folder(path) learn = cnn_learner(data, models.resnet18, metrics=accuracy, callback_fns=ShowGraph) learn.fit(5) ``` 设置callback_fns的ShowGraph即可可视化监测模型的训练过程。 总结 PyTorch是一个强大的深度学习框架,它提供了多种工具监测模型的训练过程。TensorBoard是目前广泛使用可视化工具之一,使用TensorboardX、PyTorch内置的可视化、Fastai的TensorBoardCallback等方法均可实现PyTorch训练过程的监测和可视化,方便开发者了解模型的训练进程,发现问题并进行调整优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sonhhxg_柒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值