pytorch——使用tensorobard不刷新的问题

在tensorflow中可以使用tensorboard来查看训练过程中loss的变化,来判断模型是否已经收敛 ,或者需要查看train dataset与dev dataset上效果来判断是否有过拟合的现象。

pytorch中已经集成了tensorboard的API,不用再使用tensorboardX来调用api了。但是启动tensorboard的web页面时,需要安装tensorboard。并且不需要再安装tensorflow了,就可以完成监控指标的刷新。

用一个CNN的的例子:


# -*- encoding: utf-8 -*-
import warnings

# pytorch=1.4.0
# tensorboard=1.14.0
warnings.filterwarnings('ignore')
import matplotlib.pyplot as plt
import numpy as np
import torch
import torchvision
import torch.nn as nn
import torch.nn.functional as F
from torch.optim import Adam
from torch.utils.tensorboard import SummaryWriter
from torchvision.transforms import transforms

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

trainset = torchvision.datasets.FashionMNIST('./data', download=True, train=True, transform=transform)

testset = torchvision.datasets.FashionMNIST('./data', download=True, train=False, transform=transform)

trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=2)
testloader = torch.utils.data.DataLoader(testset, batch_size=4, shuffle=False, num_workers=2)

dataiter = iter(trainloader)
images, labels = dataiter.next()

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


def matplotlib_imshow(img, one_channel=False):
    if one_channel:
        img = img.mean(dim=0)
    img = img / 2 + 0.5  # unnormalize
    npimg = img.numpy()
    if one_channel:
        plt.imshow(npimg, cmap="Greys")
    else:
        plt.imshow(np.transpose(npimg, (1, 2, 0)))


# show images
matplotlib_imshow(img_grid, one_channel=True)

writer = SummaryWriter('runs/experiment', flush_secs=1)

# write to tensorboard
writer.add_image('four_fashion_mnist_images', img_grid)


class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 6, 5)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.fc1 = nn.Linear(16 * 4 * 4, 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 * 4 * 4)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x


net = Net()
lossfn = nn.CrossEntropyLoss()
optimizer = Adam(net.parameters(), lr=1e-3)
print(net)

# write to tensorboard
num_epochs = 1

loss_value = 0.0
for epoch in range(num_epochs):
    for i, data in enumerate(trainloader, 0):
        images, labels = data
        optimizer.zero_grad()
        # forward and backward
        outputs = net(images)
        # output shape [batch_size, num_classes], labels shape [batch_size]
        loss = lossfn(outputs, labels)
        loss.backward()
        optimizer.step()

        loss_value += loss.item()
        if i % 1000 == 999:
            writer.add_scalar('training_loss', loss_value / 1000, epoch * len(trainloader) + i)
            print(f'epoch:{epoch}, global step:{epoch * len(trainloader) + i},loss:{loss_value / 1000}')
            loss_value = 0.0

print('Finished Training')

主要是完成了对一个batch的图片的打印,及在训练过程中打印loss。从代码中可以看出是训练了1个epoch,global step是乘上epoch了,每1000个batch计算一个平均loss,并打印。

注意的一个地方:在初始化SummaryWriter的时候,有一个参数可以控制flush的时间,是以sec来计的,默认是120s也就是2min钟。如果训练时候比较短,并且没有修改这个flush时间话就不会在tensorboard上随着训练的步数updating。如果最后也不close()的话,就不会打出来了。这个点还困扰了我半天的时间。

当然这里的网络也是比较简单的,两个卷积层,两个池化层,还有三个全连接层。最后是一个多分类的问题。输出是[batch_size, num_classes]的值。

loss function用的是交叉熵,nn.CrossEntropyLoss,它的输入是两个值,一个predict值一个真实值。predict的值的shape是[batch_size, num_classes],真实值的shape是[batch_size],也就是[0,num_classes)中取值。

比如:一个三分类,batch_size为2, 则predict是

[[0.1, 0.1, 0.8],
 [0.2, 0.6, 0.2]]

则真实值是

[2,1]

注意交叉熵的输入值。

再一个注意的地方是:
optimizer用的Adam,第一个参数是params,也就是模型需要训练的参数:可以直接通过 net.parameters()来获取。

参考:

https://pytorch.org/docs/stable/tensorboard.html
https://pytorch.org/tutorials/intermediate/tensorboard_tutorial.html

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值