【小白學(xué)PyTorch】14.tensorboardX可視化教程
小白學(xué)PyTorch | 13 EfficientNet詳解及PyTorch實(shí)現(xiàn)
小白學(xué)PyTorch | 12 SENet詳解及PyTorch實(shí)現(xiàn)
小白學(xué)PyTorch | 11 MobileNet詳解及PyTorch實(shí)現(xiàn)
小白學(xué)PyTorch | 10 pytorch常見(jiàn)運(yùn)算詳解
小白學(xué)PyTorch | 9 tensor數(shù)據(jù)結(jié)構(gòu)與存儲(chǔ)結(jié)構(gòu)
小白學(xué)PyTorch | 8 實(shí)戰(zhàn)之MNIST小試牛刀
小白學(xué)PyTorch | 7 最新版本torchvision.transforms常用API翻譯與講解
小白學(xué)PyTorch | 6 模型的構(gòu)建訪問(wèn)遍歷存儲(chǔ)(附代碼)
小白學(xué)PyTorch | 5 torchvision預(yù)訓(xùn)練模型與數(shù)據(jù)集全覽
小白學(xué)PyTorch | 4 構(gòu)建模型三要素與權(quán)重初始化
小白學(xué)PyTorch | 3 淺談Dataset和Dataloader
小白學(xué)PyTorch | 2 淺談?dòng)?xùn)練集驗(yàn)證集和測(cè)試集
小白學(xué)PyTorch | 1 搭建一個(gè)超簡(jiǎn)單的網(wǎng)絡(luò)
小白學(xué)PyTorch | 動(dòng)態(tài)圖與靜態(tài)圖的淺顯理解
參考目錄:
1 安裝
2 標(biāo)量可視化
3 權(quán)重直方圖
4 特征圖可視化
5 模型圖的可視化
6 卷積核的可視化
本章節(jié)來(lái)初次使用tensorboard來(lái)可視化pytorch深度學(xué)習(xí)中的一些內(nèi)容,主要可視化的內(nèi)容包括:標(biāo)量變化(模型損失、準(zhǔn)確率等);權(quán)重值的直方圖;特征圖的可視化;模型圖的可視化;卷積核的可視化。
其實(shí)tensorboard一開(kāi)始是給tensorflow使用的可視化工具,PyTorch框架自己的可視化工具是Visdom,但是這個(gè)API需要設(shè)置的參數(shù)過(guò)于復(fù)雜,而且功能不太方便也不強(qiáng)大,所以有人寫(xiě)了一個(gè)庫(kù)函數(shù)TensorboardX來(lái)讓PyTorch也可以使用tensorboard。
1 安裝
安裝非常的簡(jiǎn)單,直接需要安裝tensorboardX,tensorboard和tensorflow三個(gè)庫(kù)函數(shù):
#?控制臺(tái)運(yùn)行
pip?install?tensorboardX
pip?install?tensorboard
pip?install?tensorflow
這時(shí)候我們就已經(jīng)安裝完成了。
2 標(biāo)量可視化
這里我是用的是第8課的MNIST作為基本代碼,然后在其中增加可視化的功能。
先導(dǎo)入庫(kù)函數(shù)
#?導(dǎo)入可視化模塊
from?tensorboardX?import?SummaryWriter
writer?=?SummaryWriter('../result_tensorboard')
這里面的writer就是我們要記錄的一個(gè)寫(xiě)入tensorboard的一個(gè)接口。這個(gè)../result_tensorboard就是數(shù)據(jù)保存的具體位置。
????for?batch_idx,?(data,?target)?in?enumerate(train_loader):
????????#...省略一些代碼...
????????if?(batch_idx?+?1)?%?50?==?0:
????????????print('Train?Epoch:?{}?[{}/{}?({:.0f}%)]\tLoss:?{:.6f}'.format(
????????????????epoch,?(batch_idx?+?1)?*?len(data),?len(train_loader.dataset),
???????????????????????100.?*?(batch_idx?+?1)?/?len(train_loader),?loss.item()))
????????????writer.add_scalar('loss',loss.item(),tensorboard_ind)
????????????tensorboard_ind?+=?1
關(guān)鍵就是writer.add_scalar(),其中有三個(gè)關(guān)鍵的參數(shù):
def add_scalar(self, tag, scalar_value, global_step):
tag就是一個(gè)字符串吧,在上面的代碼中,我是每50個(gè)batch記錄一次loss的值,所以這個(gè)tag就是'loss': scalar_value就是這一次記錄的標(biāo)量了,上面記錄的就是 loss.item()。這個(gè)loss的變化應(yīng)該會(huì)輸出一個(gè)折線圖的吧,這個(gè)scalar_value就是y軸的值;global_step其實(shí)就是折線圖的x軸的值,所以我每記錄一個(gè)點(diǎn)就把 tensorboard_ind加一。
運(yùn)行上面的代碼,會(huì)生成這樣的一個(gè)文件:
這個(gè)events.out.巴拉巴拉這個(gè)文件就是代碼中保存的標(biāo)量,我們需要在控制臺(tái)啟動(dòng)tensorboard來(lái)可視化:
tensorboard?--logdir==D:\Kaggle\result_tensorboard
這個(gè)--logdir=后面跟上之前writer定義的時(shí)候的那個(gè)地址,也就是../result_tensorboard,然后運(yùn)行。
運(yùn)行結(jié)果為:
點(diǎn)擊上圖中的藍(lán)色字體,會(huì)彈出一個(gè)網(wǎng)頁(yè),這個(gè)網(wǎng)頁(yè)就是tensorboald的可視化面板。

