<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>

          【小白學(xué)PyTorch】14.tensorboardX可視化教程

          共 4469字,需瀏覽 9分鐘

           ·

          2020-09-26 22:54

          <<小白學(xué)PyTorch>>

          小白學(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,tensorboardtensorflow三個(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ō)明):

          瀏覽 51
          點(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>
                  大香蕉综合第一页 | 欧美黑人大屌日屄 | 国际精品一级视频 | 免费看无码人妻AⅤ片 | 激情国产福利 |