編者按:去年,FaceBook AI和Google AI分別釋出了Pytorch1.0和TensorFlow2.0,這兩大深度學習框架抉擇問題又被抬出來了!之前Pytorch最被人詬病的就是視覺化問題和部署問題,今天,我們來聊一聊Pytorch的訓練視覺化問題!
文章作者:Teddy Zhang
責任編輯:Teddy Zhang
文章發表於 微信公眾號【運籌OR帷幄】: 【AI】精妙的Pytorch訓練視覺化工具tensorboardX
開源教程地址:
Pytorch框架也有自己的視覺化軟體--Visdom,但是我用著不太習慣,感覺它的API也不太方便,引數設定過於複雜,而且視覺化的功能性並不是太強,所以有人就寫個庫用來將Pytorch中的引數放到tensorboard上面進行視覺化,十分方便!
tensorboadX
pip install tensorboardX
pip install tensorboard
pip install tensorflow
注意 :numpy的版本要對應,否則會報錯,如果不匹配,那就進行更新或者新建虛擬環境了!作者的Pytorch1.0的環境都不能使用,所以就把tensorboard裝到其他環境,不影響使用的~
在程式中設定視覺化資料檔案的路徑,然後在其資料夾輸入指令(. 表示本資料夾):
tensorboard --logdir=.
網路訓練(Cifar10)
首先,我使用了非官方的程式碼對Cifar10進行訓練,類似於ResNet, 由於Cifar10中的圖片尺寸都很小,大約32x32,所以我們對傳統的resnet進行了修改,其網路結構如下:
參考於官方的ResNet18並做如下修改:
● 由於畫素太小,修改第一個卷積核步長為1,不進行下采樣
● 修改通道,讓通道變小些
● 刪除layer4,不用再繼續降取樣了
然後進行模型訓練,訓練程式碼如下:
最後我們得到模型,精度為:0.78左右,沒有一直進行訓練,這無所謂!!
TensorBoardX視覺化
參考了一開始的那個程式碼庫,我把視覺化的工作分成了如下幾個:
卷積核的視覺化feature map的視覺化模型圖的視覺化標量變化情況的視覺化權重的直方圖的視覺化(可以知道權重的資料分佈)
那麼,話不多說,我們來看看如何進行視覺化的把,首先把tensorboardX匯入並進行初始化:
第一個任務:標量視覺化與權重直方圖
這個權重直方圖,非常的關鍵,特別是尋找模型訓練loss出現的各種問題,由於我是在測試時畫的圖,所以只有一幅,但一般我們在訓練階段使用,用於尋找模型的問題~~
任務程式碼:
效果圖:
第二個任務:feature map的視覺化和卷積核的視覺化
add_image(tag, img_tensor, global_step=None, walltime=None) 繪製圖片
torchvision.utils.make_grid(tensor,nrow=8,padding=2, normalize=False, ra nge=None, scale_each=False, pad_value=0) 製作網格用於顯示
我們把每個卷積層後的feature map來進行視覺化,一共有4個卷積層,所以我們將 要繪製4個階段的feature map,由於我們的模型已經訓練好了,所以視覺化出來的feature map可以很好地解釋我們訓練出來的模型到底是什麼,每個卷積層提取的特徵是什麼?當然只能部分解釋!!!
任務程式碼:
效果圖:
(原圖)
我們可以清晰的看到,在網路的底層,我們可以看到船的邊緣特徵,由於歸一化了,所以色彩特徵不太明顯,當然也可以不進行歸一化,但是layer3這種高層特徵我們就能以解釋了,它代表更多的是語義特徵,很抽象!
卷積核的視覺化與這個類似,其實質也就是權重視覺化,程式碼如下:
效果圖(conv層和layer 1層):
第三個任務:feature map的視覺化和卷積核的視覺化
這個不知道為什麼,我使用Pytorch自帶的網路模型就沒有問題,但是自己定義的網路進行模型圖顯示就會出現一些莫名其妙的問題,有大佬知道的請告知原因啊!這裡面我們使用ResNet18的結構來進行視覺化,很簡單,就一句話:
效果圖:
總結
再次感謝首頁大佬的開源教程,讓我學到了很多,透過這些視覺化的工作,我們就可以更好的去觀測和調控這個模型的訓練過程了!模型圖視覺化的問題,有人知道還請告知啊!