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