亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

PyTorch中可視化工具的使用

 更新時(shí)間:2023年04月11日 08:52:30   作者:Mr.長安  
本文主要介紹了PyTorch中可視化工具的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、網(wǎng)絡(luò)結(jié)構(gòu)的可視化

我們訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí),除了隨著step或者epoch觀察損失函數(shù)的走勢(shì),從而建立對(duì)目前網(wǎng)絡(luò)優(yōu)化的基本認(rèn)知外,也可以通過一些額外的可視化庫來可視化我們的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)圖。

為了可視化神經(jīng)網(wǎng)絡(luò),我們先建立一個(gè)簡(jiǎn)單的卷積層神經(jīng)網(wǎng)絡(luò):

 import torch
 import torch.nn as nn
 
 class ConvNet(nn.Module):
     def __init__(self):
         super(ConvNet, self).__init__()
 
         self.conv1 = nn.Sequential(
             nn.Conv2d(1, 16, 3, 1, 1),
             nn.ReLU(),
             nn.AvgPool2d(2, 2)
         )
 
         self.conv2 = nn.Sequential(
             nn.Conv2d(16, 32, 3, 1, 1),
             nn.ReLU(),
             nn.MaxPool2d(2, 2)
         )
 
         self.fc = nn.Sequential(
             nn.Linear(32 * 7 * 7, 128),
             nn.ReLU(),
             nn.Linear(128, 64),
             nn.ReLU()
         )
 
         self.out = nn.Linear(64, 10)
 
     def forward(self, x):
         x = self.conv1(x)
         x = self.conv2(x)
         x = x.view(x.size(0), -1)
         x = self.fc(x)
         output = self.out(x)
         return output

輸出網(wǎng)絡(luò)結(jié)構(gòu):

MyConvNet = ConvNet()
print(MyConvNet)