從圖中可以看到一個(gè)標(biāo)量的折線圖,就是我們的loss。
3 權(quán)重直方圖
增加部分代碼,目的是在每一個(gè)epoch訓(xùn)練完成之后,記錄一次模型每一層的參數(shù)直方圖。
n_epochs?=?5
for?epoch?in?range(n_epochs):
????train(epoch,epoch?*?len(train_loader))
????#?每一個(gè)epoch之后輸出網(wǎng)絡(luò)中每一層的權(quán)重值的直方圖
????for?i,?(name,?param)?in?enumerate(model.named_parameters()):
????????if?'bn'?not?in?name:
????????????writer.add_histogram(name,?param,?epoch)
運(yùn)行結(jié)束之后依然是一個(gè)名字很長(zhǎng)的數(shù)據(jù)文件,我們?cè)趖ensorboard中運(yùn)行這個(gè)文件,展示出直方圖變化,上面的代碼是記錄了一個(gè)網(wǎng)絡(luò)中所有層的權(quán)重值直方圖,在具體任務(wù)中,可以只需要輸出某一些層的權(quán)重直方圖即可。
4 特征圖可視化
在代碼中的train函數(shù)內(nèi),增加了這樣一段代碼:
#?第一個(gè)batch記錄數(shù)據(jù)
if?batch_idx?==?0:
????out1?=?model.features1(data[0:1,:,:,:])
????out2?=?model.features(out1)
????grid1?=?make_grid(out1.view(-1,1,out1.shape[2],out1.shape[3]),?nrow=8)
????grid2?=?make_grid(out2.view(-1,1,out1.shape[2],out1.shape[3]),?nrow=8)
????writer.add_image('features1',?grid1,?global_step=epoch)
????writer.add_image('features',?grid2,?global_step=epoch)
就是讓第一個(gè)batch的第一個(gè)樣本放到模型中,然后把卷積輸出的特征圖輸出成out1和out2,然后使用torchvision.utils.make_grid函數(shù)把特征圖變成網(wǎng)格的形式。然后寫(xiě)道writer里面,標(biāo)簽是'features1'和'features'。
運(yùn)行tensorboard結(jié)果:
在features1中可以比較明顯的看到32個(gè)‘6’的圖片,這個(gè)是一個(gè)樣本的特征圖的32個(gè)通道的展示,上面的那個(gè)feature在檢查代碼之后,雖然看起來(lái)是4個(gè)圖片,但是其實(shí)是64個(gè)通道,只是每個(gè)特征圖都很小所以看起來(lái)比較模糊和迷惑。這也是因?yàn)镸NIST數(shù)據(jù)集中是28尺寸的輸入圖片,對(duì)于Imagenet的大圖片一般都蠶蛹224或者448像素的輸入,就會(huì)好一些。
總之這是特征圖的展示。我專門(mén)錄了一個(gè)這個(gè)tensorboard的GIF展示。
5 模型圖的可視化
這個(gè)非常的簡(jiǎn)單:
model?=?Net().to(device)
writer.add_graph(model,?torch.rand([1,3,28,28]))
這里呢有一個(gè)問(wèn)題,就是自己定義的模型結(jié)構(gòu)會(huì)顯示不出來(lái)。目前在網(wǎng)上搜索過(guò)但是沒(méi)有比較好的解決方案,所以這里就不作模型的可視化了。對(duì)于部分官方提供的模型是可以可視化的,下面展示的是官方可視化的效果:
其實(shí)個(gè)人感覺(jué),這個(gè)模型結(jié)構(gòu)可視化的結(jié)果也不是非常的好看。而且對(duì)于模型可視化的結(jié)果還有其他的辦法,所以不用tensorboard也罷。tensorboard來(lái)可視化loss,特征圖等的功能也足夠了。
6 卷積核的可視化
#?卷積核的可視化
for?idx,?(name,?m)?in?enumerate(model.named_modules()):
????if?name?==?'features1':
????????print(m.weight.shape)
????????in_channels?=?m.weight.shape[1]
????????out_channels?=?m.weight.shape[0]
????????k_w,k_h?=?m.weight.shape[3],m.weight.shape[2]
????????kernel_all?=?m.weight.view(-1,?1,?k_w,?k_h)??#?每個(gè)通道的卷積核
????????kernel_grid?=?make_grid(kernel_all,??nrow=in_channels)
????????writer.add_image(f'{name}_kernel',?kernel_grid,?global_step=epoch)
這個(gè)個(gè)也比較好理解,之前的關(guān)于卷積的基礎(chǔ)知識(shí),模型的遍歷都講過(guò)了,所以這里相信大家都沒(méi)有什么比較難理解的地方了。
運(yùn)行結(jié)果:
這里就非常的好奇,怎么設(shè)置才可以讓這個(gè)圖像不那么的糊
今天的講解到此為止。代碼已經(jīng)在后臺(tái)更新。
- END -往期精彩回顧
獲取一折本站知識(shí)星球優(yōu)惠券,復(fù)制鏈接直接打開(kāi):
https://t.zsxq.com/662nyZF
本站qq群704220115。
加入微信群請(qǐng)掃碼進(jìn)群(如果是博士或者準(zhǔn)備讀博士請(qǐng)說(shuō)明):
