PyTorch模型訓練特徵圖可視化(TensorboardX)

2021-01-20 機器學習研究組訂閱
0、前言本文所有代碼解讀均基於PyTorch 1.0,Python3;本文為原創文章,初次完成於2019.03,最後更新於2019.09;

最近復現的一篇論文一直都難以work,上了特徵圖可視化後一下子就找到了問題所在,所以今天想梳理一下PyTorch裡面的特徵圖可視化。

大家都知道Tensorflow有一款非常優秀的可視化工具Tensorboard,而PyTorch自身沒有可視化功能,但是我們可以尋找替代品,即TensorBoardX。安裝過程不多介紹,詳見下面的參考連結,裡面相應有比較豐富的介紹。

tensor-yu/PyTorch_Tutorial
https://github.com/tensor-yu/PyTorch_Tutorial

1、Loss可視化

最常見的可視化就是loss曲線作圖,這個實現相對比較簡單,不多做介紹了

tb_logger.add_scalar('loss_train', loss, curr_step)


2、輸入圖片和標籤的可視化

模型不work,第一個應該檢查的就是輸入輸出有沒有沒給對,因此我們需要將傳遞給model的 input 和 label 可視化一下。

傳遞給網絡的圖片格式往往是 [B,C,H,W] ,範圍[0, 1],數據類型tensor.FloatTensor,但是add_iamge() 能夠接受的格式是[C,H,W], 範圍[0,1],數據類型tensor.FloatTensor。

一個是三維的,一個是四維的,這很好解決,我們把每個batch的第一張圖拿出來就行了:input[0]的形狀就是[C,H,W],符合輸入要求。

tb_logger.add_image('image', input[0], curr_step)

tensoroard裡面如果出現了貓咪本尊的正確可視化結果,就說明輸入圖片沒問題

如果你在Dataloader裡對輸入圖片做了Normalize,顯示會出現問題,出現如下所示的亂碼,此時需要通過make_grid()函數做一些處理,函數用法具體可見後面的描述。

3、單通道特徵圖的可視化

有時候我們需要把網絡內部分節點的特徵圖可視化出來,這時候上面的方法就不能用了,因為特徵圖的每個像素點上的數值範圍不是[0,1],而是可正可負,可大可小,因此需要做一些特殊處理。這裡就要用到 torchvision.utils.make_grid( )函數,把輸入的特徵圖做一個歸一化,把參數normalize設置為True即可,它能幫我們把數據的輸入範圍調整至[0, 1]之間

def make_grid(tensor, nrow=8, padding=2,              normalize=False, range=None, scale_each=False, pad_value=0):

更多其他參數的用法參見源碼:

https://github.com/pytorch/vision/blob/master/torchvision/utils.py

這裡我把三個中間特徵圖拼在了一塊顯示:

from torchvision.utils import make_gridtb_logger.add_image('feature_map', make_grid([feature_map1, feature_map2, fetare_map3], padding=20, normalize=True, scale_each=True, pad_value=1), curr_step)

需要注意的是:

make_grid() 輸入的是Tensor,而不是numpy.ndarraytorchvision.utils.make_grid() 將一組圖片繪製到一個窗口,其本質是將一組圖片拼接成一張圖片4、多通道特徵圖的可視化

多通道的特徵圖的顯示和上面的單通道存在一些區別,假設我們從batsh_size=16,channel=20的一個tensor想取出一個多通道特徵圖可視化,只需要如下操作


feature_map[0].deatch().cpu().unsqueeze(dim=1)

這樣就能把一個形狀為 [16,20, H, W] 的tesnor取出並轉換為 [20, 1, H ,W] 的形狀,這與為什麼要這麼轉換,詳解第五章節。

完整代碼和如下:

tb_logger.add_image('channels', make_grid(feature_map[0].detach().cpu().unsqueeze(dim=1), nrow=5, padding=20, normalize=False, pad_value=1), curr_step)


5、make_grid()通道數的問題

測試發現,輸入 [1, H, W] 的數據沒問題,但是[20, H, W] 就不行,[20, 1, H, W] 就可以

這是因為單通道 [1, H, W] 不存在歧義,但是多通道就不行,比如說[3, H, W] 到底是一張三通道的圖還是三張單通道的圖,存在歧義

因此想要顯示一張多通道的特徵圖可以這麼轉換:[1, C, H, W] --> [C, 1, H, W],顯性地指明tensor形狀。

6、總結

特徵圖可視化在模型復現過程中十分有用,可用於定位模型錯誤所在,但是在tensor的數據格式、尺寸、維度上存在許多講究,使用時需要額外小心。

附錄一:相關函數源碼

