可视化visdom在PyTorch中的使用

相信大家在使用TensorFlow的时候都使用过它的可视化工具TensorBoard,这里给大家同样介绍一款PyTorch的可视化工具visdom,可以将我们训练过程中的数据可视化显示出来,更便于大家对于神经网络流程的理解与数据的分析。这里我们还是使用上一篇博客中讲到的手写数字识别MINIST数据集的例子。
首先我们需要安装可视化工具visdom,打开终端:

pip install visdom

还有一种就是通过源码安装,可以在GitHub中找到visdom源码,执行里面的安装文件就可以安装了。安装完成之后,我们就可以启动一个visdom的session:

python -m visdom.server

然后我们就可以看到如下的信息:
可视化visdom在PyTorch中的使用_第1张图片
我们将红色框框中的网址复制到浏览器中,就可以打开一个visdom可视化窗口:
visdom可视化窗口接下来我们就可以在代码中指定要可视化哪些数据:

viz = Visdom()
viz.line([0.], [0.], win='train_loss', opts=dict(title='train loss'))
viz.line([[0.0, 0.0]], [0.], win='test', opts=dict(title='test loss&acc.',legend=['loss', 'acc.']))

首先我们要初始化一个visdom,创建一个visdom实例,然后通过line方法来指定画一个线图,首先我们是创建一个线,然后把数据填进来,这个方法中[0.], [0.]分别表示Y和X的值,win='train_loss’是这个图在这个页面的唯一标识,可以理解成这个图的ID,其实这个line方法中海油一个env参数,表示可以指定这个图窗口所在的页面环境,如果没有指定,那么默认就是‘main’环境,也就是visdom的主页面,然后opts表示附加项,其中title表示图的标题,legend表示图中线的图例。好了,初始化好了两个线图之后,我们可以开始往里填X和Y的数据,先看代码:

for epoch in range(epochs):

    for batch_idx, (data, target) in enumerate(train_loader):
        data = data.view(-1, 28*28)
        #data, target = data.to(device), target.cuda()

        logits = net(data)
        loss = criteon(logits, target)

        optimizer.zero_grad()
        loss.backward()
        # print(w1.grad.norm(), w2.grad.norm())
        optimizer.step()

        global_step += 1
        viz.line([loss.item()], [global_step], win='train_loss', update='append')

        if batch_idx % 100 == 0:
            print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
                epoch, batch_idx * len(data), len(train_loader.dataset),
                       100. * batch_idx / len(train_loader), loss.item()))


    test_loss = 0
    correct = 0
    for data, target in test_loader:
        data = data.view(-1, 28 * 28)
        #data, target = data.to(device), target.cuda()
        logits = net(data)
        test_loss += criteon(logits, target).item()

        pred = logits.argmax(dim=1)
        correct += pred.eq(target).float().sum().item()

    viz.line([[test_loss,100 * correct / len(test_loader.dataset)]],
             [global_step], win='test', update='append')
    viz.images(data.view(-1, 1, 28, 28), win='x')
    viz.text(str(pred.detach().cpu().numpy()), win='pred',
             opts=dict(title='pred'))

    test_loss /= len(test_loader.dataset)
    print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
        test_loss, correct, len(test_loader.dataset),
        100. * correct / len(test_loader.dataset)))

在这段代码中,viz.line([loss.item()], [global_step], win='train_loss', update='append')这句话就是global_step表示X的输入,loss.item()表示Y的输入,在train_loss窗口中显示,update='append’表示每一步同步更新数据。同样的道理viz.line([[test_loss,100 * correct / len(test_loader.dataset)]], [global_step], win='test', update='append')只不过这个有两个Y输入。在训练的过程中,训练数据就会同步传输到visdom服务器,然后渲染到网页上。最终整个网页会渲染出数据的图像:
可视化visdom在PyTorch中的使用_第2张图片
当然visdom的接口有很多,可以根据自行的需求自定义图像,第三个图像就是minist数据集,第四个就是根据图三输出的结果,大体上看来,图像识别的结果还不错。这就是visdom可视化的操作流程,有了visdom,大家可以在开发的过程中更加清晰地看到数据的分布走向和整个训练的过程,希望对大家有所帮助。文中如有纰漏之处,还望大家不吝指教,如有转载,也请标明出处,谢谢大家。

你可能感兴趣的:(Deep,Learning)