PyTorch教程-8:举例详解TensorBoard的使用

笔者PyTorch的全部简单教程请访问:https://www.jianshu.com/nb/48831659

PyTorch教程-8:举例详解TensorBoard的使用

TensroBoard 是一个帮助我们对模型训练、数据处理等很有帮助的可视化工具,虽然这些可视化操作都可以通过代码配合matplotlib这些很好用的绘图库来实现,但是TensorBoard使得它变得更加简单。

官方的一个简单教程:https://pytorch.org/tutorials/intermediate/tensorboard_tutorial.html

首先依旧使用最开始的一个简单例子:CIFAR10的分类任务,先引入数据、构建模型、创建优化器、损失函数等任务:

import torch
import torchvision
import torchvision.transforms as transforms
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim

transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=2)

testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4, shuffle=False, num_workers=2)

classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')


class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 16 * 5 * 5)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x


net = Net()

loss_function = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

接入TensorBoard

tensorboard包需要在 torch.utils 中引入,首先我们先通过一个 SummaryWriter 实例来准备一个接入TensorBoard的接口:

from torch.utils.tensorboard import SummaryWriter

summaryWriter = SummaryWriter("./runs/")

这里我们设置了 run 文件夹用来存储记录信息的位置。

如果在引入tensorboard时报错:No module named 'torch.utils.tensorboard',那么需要你手动安装tensorboard,比如pip的方式下可以使用:

pip install tensorboard

启动TensorBoard

启动Tensorboard需要在命令行中使用,其中的 logdir 参数就是我们存放log的文件夹位置:

tensorboard --logdir=runs

TensorFlow installation not found - running with reduced feature set.
Serving TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_all
TensorBoard 2.4.0 at http://localhost:6006/ (Press CTRL+C to quit)

等待TensorBoard启动后,在浏览器中访问 https://localhost:6006 或者 http://127.0.0.1:6006/ 就能打开TensorBoard了,6006是它的默认端口。此时打开后会发现它提示没有任何数据,是因为我们还没有向 runs 文件夹下写入记录信息的log文件。

向TensorBoard中写入信息

向TensorBoard中写入信息很简单,使用 SummaryWriter 的方法就可以完成,比如我们将第一个batch的图片展示到TensorBoard中的例子:

trainloader_iterator = iter(trainloader)

images, labels = trainloader_iterator.next()

# create grid of images
img_grid = torchvision.utils.make_grid(images)

# write to tensorboard
summaryWriter.add_image("A Batch of Image Samples",img_grid)

运行后打开/刷新TensorBoard页面就可以看到新的效果,图片被显示了出来(这里Tensor格式的图片的RGB通道是不对的,要显示正常的图片,需要进行转换,这里为了展示TensorBoard的效果所以忽略了这一点)

1.png

可以看到,使用了 add_image 将一个图片写入到TensorBoard中,SummaryWriter还提供了很多方法,这里列一下,详细的参数说明和例子请参考:
https://pytorch.org/docs/stable/tensorboard.html#torch-utils-tensorboard

  • add_scalar(tag, scalar_value, global_step=None, walltime=None):添加标量数据
  • add_scalars(main_tag, tag_scalar_dict, global_step=None, walltime=None):添加多个标量数据
  • add_histogram(tag, values, global_step=None, bins='tensorflow', walltime=None, max_bins=None):添加一个柱状图
  • add_image(tag, img_tensor, global_step=None, walltime=None, dataformats='CHW'):添加一张图片
  • add_images(tag, img_tensor, global_step=None, walltime=None, dataformats='NCHW'):添加多个图片
  • add_figure(tag, figure, global_step=None, close=True, walltime=None):渲染一个matplotlib的图片然后添加到TensorBoard
  • add_video(tag, vid_tensor, global_step=None, fps=4, walltime=None):添加视频
  • add_audio(tag, snd_tensor, global_step=None, sample_rate=44100, walltime=None):添加音频
  • add_text(tag, text_string, global_step=None, walltime=None):添加文本
  • add_graph(model, input_to_model=None, verbose=False):添加图像
  • add_embedding(mat, metadata=None, label_img=None, global_step=None, tag='default', metadata_header=None):添加嵌入式投影,一个很好的例子就是我们可以将高维数据映射到三维空间中进行直观地展示和可视化
  • add_pr_curve(tag, labels, predictions, global_step=None, num_thresholds=127, weights=None, walltime=None):添加PR曲线
  • add_custom_scalars(layout):添加用户定义的标量
  • add_mesh(tag, vertices, colors=None, faces=None, config_dict=None, global_step=None, walltime=None):添加3D模型
  • add_hparams(hparam_dict, metric_dict, hparam_domain_discrete=None, run_name=None):添加一些可以调节的超参数

在TensorBoard中展示网络模型

TensorBoard不仅可以可视化数据,还可以可视乎模型,使用 add_graph 方法就可以将一个模型写入,他接受的第一个参数用于传入一个模型,第二个参数是要喂给这个模型的数据,这里就是一个batch的图片:

images, labels = trainloader_iterator.next()
summaryWriter.add_graph(net,images)
2.png

使用TensorBoard记录训练过程

我们在之前的例子中展示过,对于训练过程,我们把训练的loss打印到了控制台上,当然如果为了能够更加直观的展示loss的变化过程,我们可以使用一个list保存这些loss,等待训练完成后使用matplotlib等工具对其进行可视化。TensorBoard提供了更简单的方式,我们可以直接将loss写到TensorBoard中,这样更加的简单,只要对之前训练的代码做小小的修改即可:

epochs = 2

# running_loss to record the losses
running_loss = 0.0

for epoch in range(epochs):
    for i,data in enumerate(trainloader,0):
        # get input images and their labels
        inputs, labels = data
        # set optimizer buffer to 0
        optimizer.zero_grad()
        # forwarding
        outputs = net(inputs)
        # computing loss
        loss = loss_function(outputs, labels)
        # loss backward
        loss.backward()
        # update parameters using optimizer
        optimizer.step()

        # printing some information
        running_loss += loss.item()
        # for every 1000 mini-batches, print the loss
        if i % 1000 == 0:
            print("epoch {} - iteration {}: average loss {:.3f}".format(epoch+1, i, running_loss/1000))

            summaryWriter.add_scalar("training_loss",running_loss/1000, epoch * len(trainloader) + i)

            running_loss = 0.0


print("Training Finished!")

然后在TensorBoard中就可以看到我们的loss的变化结果,还可以对其进行一些其他设置,比如横坐标的格式、曲线的光滑程度等。

3.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容