<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          PyTorch下的可視化工具

          共 13609字,需瀏覽 28分鐘

           ·

          2022-08-04 00:17

















          來(lái)源:知乎—錦恢

          地址:https://zhuanlan.zhihu.com/p/220403674
          toc無(wú)效QAQ,反正大致想說(shuō)一下pytorch下的網(wǎng)絡(luò)結(jié)構(gòu)可視化和訓(xùn)練過(guò)程可視化。

          01

          網(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)知外,也可以通過(guò)一些額外的可視化庫(kù)來(lái)可視化我們的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)圖。這將更加地高效地向讀者展現(xiàn)目前的網(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ò)后,我們分別通過(guò)HiddenLayer和PyTorchViz庫(kù)來(lái)可視化上述的卷積層神經(jīng)網(wǎng)絡(luò)。
          需要說(shuō)明的是,這兩個(gè)庫(kù)都是基于Graphviz開(kāi)發(fā)的,因此倘若你的電腦上沒(méi)有安裝并且沒(méi)有添加環(huán)境變量,請(qǐng)自行安裝Graphviz工具,https://blog.csdn.net/lizzy05/article/details/88529483

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

          首先當(dāng)然是安裝庫(kù)啦,打開(kāi)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 通過(guò)PyTorchViz可視化網(wǎng)絡(luò)

          先安裝庫(kù):
           pip install torchviz
          這里我們只使用可視化函數(shù)make_dot()來(lái)獲取繪圖對(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()
          打開(kāi)與上述代碼相同根目錄下的data文件夾,里面會(huì)有一個(gè).gv文件和一個(gè).png文件,其中的.gv文件是Graphviz工具生成圖片的腳本代碼,.png是.gv文件編譯生成的圖片,直接打開(kāi).png文件就行。
          默認(rèn)情況下,上述程序運(yùn)行后會(huì)自動(dòng)打開(kāi).png文件
          生成圖片:


          02

          訓(xùn)練過(guò)程可視化
          觀察我們的網(wǎng)絡(luò)的每一步的損失函數(shù)或準(zhǔn)確率的變化可以有效地幫助我們判斷當(dāng)前訓(xùn)練過(guò)程的優(yōu)劣。如果能將這些過(guò)程可視化,那么我們判斷的準(zhǔn)確性和舒適性都會(huì)有所增加。
          此處主要講通過(guò)可視化神器tensorboardX和剛剛用到的HiddenLayer來(lái)實(shí)現(xiàn)訓(xùn)練過(guò)程的可視化。
          為了訓(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)行的話,置為T(mén)rue,表示下載數(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 通過(guò)tensorboardX可視化訓(xùn)練過(guò)程

          tensorboard是谷歌開(kāi)發(fā)的深度學(xué)習(xí)框架tensorflow的一套深度學(xué)習(xí)可視化神器,在pytorch團(tuán)隊(duì)的努力下,他們開(kāi)發(fā)出了tensorboardX來(lái)讓pytorch的玩家也能享受tensorboard的福利。
          先安裝相關(guān)的庫(kù):
           pip install tensorboardX pip install tensorboard
          并將tensorboard.exe所在的文件夾路徑加入環(huán)境變量path中(比如我的tensorboard.exe的路徑為D:\Python376\Scripts\tensorboard.exe,那么就在path中加入D:\Python376\Scripts)
          下面是tensorboardX的使用過(guò)程。基本使用為,先通過(guò)tensorboardX下的SummaryWriter類(lèi)獲取一個(gè)日志編寫(xiě)器對(duì)象。然后通過(guò)這個(gè)對(duì)象的一組方法往日志中添加事件,即生成相應(yīng)的圖片,最后啟動(dòng)前端服務(wù)器,在localhost中就可以看到最終的結(jié)果了。
          訓(xùn)練網(wǎng)絡(luò),并可視化網(wǎng)絡(luò)訓(xùn)練過(guò)程的代碼如下:
          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()   # 清空梯度(可以不寫(xiě))         loss.backward()     # 反向傳播計(jì)算梯度         optimizer.step()    # 更新網(wǎng)絡(luò)         global_iter_num = epoch * len(train_loader) + step + 1  # 計(jì)算當(dāng)前是從訓(xùn)練開(kāi)始時(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)行完后,我們通過(guò)cmd來(lái)到與代碼同一級(jí)的目錄(如果你使用的是pycharm,可以通過(guò)pycharm中的終端)輸入指令tensorboard --logdir="./data/log",啟動(dòng)服務(wù)器。
          logdir后面的參數(shù)是日志文件的文件夾的路徑
          然后在谷歌瀏覽器中訪問(wèn)紅框框中的url,便可得到可視化界面,點(diǎn)擊上面的頁(yè)面控件,可以查看我們通過(guò)add_scalar、add_image和add_histogram得到的圖像,而且各方面做得都很絲滑。
          以下是筆者安裝使用tensorboard時(shí)遇到的一些錯(cuò)誤
          好,作為一名沒(méi)有裝過(guò)TensorFlow的windows玩家,筆者下面開(kāi)始踩坑。踩完后,直接把幾個(gè)可能的錯(cuò)誤呈上。
          第一個(gè)錯(cuò)誤,運(yùn)行tensorboard --logdir="./data/log",遇到報(bào)錯(cuò),內(nèi)容為有重復(fù)的tensorboard的包。
          解決方法:找到site-packages(如果你是像我一樣全局安裝的,那么找到解釋器那一級(jí)目錄的site-packages,如果是在項(xiàng)目虛擬環(huán)境中安裝的,那么找到項(xiàng)目中的site-packages),刪去下圖中紅框框標(biāo)出來(lái)的文件夾。
          第二個(gè)錯(cuò)誤,在解決第一個(gè)錯(cuò)誤后,再次運(yùn)行命令,還是報(bào)錯(cuò),內(nèi)容為編碼出錯(cuò)。由于筆者做過(guò)一點(diǎn)前端,在學(xué)習(xí)webpack項(xiàng)目時(shí),曾經(jīng)被告知項(xiàng)目路徑不能含有中文,否則會(huì)有編碼錯(cuò)誤,而剛才的報(bào)錯(cuò)中涉及到了前端服務(wù)器的啟動(dòng),因此,筆者想到從文件名入手。
          解決方法:確保命令涉及的文件路徑、所有程序涉及到文件不含中文。筆者是計(jì)算機(jī)名字含有中文,然后tensorboard的日志文件是以本地計(jì)算機(jī)名為后綴的,所以筆者將計(jì)算機(jī)名修改成了英文,重啟后再輸入指令就ok了。

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

          tensorboard的圖像很華麗,但是使用過(guò)程相較于其他的工具包較為繁瑣,所以小網(wǎng)絡(luò)一般沒(méi)必要使用tensorboard。
          import hiddenlayer as hl import time  # 記錄訓(xùn)練過(guò)程的指標(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()   # 清空梯度(可以不寫(xiě))         loss.backward()     # 反向傳播計(jì)算梯度         optimizer.step()    # 更新網(wǎng)絡(luò)         global_iter_num = epoch * len(train_loader) + step + 1  # 計(jì)算當(dāng)前是從訓(xùn)練開(kāi)始時(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)行的過(guò)程中動(dòng)態(tài)生成圖像,而不是模型訓(xùn)練完后
          下面為模型訓(xùn)練的某一時(shí)刻的截圖:


          03

          使用Visdom進(jìn)行可視化
          Visdom是Facebook為pytorch開(kāi)發(fā)的一塊可視化工具。類(lèi)似于tensorboard,visdom也是通過(guò)在本地啟動(dòng)前端服務(wù)器來(lái)實(shí)現(xiàn)可視化的,而在具體操作上,visdom又類(lèi)似于matplotlib.pyplot。所以使用起來(lái)很靈活。
          首先先安裝visdom庫(kù),然后補(bǔ)坑。由于啟動(dòng)前端服務(wù)器需要大量依賴項(xiàng),所以在第一次啟動(dòng)時(shí)可能會(huì)很慢(需要下載前端三板斧的依賴項(xiàng)),解決方法請(qǐng)見(jiàn)這里。
          先導(dǎo)入需要的第三方庫(kù):
          from visdom import Visdom from sklearn.datasets import  load_iris import torch import numpy as np from PIL import Image
          matplotlib里,用戶繪圖可以通過(guò)plt這個(gè)對(duì)象來(lái)繪圖,在visdom中,同樣需要一個(gè)繪圖對(duì)象,我們通過(guò)vis = Visdom()來(lái)獲取。具體繪制時(shí),由于我們會(huì)一次畫(huà)好幾張圖,所以visdom要求用戶在繪制時(shí)指定當(dāng)前繪制圖像的窗口名字(也就是win這個(gè)參數(shù));除此之外,為了到時(shí)候顯示的分塊,用戶還需要指定繪圖環(huán)境env,這個(gè)參數(shù)相同的圖像,最后會(huì)顯示在同一張頁(yè)面上。
          繪制線圖(相當(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用來(lái)指定點(diǎn)的分布,win指定圖像的窗口名稱,env指定圖像所在的環(huán)境,opts通過(guò)字典來(lái)指定一些樣式 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)行上述代碼,再通過(guò)在終端中輸入python3 -m visdom.server啟動(dòng)服務(wù)器,然后根據(jù)終端返回的URL,在谷歌瀏覽器中訪問(wèn)這個(gè)URL,就可以看到圖像了。
          在Environment中輸入不同的env參數(shù)可以看到我們?cè)诓煌h(huán)境下繪制的圖片。對(duì)于分類(lèi)圖集特別有用
          在終端中按下Ctrl+C可以終止前端服務(wù)器。


          04

          進(jìn)一步
          2021.8.11 update
          需要注意,如果你的前端服務(wù)器停掉了,那么所有的圖片都會(huì)丟失,因?yàn)榇藭r(shí)的圖像的數(shù)據(jù)都是駐留在內(nèi)存中,而并沒(méi)有dump到本地磁盤(pán)。那么如何保存當(dāng)前visdom中的可視化結(jié)果,并在將來(lái)復(fù)用呢?其實(shí)很簡(jiǎn)單,比如我現(xiàn)在有一堆來(lái)之不易的Mel頻譜圖:
          點(diǎn)擊Manage Views
          點(diǎn)擊fork->save:(此處我只保存名為normal的env)
          接著,在你的User目錄下(Windows是C:\Users\賬戶\.visdom文件夾,Linux是在~\.visdom文件夾下),可以看到保存好的env:
          它是以json文件格式保存的,那么如果你保存完后再shut down當(dāng)前的前端服務(wù)器,圖像數(shù)據(jù)便不會(huì)丟失。
          好的,現(xiàn)在在保存完你珍貴的數(shù)據(jù)后,請(qǐng)關(guān)閉你的visdom前端服務(wù)器。然后再啟動(dòng)它。
          如何查看保存的數(shù)據(jù)呢?很簡(jiǎn)答,下次打開(kāi)visdom前端后,visdom會(huì)在.visdom文件夾下讀取所有的保存數(shù)據(jù)完成初始化,這意味著,你直接啟動(dòng)visdom,其他什么也不用做就可以看到之前保存的數(shù)據(jù)啦!
          那么如何服用保存的數(shù)據(jù)呢?既然你都知道了visdom保存的數(shù)據(jù)在哪里,那么直接通過(guò)python的json包來(lái)讀取這個(gè)數(shù)據(jù)文件,然后做解析就可以了,這是方法一,演示如下:
          import jsonwith open(r"...\.visdom\normal.json", "r", encoding="utf-8") as f:    dataset : dict = json.load(f)jsons : dict = dataset["jsons"]      # 這里存著你想要恢復(fù)的數(shù)據(jù)reload : dict = dataset["reload"]    # 這里存著有關(guān)窗口尺寸的數(shù)據(jù) print(jsons.keys())     # 查看所有的win
          out:
          dict_keys(['jsons', 'reload'])dict_keys(['1.wav', '2.wav', '3.wav', '4.wav', '5.wav', '6.wav', '7.wav', '8.wav', '9.wav', '10.wav', '11.wav', '12.wav', '13.wav', '14.wav'])
          但這么做不是很優(yōu)雅,所以visdom封裝了第二種方法。你當(dāng)然可以通過(guò)訪問(wèn)文件夾.visdom來(lái)查看當(dāng)前可用的env,但是也可以這么做:
          from visdom import Visdomvis = Visdom()print(vis.get_env_list())
          out:
          Setting up a new session...['main', 'normal']
          在獲取了可用的環(huán)境名后,你可以通過(guò)get_window_data方法來(lái)獲取指定env、指定win下的圖像數(shù)據(jù)。請(qǐng)注意,該方法返回str,故需要通過(guò)json來(lái)解析:
          from visdom import Visdomimport jsonvis = Visdom()window = vis.get_window_data(win="1.wav", env="normal")    window = json.loads(window)         # window 是 str,需要解析為字典content = window["content"]data = content["data"][0]print(data.keys())
          out:
          Setting up a new session...dict_keys(['z', 'x', 'y', 'zmin', 'zmax', 'type', 'colorscale'])
          通過(guò)索引這些keys,相信想復(fù)用原本的圖像數(shù)據(jù)并不困難。



          猜您喜歡:

           戳我,查看GAN的系列專(zhuān)輯~!
          一頓午飯外賣(mài),成為CV視覺(jué)前沿弄潮兒!
          CVPR 2022 | 25+方向、最新50篇GAN論文
           ICCV 2021 | 35個(gè)主題GAN論文匯總
          超110篇!CVPR 2021最全GAN論文梳理
          超100篇!CVPR 2020最全GAN論文梳理


          拆解組新的GAN:解耦表征MixNMatch

          StarGAN第2版:多域多樣性圖像生成


          附下載 | 《可解釋的機(jī)器學(xué)習(xí)》中文版

          附下載 |《TensorFlow 2.0 深度學(xué)習(xí)算法實(shí)戰(zhàn)》

          附下載 |《計(jì)算機(jī)視覺(jué)中的數(shù)學(xué)方法》分享


          《基于深度學(xué)習(xí)的表面缺陷檢測(cè)方法綜述》

          《零樣本圖像分類(lèi)綜述: 十年進(jìn)展》

          《基于深度神經(jīng)網(wǎng)絡(luò)的少樣本學(xué)習(xí)綜述》


          瀏覽 66
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  污污污在线看 | 青青草97 | 性爱激情五月 | 亚洲性爱小说 | 日韩欧美豆花视频 |