其實想要熟練使用,還是多看看make_grid的源碼和樣例吧:

https://github.com/pytorch/vision/blob/master/torchvision/utils.py

https://gist.github.com/anonymous/bf16430f7750c023141c562f3e9f2a91

附錄二:網絡結構可視化工具

Caffe網絡可視化工具

Netscope
https://ethereon.github.io/netscope/%23/editor

PyTorch等網絡的可視化工具

https://github.com/waleedka/hiddenlayer

大概是這麼個效果,相對清晰一些


想要了解更多資訊,請掃描下方二維碼,關注機器學習研究會

                                          


轉自:極市平臺

相關焦點

  • PyTorch上也有Keras了,訓練模型告別Debug,只需專注數據和邏輯
    魚羊 發自 凹非寺量子位 報導 | 公眾號 QbitAI在開始一個新的機器學習項目時,難免要重新編寫訓練循環,加載模型,分布式訓練……然後在Debug的深淵裡看著時間譁譁流逝,而自己離項目核心還有十萬八千裡。
  • CNN 模型的可視化
    大家都了解卷積神經網絡 CNN,但是對於它在每一層提取到的特徵以及訓練的過程可能還是不太明白,所以這篇主要通過模型的可視化來神經網絡在每一層中是如何訓練的。我們知道,神經網絡本身包含了一系列特徵提取器,理想的 feature map 應該是稀疏的以及包含典型的局部信息。
  • PyTorch v1.1 重大更新,TensorBoard已加入豪華套餐
    隨著 PyTorch 1.0 版本在去年 12 月發布,它也支持了基於圖(Graph)的運行、前後端模塊間的無縫混合運行、分布式訓練、高效移動端部署等功能,此外還可以使用 PyTorch JIT(即時彙編)在圖模式和動態圖模式之間靈活切換。據 Facebook 介紹,許多企業已經把 AI 科研以及計算機視覺、對話系統、工業優化、自動駕駛等應用遷移到了 PyTorch 平臺上運行。
  • PyTorch實現TPU版本CNN模型
    本文演示了如何使用PyTorch和TPU實現深度學習模型,以加快訓練過程。在這裡,我們使用PyTorch定義了一個卷積神經網絡(CNN)模型,並在PyTorch/XLA環境中對該模型進行了訓練。XLA將CNN模型與分布式多處理環境中的Google Cloud TPU(張量處理單元)連接起來。在這個實現中,使用8個TPU核心來創建一個多處理環境。
  • 如何在PyTorch和TensorFlow中訓練圖像分類模型
    隨後,每個圖像都是28 x 28像素的正方形(總計784像素)。數據集的標準拆分用於評估和比較模型,其中60,000張圖像用於訓練模型,而單獨的10,000張圖像集用於測試模型。現在,我們也了解了數據集。因此,讓我們在PyTorch和TensorFlow中使用CNN構建圖像分類模型。我們將從PyTorch中的實現開始。
  • PyTorch可視化理解卷積神經網絡
    如果你是一個深度學習愛好者,你可能早已聽說過這種神經網絡,並且可能已經使用一些深度學習框架比如caffe、TensorFlow、pytorch實現了一些圖像分類器。然而,這仍然存在一個問題:數據是如何在人工神經網絡傳送以及計算機是如何從中學習的。為了從頭開始獲得清晰的視角,本文將通過對每一層進行可視化以深入理解卷積神經網絡。
  • 基於PyTorch的「Keras」:除了核心邏輯通通都封裝
    例如在 PyTorch 1.0 中,編譯工具 torch.jit 就包含一種名為 Torch Script 的語言,它是 Python 的子語言,開發者使用它能進一步對模型進行優化。用 PyTorch 寫模型,除了數據加載和模型定義部分外,整個訓練和驗證的邏輯、配置都需要我們手動完成,這些步驟都較為繁瑣。甚至可以說,研究者需要耗費相當多的精力處理這一部分的代碼,還要祈禱不出 Bug。
  • 雲計算學習:用PyTorch實現一個簡單的分類器
    主要流程分為以下三個部分:1,自定義生成一個訓練集,具體為在二維平面上的一些點,分為兩類;2,構建一個淺層神經網絡,實現對特徵的擬合,主要是明白在 pytorch 中網絡結構如何搭建;3,完成訓練和測試部分的工作,熟悉 pytorch 如何對網絡進行訓練和測試。1.
  • PyTorch中使用DistributedDataParallel進行多GPU分布式模型訓練
    在本入門教程中,我們將特別關注單機訓練(也稱為垂直擴展)。 即使在單主機,垂直擴展也是一個非常強大的工具。 如果在雲端,垂直擴展可讓您將深度學習訓練工作一直擴展到8xV100實例(例如AWS上的p3.16xlarge)。我們將在以後的博客文章中討論水平擴展和數據並行化。
  • Pytorch中的分布式神經網絡訓練
    經常,在訓練這些網絡時,深度學習從業人員需要使用多個GPU來有效地訓練它們。 在本文中,我將向您介紹如何使用PyTorch在GPU集群上設置分布式神經網絡訓練。通常,分布式訓練會在有一下兩種情況。在GPU之間拆分模型:如果模型太大而無法容納在單個GPU的內存中,則需要在不同GPU之間拆分模型的各個部分。跨GPU進行批量拆分數據。
  • PyTorch更新!谷歌幫助開發,正式支持TensorBoard | 5大開源項目
    不僅宣布支持TensorFlow的可視化工具TensorBoard,還正式向工業界邁進,為生產環境改進了PyTorch處理分布式訓練的方式。而且,根據Facebook介紹,開發這一版本的過程中谷歌還幫了不少忙。
  • 《PyTorch中文手冊》來了
    PyTorch 有許多優勢,如採用 Python 語言、動態圖機制、網絡構建靈活以及擁有強大的社群等。由於其靈活、動態的編程環境和用戶友好的界面,PyTorch 是快速實驗的理想選擇。visdomtensorboardx第三節 fastai第四節
  • Pytorch中的分布式神經網絡訓練|pytorch|bat|拆分|調用_網易訂閱
    通常,分布式訓練會在有一下兩種情況。  1. 在GPU之間拆分模型:如果模型太大而無法容納在單個GPU的內存中,則需要在不同GPU之間拆分模型的各個部分。  1.: if self.split_gpus: x = x.cuda(0) x = self.module1(x) if self.split_gpus: x = x.cuda(1) x = self.module2(x) return
  • PyTorch框架歷史和特性更迭與安裝過程
    PyTorch Hub的開發也是1.0版本的亮點之一,通過PyTorch Hub,用戶可以獲得一系列預訓練的深度學習模型,主要包括計算機視覺、自然語言處理、生成式模型和音頻模型等,這些預訓練模型的出現能有效地加快用戶開發新型的深度學習模型,方便用戶構建基線模型和復現深度學習模型的效果。
  • 使用PyTorch進行情侶幸福度測試指南
    圖像增強後數據示例我們決定使用ResNet模型作為DeepConnection的基礎網絡,在大型數據集ImageNet上預先訓練。通過預訓練,模型已經具有了一定的識別能力。我們所有的模型都借用PyTorch實現,我們使用Google Colab上的免費GPU資源進行訓練和測試。
  • Facebook技術分享:如何在PyTorch中訓練圖像分類模型
    下面我們將講解如何在PyTorch中訓練圖像分類模型。 隨後,每個圖像都是28 x 28像素的正方形(總計784像素)。數據集的標準拆分用於評估和比較模型,其中60,000張圖像用於訓練模型,而單獨的10,000張圖像集用於測試模型。
  • TensorFlow與PyTorch之爭,哪個框架最適合深度學習
    訓練過程有大量參數都與框架息息相關。舉個例子,如果你在 PyTorch 上訓練一個數據集,那麼你可以使用 GPU 來增強其訓練過程,因為它們運行在 CUDA(一種 C++ 後端)上。TensorFlow 也能使用 GPU,但它使用的是自己內置的 GPU 加速。因此,根據你所選框架的不同,訓練模型的時間也總是各不相同。
  • 可視化工具TensorBoard助你一臂之力
    選自Medium作者:Jithin Jayan機器之心編譯參與:魔王、張倩深度學習模型訓練中會出現各種各樣的問題,比如梯度消失、梯度爆炸,以及 Dying ReLU。那麼如何及時發現這些問題並找出解決方案呢?本文以 Dying ReLU 問題為例,介紹了如何使用可視化工具 TensorBoard 發現該問題,並提供了不同解決思路。
  • 新版PyTorch 1.2 已發布:功能更多、兼容更全、操作更快!
    除了這些新功能之外,用戶對 TensorBoard(https://pytorch.org/docs/stable/tensorboard.html)的使用也更便捷,現在只需輸入代碼「from torch.utils.tensorboard import SummaryWriter」,即可開始使用。
  • Pytorch 1.1.0駕到!小升級大變動,易用性更強,支持自定義RNN
    新智元原創 來源:pytorch.org、GitHub編輯:金磊【新智元導讀】盼望已久,Pytorch終於更新了!Pytroch 1.1.0的發布除了修復了已有bug之外,最大的亮點就是可以更快、更好的支持自定義RNN,以及TensorBoard對可視化和模型調試提供了一流的本地支持。