輸出結(jié)果:

 ConvNet(
   (conv1): Sequential(
     (0): Conv2d(1, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
     (1): ReLU()
     (2): AvgPool2d(kernel_size=2, stride=2, padding=0)
   )
   (conv2): Sequential(
     (0): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
     (1): ReLU()
     (2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
   )
   (fc): Sequential(
     (0): Linear(in_features=1568, out_features=128, bias=True)
     (1): ReLU()
     (2): Linear(in_features=128, out_features=64, bias=True)
     (3): ReLU()
   )
   (out): Linear(in_features=64, out_features=10, bias=True)
 )

有了基本的神經(jīng)網(wǎng)絡(luò)后,我們分別通過HiddenLayerPyTorchViz庫來可視化上述的卷積層神經(jīng)網(wǎng)絡(luò)。

需要說明的是,這兩個(gè)庫都是基于Graphviz開發(fā)的,因此倘若你的電腦上沒有安裝并且沒有添加環(huán)境變量,請(qǐng)自行安裝Graphviz工具

1.1 通過HiddenLayer可視化網(wǎng)絡(luò) 

首先當(dāng)然是安裝庫啦,打開cmd,輸入:

pip install hiddenlayer

 繪制的基本程序如下:

 import hiddenlayer as h
 vis_graph = h.build_graph(MyConvNet, torch.zeros([1 ,1, 28, 28]))   # 獲取繪制圖像的對(duì)象
 vis_graph.theme = h.graph.THEMES["blue"].copy()     # 指定主題顏色
 vis_graph.save("./demo1.png")   # 保存圖像的路徑

效果如下:

1.2 通過PyTorchViz可視化網(wǎng)絡(luò) 

先安裝庫:

pip install torchviz

 這里我們只使用可視化函數(shù)make_dot()來獲取繪圖對(duì)象,基本使用和HiddenLayer差不多,不同的地方在于PyTorch繪圖之前可以指定一個(gè)網(wǎng)絡(luò)的輸入值和預(yù)測(cè)值。

 from torchviz import make_dot
 x = torch.randn(1, 1, 28, 28).requires_grad_(True)  # 定義一個(gè)網(wǎng)絡(luò)的輸入值
 y = MyConvNet(x)    # 獲取網(wǎng)絡(luò)的預(yù)測(cè)值
 
 MyConvNetVis = make_dot(y, params=dict(list(MyConvNet.named_parameters()) + [('x', x)]))
 MyConvNetVis.format = "png"
 # 指定文件生成的文件夾
 MyConvNetVis.directory = "data"
 # 生成文件
 MyConvNetVis.view()

打開與上述代碼相同根目錄下的data文件夾,里面會(huì)有一個(gè).gv文件和一個(gè).jpg文件,其中的.gv文件是Graphviz工具生成圖片的腳本代碼,.jpg.gv文件編譯生成的圖片,直接打開.jpg文件就行。

默認(rèn)情況下,上述程序運(yùn)行后會(huì)自動(dòng)打開.jpg文件

生成圖片:

二、訓(xùn)練過程可視化 

觀察我們的網(wǎng)絡(luò)的每一步的損失函數(shù)或準(zhǔn)確率的變化可以有效地幫助我們判斷當(dāng)前訓(xùn)練過程的優(yōu)劣。如果能將這些過程可視化,那么我們判斷的準(zhǔn)確性和舒適性都會(huì)有所增加。

此處主要講通過可視化神器tensorboardX和剛剛用到的HiddenLayer來實(shí)現(xiàn)訓(xùn)練過程的可視化。

為了訓(xùn)練網(wǎng)絡(luò),我們先導(dǎo)入訓(xùn)練網(wǎng)絡(luò)需要的數(shù)據(jù),此處就導(dǎo)入MNIST數(shù)據(jù)集,并做訓(xùn)練前的一些基本的數(shù)據(jù)處理。

import torchvision
 import torch.utils.data as Data
 # 準(zhǔn)備訓(xùn)練用的MNIST數(shù)據(jù)集
 train_data = torchvision.datasets.MNIST(
     root = "./data/MNIST",  # 提取數(shù)據(jù)的路徑
     train=True, # 使用MNIST內(nèi)的訓(xùn)練數(shù)據(jù)
     transform=torchvision.transforms.ToTensor(),    # 轉(zhuǎn)換成torch.tensor
     download=False   # 如果是第一次運(yùn)行的話,置為True,表示下載數(shù)據(jù)集到root目錄
 )
 
 # 定義loader
 train_loader = Data.DataLoader(
     dataset=train_data,
     batch_size=128,
     shuffle=True,
     num_workers=0
 )
 
 test_data = torchvision.datasets.MNIST(
     root="./data/MNIST",
     train=False,    # 使用測(cè)試數(shù)據(jù)
     download=False
 )
 
 # 將測(cè)試數(shù)據(jù)壓縮到0-1
 test_data_x = test_data.data.type(torch.FloatTensor) / 255.0
 test_data_x = torch.unsqueeze(test_data_x, dim=1)
 test_data_y = test_data.targets
 
 # 打印一下測(cè)試數(shù)據(jù)和訓(xùn)練數(shù)據(jù)的shape
 print("test_data_x.shape:", test_data_x.shape)
 print("test_data_y.shape:", test_data_y.shape)
 
 for x, y in train_loader:
     print(x.shape)
     print(y.shape)
     break

結(jié)果:

 test_data_x.shape: torch.Size([10000, 1, 28, 28])
 test_data_y.shape: torch.Size([10000])
 torch.Size([128, 1, 28, 28])
 torch.Size([128])

2.1 通過tensorboardX可視化訓(xùn)練過程

tensorboard是谷歌開發(fā)的深度學(xué)習(xí)框架tensorflow的一套深度學(xué)習(xí)可視化神器,在pytorch團(tuán)隊(duì)的努力下,他們開發(fā)出了tensorboardX來讓pytorch的玩家也能享受tensorboard的福利。

先安裝相關(guān)的庫:

 pip install tensorboardX
 pip install tensorboard

并將tensorboard.exe所在的文件夾路徑加入環(huán)境變量path中(比如我的tensorboard.exe的路徑為D:\Python376\Scripts\tensorboard.exe,那么就在path中加入D:\Python376\Scripts

下面是tensorboardX的使用過程?;臼褂脼?,先通過tensorboardX下的SummaryWriter類獲取一個(gè)日志編寫器對(duì)象。然后通過這個(gè)對(duì)象的一組方法往日志中添加事件,即生成相應(yīng)的圖片,最后啟動(dòng)前端服務(wù)器,在localhost中就可以看到最終的結(jié)果了。

訓(xùn)練網(wǎng)絡(luò),并可視化網(wǎng)絡(luò)訓(xùn)練過程的代碼如下:

 from tensorboardX import SummaryWriter
 logger = SummaryWriter(log_dir="data/log")
 
 # 獲取優(yōu)化器和損失函數(shù)
 optimizer = torch.optim.Adam(MyConvNet.parameters(), lr=3e-4)
 loss_func = nn.CrossEntropyLoss()
 log_step_interval = 100      # 記錄的步數(shù)間隔
 
 for epoch in range(5):
     print("epoch:", epoch)
     # 每一輪都遍歷一遍數(shù)據(jù)加載器
     for step, (x, y) in enumerate(train_loader):
         # 前向計(jì)算->計(jì)算損失函數(shù)->(從損失函數(shù))反向傳播->更新網(wǎng)絡(luò)
         predict = MyConvNet(x)
         loss = loss_func(predict, y)
         optimizer.zero_grad()   # 清空梯度(可以不寫)
         loss.backward()     # 反向傳播計(jì)算梯度
         optimizer.step()    # 更新網(wǎng)絡(luò)
         global_iter_num = epoch * len(train_loader) + step + 1  # 計(jì)算當(dāng)前是從訓(xùn)練開始時(shí)的第幾步(全局迭代次數(shù))
         if global_iter_num % log_step_interval == 0:
             # 控制臺(tái)輸出一下
             print("global_step:{}, loss:{:.2}".format(global_iter_num, loss.item()))
             # 添加的第一條日志:損失函數(shù)-全局迭代次數(shù)
             logger.add_scalar("train loss", loss.item() ,global_step=global_iter_num)
             # 在測(cè)試集上預(yù)測(cè)并計(jì)算正確率
             test_predict = MyConvNet(test_data_x)
             _, predict_idx = torch.max(test_predict, 1)     # 計(jì)算softmax后的最大值的索引,即預(yù)測(cè)結(jié)果
             acc = accuracy_score(test_data_y, predict_idx)
             # 添加第二條日志:正確率-全局迭代次數(shù)
             logger.add_scalar("test accuary", acc.item(), global_step=global_iter_num)
             # 添加第三條日志:這個(gè)batch下的128張圖像
             img = vutils.make_grid(x, nrow=12)
             logger.add_image("train image sample", img, global_step=global_iter_num)
             # 添加第三條日志:網(wǎng)絡(luò)中的參數(shù)分布直方圖
             for name, param in MyConvNet.named_parameters():
                 logger.add_histogram(name, param.data.numpy(), global_step=global_iter_num)

運(yùn)行完后,我們通過cmd來到與代碼同一級(jí)的目錄(如果你使用的是pycharm,可以通過pycharm中的終端)輸入指令tensorboard --logdir="./data/log",啟動(dòng)服務(wù)器。

 logdir后面的參數(shù)是日志文件的文件夾的路徑

然后在谷歌瀏覽器中訪問紅框框中的url,便可得到可視化界面,點(diǎn)擊上面的頁面控件,可以查看我們通過add_scalaradd_imageadd_histogram得到的圖像,而且各方面做得都很絲滑。 

2.2 HiddenLayer可視化訓(xùn)練過程

tensorboard的圖像很華麗,但是使用過程相較于其他的工具包較為繁瑣,所以小網(wǎng)絡(luò)一般沒必要使用tensorboard。

import hiddenlayer as hl
 import time
 
 # 記錄訓(xùn)練過程的指標(biāo)
 history = hl.History()
 # 使用canvas進(jìn)行可視化
 canvas = hl.Canvas()
 
 # 獲取優(yōu)化器和損失函數(shù)
 optimizer = torch.optim.Adam(MyConvNet.parameters(), lr=3e-4)
 loss_func = nn.CrossEntropyLoss()
 log_step_interval = 100      # 記錄的步數(shù)間隔
 
 for epoch in range(5):
     print("epoch:", epoch)
     # 每一輪都遍歷一遍數(shù)據(jù)加載器
     for step, (x, y) in enumerate(train_loader):
         # 前向計(jì)算->計(jì)算損失函數(shù)->(從損失函數(shù))反向傳播->更新網(wǎng)絡(luò)
         predict = MyConvNet(x)
         loss = loss_func(predict, y)
         optimizer.zero_grad()   # 清空梯度(可以不寫)
         loss.backward()     # 反向傳播計(jì)算梯度
         optimizer.step()    # 更新網(wǎng)絡(luò)
         global_iter_num = epoch * len(train_loader) + step + 1  # 計(jì)算當(dāng)前是從訓(xùn)練開始時(shí)的第幾步(全局迭代次數(shù))
         if global_iter_num % log_step_interval == 0:
             # 控制臺(tái)輸出一下
             print("global_step:{}, loss:{:.2}".format(global_iter_num, loss.item()))
             # 在測(cè)試集上預(yù)測(cè)并計(jì)算正確率
             test_predict = MyConvNet(test_data_x)
             _, predict_idx = torch.max(test_predict, 1)  # 計(jì)算softmax后的最大值的索引,即預(yù)測(cè)結(jié)果
             acc = accuracy_score(test_data_y, predict_idx)
 
             # 以epoch和step為索引,創(chuàng)建日志字典
             history.log((epoch, step),
                         train_loss=loss,
                         test_acc=acc,
                         hidden_weight=MyConvNet.fc[2].weight)
 
             # 可視化
             with canvas:
                 canvas.draw_plot(history["train_loss"])
                 canvas.draw_plot(history["test_acc"])
                 canvas.draw_image(history["hidden_weight"])

 不同于tensorboard,hiddenlayer會(huì)在程序運(yùn)行的過程中動(dòng)態(tài)生成圖像,而不是模型訓(xùn)練完后。

下面為模型訓(xùn)練的某一時(shí)刻的截圖: 

三、使用Visdom進(jìn)行可視化

Visdom是Facebook為pytorch開發(fā)的一塊可視化工具。類似于tensorboard,visdom也是通過在本地啟動(dòng)前端服務(wù)器來實(shí)現(xiàn)可視化的,而在具體操作上,visdom又類似于matplotlib.pyplot。所以使用起來很靈活。

首先先安裝visdom庫,然后補(bǔ)坑。由于啟動(dòng)前端服務(wù)器需要大量依賴項(xiàng),所以在第一次啟動(dòng)時(shí)可能會(huì)很慢(需要下載前端三板斧的依賴項(xiàng)),解決方法請(qǐng)見這里。

先導(dǎo)入需要的第三方庫:

 from visdom import Visdom
 from sklearn.datasets import  load_iris
 import torch
 import numpy as np
 from PIL import Image

matplotlib里,用戶繪圖可以通過plt這個(gè)對(duì)象來繪圖,在visdom中,同樣需要一個(gè)繪圖對(duì)象,我們通過vis = Visdom()來獲取。具體繪制時(shí),由于我們會(huì)一次畫好幾張圖,所以visdom要求用戶在繪制時(shí)指定當(dāng)前繪制圖像的窗口名字(也就是win這個(gè)參數(shù));除此之外,為了到時(shí)候顯示的分塊,用戶還需要指定繪圖環(huán)境env,這個(gè)參數(shù)相同的圖像,最后會(huì)顯示在同一張頁面上。

繪制線圖(相當(dāng)于matplotlib中的plt.plot

# 繪制圖像需要的數(shù)據(jù)
 iris_x, iris_y = load_iris(return_X_y=True)
 
 # 獲取繪圖對(duì)象,相當(dāng)于plt
 vis = Visdom()
 
 # 添加折線圖
 x = torch.linspace(-6, 6, 100).view([-1, 1])
 sigmoid = torch.nn.Sigmoid()
 sigmoid_y = sigmoid(x)
 tanh = torch.nn.Tanh()
 tanh_y = tanh(x)
 relu = torch.nn.ReLU()
 relu_y = relu(x)
 # 連接三個(gè)張量
 plot_x = torch.cat([x, x, x], dim=1)
 plot_y = torch.cat([sigmoid_y, tanh_y, relu_y], dim=1)
 # 繪制線性圖
 vis.line(X=plot_x, Y=plot_y, win="line plot", env="main",
          opts={
              "dash" : np.array(["solid", "dash", "dashdot"]),
              "legend" : ["Sigmoid", "Tanh", "ReLU"]
          })

繪制散點(diǎn)圖:

 # 繪制2D和3D散點(diǎn)圖
 # 參數(shù)Y用來指定點(diǎn)的分布,win指定圖像的窗口名稱,env指定圖像所在的環(huán)境,opts通過字典來指定一些樣式
 vis.scatter(iris_x[ : , 0 : 2], Y=iris_y+1, win="windows1", env="main")
 vis.scatter(iris_x[ : , 0 : 3], Y=iris_y+1, win="3D scatter", env="main",
             opts={
                 "markersize" : 4,   # 點(diǎn)的大小
                 "xlabel" : "特征1",
                 "ylabel" : "特征2"
             })

繪制莖葉圖:

 # 添加莖葉圖
 x = torch.linspace(-6, 6, 100).view([-1, 1])
 y1 = torch.sin(x)
 y2 = torch.cos(x)
 
 # 連接張量
 plot_x = torch.cat([x, x], dim=1)
 plot_y = torch.cat([y1, y2], dim=1)
 # 繪制莖葉圖
 vis.stem(X=plot_x, Y=plot_y, win="stem plot", env="main",
          opts={
              "legend" : ["sin", "cos"],
              "title" : "莖葉圖"
          })

繪制熱力圖:

 # 計(jì)算鳶尾花數(shù)據(jù)集特征向量的相關(guān)系數(shù)矩陣
 iris_corr = torch.from_numpy(np.corrcoef(iris_x, rowvar=False))
 # 繪制熱力圖
 vis.heatmap(iris_corr, win="heatmap", env="main",
             opts={
                 "rownames" : ["x1", "x2", "x3", "x4"],
                 "columnnames" : ["x1", "x2", "x3", "x4"],
                 "title" : "熱力圖"
             })

可視化圖片,這里我們使用自定義的env名MyPlotEnv

 # 可視化圖片
 img_Image = Image.open("./example.jpg")
 img_array = np.array(img_Image.convert("L"), dtype=np.float32)
 img_tensor = torch.from_numpy(img_array)
 print(img_tensor.shape)
 
 # 這次env自定義
 vis.image(img_tensor, win="one image", env="MyPlotEnv",
           opts={
               "title" : "一張圖像"
           })

可視化文本,同樣在MyPlotEnv中繪制:

 # 可視化文本
 text = "hello world"
 vis.text(text=text, win="text plot", env="MyPlotEnv",
          opts={
              "title" : "可視化文本"
          })

運(yùn)行上述代碼,再通過在終端中輸入python3 -m visdom.server啟動(dòng)服務(wù)器,然后根據(jù)終端返回的URL,在谷歌瀏覽器中訪問這個(gè)URL,就可以看到圖像了。

在Environment中輸入不同的env參數(shù)可以看到我們?cè)诓煌h(huán)境下繪制的圖片。對(duì)于分類圖集特別有用。 

在終端中按下Ctrl+C可以終止前端服務(wù)器。 

到此這篇關(guān)于PyTorch中可視化工具的使用的文章就介紹到這了,更多相關(guān)PyTorch 可視化工具內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論