Visdom 使用教程


visdom安裝與啟動服務

安裝visdom

pip install visdom

打開服務

python -m visdom.server

一直出現下面問題(解決辦法:(42條消息) Visdom庫(pytorch中的可視化工具)安裝問題的解決方案及使用方法詳解_Wendy的博客-CSDN博客

 默認大家已經解決這個問題

 瀏覽器中打開對應的網址。

visdom常用功能

首先創建一個新的環境,如不創建則默認在main環境下

import numpy as np
import visdom
import time

viz = visdom.Visdom(env="Test1") # 創建環境名為Test1

image窗口:圖像顯示與更新窗口顯示

下面代碼在一個image窗口中不斷更新顯示圖像

#單張圖像顯示與更新demo
image = viz.image(np.random.rand(3,256,256),opts={'title':'image1','caption':'How random.'})
for i in range(10):
    viz.image(np.random.randn( 3, 256, 256),win = image)
    time.sleep(0.5)

相關代碼如下:

 刷新Visdom 出現如下界面:

images窗口:多個圖像顯示與更新窗口顯示

#多圖像顯示與更新demo
images = viz.images(
        np.random.randn(20, 3, 64, 64),
        opts=dict(title='Random images', caption='How random.',nrow=5)
    )
for i in range(10):
    viz.images(np.random.randn(20, 3, 64, 64),win = images)
    time.sleep(0.5) 

Visdom支持圖像的批量顯示

from visdom import Visdom
import numpy as np
import torch
from torchvision import datasets, transforms

# 注意數據集路徑
train_loader = torch.utils.data.DataLoader(datasets.MNIST(
    r'D:\data',
    train=True,
    download=true,
    transform=transforms.Compose(
        [transforms.ToTensor()])),batch_size=128,shuffle=True)
sample=next(iter(train_loader)) # 通過迭代器獲取樣本
# sample[0]為樣本數據 sample[1]為類別  nrow=16表示每行顯示16張圖像
viz = Visdom(env='my_visual') # 注意此時我已經換了新環境
viz.images(sample[0],nrow=16,win='mnist',opts=dict(title='mnist'))

# 'mnist'

text窗口:顯示文本與更新文本

#text 顯示與更新顯示demo,將在窗口中連續打印字符
text = viz.text('Hello World !')
strForOut = "This is a string for you to print!"
out = ""
for i in range(len(strForOut)):
    out = out + strForOut[i]
    viz.text(out,win = text)
    time.sleep(0.2)

line窗口:繪制折線圖與更新折線圖

#繪畫折線圖演示
x=0
name=['acc','loss','loss2']
for i in range(50):
    y = np.random.randint(5, size=(1, 3))
    viz.line(Y=y,X=np.ones(y.shape)*x,
                    win='line',
                    opts=dict(legend=name,
                        title='line test',
                        width=800,
                        height=800,
                        xlabel='Time',
                        ylabel='Volume'),
                    update=None if x == 0 else 'append'
                    )
    time.sleep(0.1)
    x+=1

scatter窗口:繪制散點圖與更新散點圖

# 繪制散點圖演示 二維
colors = np.random.randint(0, 255, (3, 3,))#第一維3表示該數據可以分為三類,以三種顏色的三點來比表示
win = viz.scatter(
    X=np.random.rand(255, 2),#表示要展示的散點數據
    #Y=(np.random.rand(255) + 1.5).astype(int),
    Y=np.random.randint(1,4,(255)),#每一個數據的類別,將以其對應的colors中的顏色來顯示
    opts=dict(
        markersize=5,
        markercolor=colors,
        legend=['1', '2','3'],
        markersymbol = 'cross-thin-open'
    ),
)
# 繪制散點圖演示 三維
colors = np.random.randint(0, 255, (3, 3,))#第一維3表示該數據可以分為三類,以三種顏色的三點來比表示
win = viz.scatter(
    X=np.random.rand(255, 3),#表示要展示的散點數據
    #Y=(np.random.rand(255) + 1.5).astype(int),
    Y=np.random.randint(1,4,(255)),#每一個數據的類別,將以其對應的colors中的顏色來顯示
    opts=dict(
        markersize=5,
        markercolor=colors,
        legend=['1', '2','3'],
        markersymbol = 'cross-thin-open'
    ),
)

#實時更新繪制散點圖
legend=['1', '2','3']
Scatter = viz.scatter(
    X=np.array([[0,0]]),
    Y=np.array([1]),
    opts=dict(
        markersize=5,
        legend=legend,
        # markersymbol = 'cross-thin-open'
        ),
    )


for i in range(20):
    X = np.random.rand(1,2)
    Y = np.random.randint(1,4,1)
    print(Y)

    viz.scatter(
        X=X,
        Y=Y,
        win=Scatter,
        update= 'append',
        name = legend[Y[0]-1],
        opts=dict(
            markersize=5,
            # markersymbol = 'cross-thin-open'
            )
    )
    time.sleep(0.5)

 通過具體的訓練過程通過visdom可視化,通過具體的訓練過程通過visdom可視化

'''
導入庫文件
'''
import  torch
import  torch.nn as nn
import  torch.nn.functional as F
import  torch.optim as optim
from    torchvision import datasets, transforms
from visdom import Visdom
import numpy as np


'''
構建簡單的模型:簡單線性層+Relu函數的多層感知機
'''
class MLP(nn.Module):

    def __init__(self):
        super(MLP, self).__init__()

        self.model = nn.Sequential(
            nn.Linear(784, 200),
            nn.ReLU(inplace=True),
            nn.Linear(200, 200),
            nn.ReLU(inplace=True),
            nn.Linear(200, 10),
            nn.ReLU(inplace=True),
        )

    def forward(self, x):
        x = self.model(x)

        return x


batch_size = 128
learning_rate = 0.01
epochs = 10

# 注意數據集路徑
train_loader = torch.utils.data.DataLoader(datasets.MNIST(
    r'D:\Users\Administrator\Desktop\PythonDLbasedonPytorch\data', 
    train=True,
    download=True,
    transform=transforms.Compose(
        [transforms.ToTensor(),
            transforms.Normalize((0.1307, ), (0.3081, ))])),
                                            batch_size=batch_size,
                                            shuffle=True)
# 注意數據集路徑
test_loader = torch.utils.data.DataLoader(datasets.MNIST(
    r'D:\Users\Administrator\Desktop\PythonDLbasedonPytorch\data',
    train=False,
    transform=transforms.Compose(
        [transforms.ToTensor(),
            transforms.Normalize((0.1307, ), (0.3081, ))])),
                                            batch_size=batch_size,
                                            shuffle=True)

# 注意此處初始化visdom類
viz = Visdom()
# 繪制起點
viz.line([0.], [0.], win="train loss", opts=dict(title='train_loss'))
device = torch.device('cuda:0')
net = MLP().to(device)
optimizer = optim.SGD(net.parameters(), lr=learning_rate)
criteon = nn.CrossEntropyLoss().to(device)

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

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

    test_loss /= len(test_loader.dataset)
    # 繪制epoch以及對應的測試集損失loss
    viz.line([test_loss], [epoch], win="train loss", update='append')
    print(
        '\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
            test_loss, correct, len(test_loader.dataset),
            100. * correct / len(test_loader.dataset)))

