最近復現的一篇論文一直都難以work,上了特徵圖可視化後一下子就找到了問題所在,所以今天想梳理一下PyTorch裡面的特徵圖可視化。
大家都知道Tensorflow有一款非常優秀的可視化工具Tensorboard,而PyTorch自身沒有可視化功能,但是我們可以尋找替代品,即TensorBoardX。安裝過程不多介紹,詳見下面的參考連結,裡面相應有比較豐富的介紹。
tensor-yu/PyTorch_Tutorial
https://github.com/tensor-yu/PyTorch_Tutorial
最常見的可視化就是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/editorPyTorch等網絡的可視化工具
https://github.com/waleedka/hiddenlayer
大概是這麼個效果,相對清晰一些
想要了解更多資訊,請掃描下方二維碼,關注機器學習研究會
轉自:極市平臺