loss曲線如圖所示

 ..........

visdom基本可視化函數

- vis.image : 圖片
- vis.line: 曲線
- vis.images : 圖片列表
- vis.text : 抽象HTML 輸出文字
- vis.properties : 屬性網格
- vis.audio : 音頻
- vis.video : 視頻
- vis.svg : SVG對象
- vis.matplot : matplotlib圖
- vis.save : 序列化狀態服務端

上述函數參數

  • 注意opt的參數都可以用python字典的格式傳入,大家可以參考下方使用方法
- opts.title : 圖標題
- opts.width : 圖寬
- opts.height : 圖高
- opts.showlegend : 顯示圖例 (true or false)
- opts.xtype : x軸的類型 ('linear' or 'log')
- opts.xlabel : x軸的標簽
- opts.xtick : 顯示x軸上的刻度 (boolean)
- opts.xtickmin : 指定x軸上的第一個刻度 (number)
- opts.xtickmax : 指定x軸上的最后一個刻度 (number)
- opts.xtickvals : x軸上刻度的位置(table of numbers)
- opts.xticklabels : 在x軸上標記標簽 (table of strings)
- opts.xtickstep : x軸上刻度之間的距離 (number)
- opts.xtickfont :x軸標簽的字體 (dict of font information)
- opts.ytype : type of y-axis ('linear' or 'log')
- opts.ylabel : label of y-axis
- opts.ytick : show ticks on y-axis (boolean)
- opts.ytickmin : first tick on y-axis (number)
- opts.ytickmax : last tick on y-axis (number)
- opts.ytickvals : locations of ticks on y-axis (table of numbers)
- opts.yticklabels : ticks labels on y-axis (table of strings)
- opts.ytickstep : distances between ticks on y-axis (number)
- opts.ytickfont : font for y-axis labels (dict of font information)
- opts.marginleft : 左邊框 (in pixels)
- opts.marginright :右邊框 (in pixels)
- opts.margintop : 上邊框 (in pixels)
- opts.marginbottom: 下邊框 (in pixels)
- opts.lagent=['']: 顯示圖標

更多應用請參考官方demo:
https://github.com/facebookresearch/visdom/blob/master/example/demo.py

GitHub地址:https://github.com/facebookresearch/visdom

Ref:(42條消息) visdom 使用教程_加油_加油_DrDu的博客-CSDN博客_visdom使用

  (42條消息) PyTorch 訓練可視化教程 visdom_趙繼超的筆記-CSDN博客_pytorch訓練可視化


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM