欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Pytorch中使用TensorBoard詳情

 更新時(shí)間:2022年06月30日 16:40:53   作者:鴻神  
這篇文章主要介紹了Pytorch中使用TensorBoard詳情,TensorBoard的前段數(shù)據(jù)顯示和后端數(shù)據(jù)記錄是異步I/O的,即后端程序?qū)?shù)據(jù)寫入到一個(gè)文件中,而前端程序讀取文件中的數(shù)據(jù)來進(jìn)行顯示

本文記錄了如何在Pytorch中使用Tensorboard(主要是為了備忘)

前言

雖然我本身就會(huì)用TensorBoard,但是因?yàn)門ensorBoard只有在寫訓(xùn)練代碼的框架的時(shí)候才會(huì)寫,因此實(shí)際上寫的頻率的還是很低的,所以我每次要寫訓(xùn)練代碼、使用TensorBoard的時(shí)候都需要看自己之前寫的代碼,或者查一下別人寫的博客。而且不少博客寫的都是一鱗半爪的,不少用法都要查很多博客,久而久之就會(huì)覺得很煩。而且很多技巧隨著時(shí)間的流逝也逐漸的忘記。

因此為了方便以后自己的查詢(備忘),同時(shí)也是能夠留下一個(gè)不錯(cuò)的教程,因此決定自己寫一個(gè)比較全面的TensorBoard的教程。

一、 Introduction to TensorBoard

在煉丹的時(shí)候,經(jīng)常需要追蹤模型在訓(xùn)練過程中性能的變化,例如:Regression任務(wù)中的MSE、分類任務(wù)中的準(zhǔn)確率、生成(圖片)任務(wù)中圖片的生成質(zhì)量、此外還有合成語音的質(zhì)量……

大體上來說,所有需要追蹤的數(shù)據(jù)包括:標(biāo)量(scalar)、圖像(image)、統(tǒng)計(jì)圖(diagram)、視頻(video)、音頻(audio)、文本(text)、Embedding等等

除了有大量的數(shù)據(jù)需要追蹤外,我們還需要很好的把這些數(shù)據(jù)顯示出來,即數(shù)據(jù)的寫入和顯示(讀?。┮挟惒絀O,有的時(shí)候服務(wù)器在學(xué)校的機(jī)房托管,因此還需要能夠通過內(nèi)網(wǎng)提供可視化……

因此,在種種需求之下,使用一個(gè)網(wǎng)頁程序來幫助我們進(jìn)行數(shù)據(jù)的追蹤就成了一個(gè)很好的解決方案。具體來說,網(wǎng)頁程序?qū)崿F(xiàn)了前后端的分離,后端只需要專注于數(shù)據(jù)的記錄,而前端專注于數(shù)據(jù)的顯示。此外,網(wǎng)頁程序可以進(jìn)一步擴(kuò)展,提供網(wǎng)絡(luò)服務(wù)。

因此,就有了TensorBoard這個(gè)網(wǎng)頁程序?qū)崿F(xiàn)了我們上面的需求。TensorBoard最早是TensorFlow中的模塊,不過現(xiàn)在經(jīng)過Pytorch團(tuán)隊(duì)的努力,TensorBoard已經(jīng)集成到了Pytorch中。

TensorBoard的教程主要分為兩部分,一部分是如何使用TensorBoard(即在訓(xùn)練過程中添加數(shù)據(jù),然后在瀏覽器中監(jiān)視訓(xùn)練的這整個(gè)pipeline)的教程,另外一部分是TensorBoard如何添加不同種類數(shù)據(jù)(即TensorBoard的API)的教程

二、TensoBoard Pipeline

上面說道,TensorBoard是分為前段顯示和后端數(shù)據(jù)記錄的,因此其Pipeline也分為兩步:

第一步:后端數(shù)據(jù)記錄第二步:前段查看數(shù)據(jù)

三、后端數(shù)據(jù)記錄

類似于FlaskDjango中把后端程序(服務(wù)器)被抽象為了一個(gè)類,然而這個(gè)類中提供了方法來開啟和關(guān)閉服務(wù),TensorBoard中也是把后端服務(wù)器抽象成了一個(gè)類:SummaryWriter,不過不同的是,TensorBoard中的SummaryWriter類在被聲明后就開啟了對(duì)應(yīng)的服務(wù),直到我們使用了SummaryWriter關(guān)閉服務(wù)的API。

此外,還有一個(gè)不同的之處在于,TensorBoard的前段數(shù)據(jù)顯示和后端數(shù)據(jù)記錄是異步I/O的,即后端程序(SummaryWriter類的實(shí)例)將數(shù)據(jù)寫入到一個(gè)文件中,而前端程序讀取文件中的數(shù)據(jù)來進(jìn)行顯示。因此后端所謂的服務(wù)指的就是數(shù)據(jù)的記錄,而非提供前端的顯示。數(shù)據(jù)記錄的實(shí)現(xiàn)方式即通過SummaryWriter類中的方法

然后在開啟了后端程序的服務(wù)器之后,我們就可以通過各種API來添加數(shù)據(jù)了

導(dǎo)入包:

我們首先導(dǎo)入包

import torch
from torch.utils.tensorboard import SummaryWriter

1. SummaryWriter類

SummaryWriter聲明之后就會(huì)開啟后端數(shù)據(jù)記錄的服務(wù),因此在實(shí)例化該類的時(shí)候我們就需要保存數(shù)據(jù)的位置。聲明保存數(shù)據(jù)的位置有好幾種方式

SummaryWriter的簽名如下:

class torch.utils.tensorboard.writer.SummaryWriter(log_dir=None, comment='', purge_step=None, max_queue=10, flush_secs=120, filename_suffix='')

其中:

  • log_dir (str):指定了數(shù)據(jù)保存的文件夾的位置,如果該文件夾不存在則會(huì)創(chuàng)建一個(gè)出來。如果沒有指定的話,默認(rèn)的保存的文件夾是./runs/現(xiàn)在的時(shí)間_主機(jī)名,例如:Feb04_22-42-47_Alienware,因此每次運(yùn)行之后都會(huì)創(chuàng)建一個(gè)新的文件夾。在寫論文的時(shí)候我們會(huì)涉及一系列實(shí)驗(yàn),從不同的角度來說明一些問題,例如我們的假設(shè)是否正確、模型性能是否更好……因此最好不要用默認(rèn)的實(shí)現(xiàn)來直接作為存放數(shù)據(jù)的文件夾,而是使用具有含義的二級(jí)結(jié)構(gòu),例如:runs/exp1。這樣的話,所有的實(shí)驗(yàn)1的數(shù)據(jù)都在這個(gè)文件夾下,這樣我們就可以方便的進(jìn)行比較。
  • comment (string):給默認(rèn)的log_dir添加的后綴,如果我們已經(jīng)指定了log_dir具體的值,那么這個(gè)參數(shù)就不會(huì)有任何的效果
  • purge_step (int):TensorBoard在記錄數(shù)據(jù)的時(shí)候有可能會(huì)崩潰,例如在某一個(gè)epoch中,進(jìn)行到第 T + X T+X T+X個(gè)step的時(shí)候由于各種原因(內(nèi)存溢出)導(dǎo)致崩潰,那么當(dāng)服務(wù)重啟之后,就會(huì)從 T T T個(gè)step重新開始將數(shù)據(jù)寫入文件,而中間的 X X X,即purge_step指定的step內(nèi)的數(shù)據(jù)都被被丟棄。
  • max_queue (int):在記錄數(shù)據(jù)的時(shí)候,在內(nèi)存中開的隊(duì)列的長(zhǎng)度,當(dāng)隊(duì)列慢了之后就會(huì)把數(shù)據(jù)寫入磁盤(文件)中。
  • flush_secs (int):以秒為單位的寫入磁盤的間隔,默認(rèn)是120秒,即兩分鐘。
  • filename_suffix (string):添加到log_dir中每個(gè)文件的后綴。更多文件名稱設(shè)置要參考tensorboard.summary.writer.event_file_writer.EventFileWriter類。

因此,一個(gè)成熟的數(shù)據(jù)記錄方式就是在runs文件夾下按照一定的意義來劃分二級(jí)文件夾,例如網(wǎng)絡(luò)結(jié)構(gòu)1、網(wǎng)絡(luò)結(jié)構(gòu)2、實(shí)驗(yàn)1實(shí)驗(yàn)2等等。

2. 添加數(shù)據(jù)

想后端服務(wù)程序添加數(shù)據(jù)使用的是SummaryWriter類中的一系列方法,這些方法都以add_開頭,例如:add_scalar、add_scalarsadd_image……具體來說,所有的方法有:

import pprint
pprint.pprint([i for i in SummaryWriter.__dict__.keys() if i.startwith("add_")])

add_hparams,add_scalar,add_scalars,add_histogram,add_histogram_raw,add_image,add_images,add_image_with_boxes,add_figure,add_video,add_audio,add_text,add_onnx_graph,add_graph,add_embedding,add_pr_curve,add_pr_curve_raw,add_custom_scalars_multilinechart,add_custom_scalars_marginchart,add_custom_scalars,add_mesh

后面在第二部分會(huì)詳細(xì)的講解每個(gè)方法,這里先講共性。

每個(gè)方法根據(jù)需要添加的數(shù)據(jù)的不同,方法中具體的參數(shù)也不同,但是所有的方法終歸都是要添加數(shù)據(jù)的,因此會(huì)存在相同的參數(shù)。具體來說,相同的參數(shù)包括:

  • tag (str):用于給數(shù)據(jù)進(jìn)行分類的標(biāo)簽,標(biāo)簽中可以包含父級(jí)和子級(jí)標(biāo)簽。例如給訓(xùn)練的loss以loss/train的tag,而給驗(yàn)證以loss/val的tag,這樣的話,最終的效果就是訓(xùn)練的loss和驗(yàn)證的loss都被分到了loss這個(gè)父級(jí)標(biāo)簽下。而trainval則是具體用于區(qū)分兩個(gè)參數(shù)的標(biāo)識(shí)符(identifier)。例如我們現(xiàn)在有兩個(gè)tag,cos/densecos/sparse,那么最終展示下來的效果是這樣的。此外,只支持二級(jí)標(biāo)簽

  • globa_step (int):首先,每個(gè)epoch中我們都會(huì)更新固定的step。因此,在一個(gè)數(shù)據(jù)被加入的時(shí)候,有兩種step,第一種step是數(shù)據(jù)被加入時(shí)當(dāng)前epoch已經(jīng)進(jìn)行了多少個(gè)step,第二種step是數(shù)據(jù)被加入時(shí)候,累計(jì)(包括之前的epoch)已經(jīng)進(jìn)行了多少個(gè)step。而考慮到我們?cè)诶L圖的時(shí)候往往是需要觀察所有的step下的數(shù)據(jù)的變化,因此global_step指的就是當(dāng)前數(shù)據(jù)被加入的時(shí)候已經(jīng)計(jì)算了多少個(gè)step。計(jì)算global_step的步驟很簡(jiǎn)單,就是 g l o b a l _ s t e p = e p o c h ∗ l e n ( d a t a l o a d e r ) + c u r r e n t _ s t e p global\_step=epoch * len(dataloader) + current\_step global_step=epoch∗len(dataloader)+current_step
  • wlltime (int):從SummaryWriter實(shí)例化開始到當(dāng)前數(shù)據(jù)被加入時(shí)候所經(jīng)歷時(shí)間(以秒計(jì)算),默認(rèn)是使用time.time()來自動(dòng)計(jì)算的,當(dāng)然我們也可以指定這個(gè)參數(shù)來進(jìn)行修改。這個(gè)參數(shù)一般不改

以添加標(biāo)量(add_scalar)為例,演示一下添加數(shù)據(jù)的方法的用法。其他的方法第二部分會(huì)講

writer = SummaryWriter()
for epoch in range(n_epoch := 10):
    for step in range(total_step := 100):
        # 訓(xùn)練代碼讀取數(shù)據(jù)來進(jìn)行顯示。
        # ...
        # ...

        # 計(jì)算 loss
        loss = np.sin(step * 0.01)
        # 添加標(biāo)量
        writer.add_scalar(tag="loss/train", scalar_value=loss,
                          global_step=epoch * total_step + step)

然后可以看到的效果如下:

3. 關(guān)閉SummaryWriter

我們剛才說過,SummaryWriter這樣的后端程序在被實(shí)例化出來就自動(dòng)開啟了數(shù)據(jù)記錄的服務(wù),而我們?cè)谕瓿闪怂械臄?shù)據(jù)記錄只有,需要關(guān)閉服務(wù)。

關(guān)閉服務(wù)很簡(jiǎn)單,就是直接調(diào)用close方法即可

writer.close()

4. Summary

最終,總結(jié)一下整個(gè)后端數(shù)據(jù)記錄的流程,其實(shí)就三步:

實(shí)例化SummaryWriter類,同時(shí)指定數(shù)據(jù)保存的文件夾利用SummaryWriter類提供的方法,添加不同類型的的數(shù)據(jù)關(guān)閉SummaryWriter類,中止服務(wù)

四、前端顯示數(shù)據(jù)

因?yàn)門ensorBoard是異步I/O的網(wǎng)頁服務(wù)程序,因此后端程序在把數(shù)據(jù)寫入到文件的時(shí)候,前端程序可以讀取數(shù)據(jù)來進(jìn)行顯示。

具體來說,后端數(shù)據(jù)記錄程序會(huì)把所有的數(shù)據(jù)記錄到同一個(gè)文件夾下的多個(gè)文件內(nèi),以方便前端顯示程序多線程加速讀取。因此,前端顯示程序在啟動(dòng)的時(shí)候需要指定讀取的文件夾

1. 默認(rèn)使用

前端顯示程序提供了CLI(命令行)界面,因此我們直接在命令行啟動(dòng)就行了

tensorboard --logdir=數(shù)據(jù)文件夾

其中數(shù)據(jù)文件夾就是在聲明SummaryWriter時(shí)候指定的文件夾。

例如:

tensorboard --logdir=./Feb05_01-00-48_Alienware/

而在我們啟動(dòng)前端顯示程序之后,就會(huì)得到一個(gè)端口,訪問這個(gè)端口就能看到顯示的效果

訪問該端口就能看到程序:

2. 修改端口

有的時(shí)候,在服務(wù)器上訓(xùn)練模型的時(shí)候?yàn)榱吮苊夂蛣e人的TensorBoard的端口撞了,我們需要指定新的端口?;蛘哂械臅r(shí)候我們?cè)赿ocker容器里跑TensorBoard,我們通過一個(gè)端口映射到主機(jī)上去,這個(gè)時(shí)候就需要指定TensorBoard使用特定的端口。

具體來說就是通過CLI的--port參數(shù)

tensorboard --logdir=數(shù)據(jù)文件夾 --port=端口

例如我們現(xiàn)在指定上面的例子端口為10000

tensorboard --logdir=./Feb05_01-00-48_Alienware/ --port=10000

五、Summary

最后,總結(jié)一下使用TensorFlow的Pipeline,首先在訓(xùn)練的過程中使用SummaryWriter來記錄數(shù)據(jù),記錄的過程中需要注意文件夾需要來合理的劃分。

然后我們?cè)谇岸瞬榭吹臅r(shí)候,運(yùn)行tensorboard的CLI程序即可,一般用的最多的就是--log_dir--port兩個(gè)參數(shù)。

此外,如果是服務(wù)器上的話,那么tensorboard的CLI運(yùn)行在服務(wù)器上,然后在自己的電腦上,利用瀏覽器,通過內(nèi)網(wǎng)來查看訓(xùn)練過程。

1. SummaryWriter APIs

上面講完了SummaryWriter的Workflow/Pipeline,剩下的就是SummaryWriter添加數(shù)據(jù)的API的講解了。關(guān)于這些API的話,正如上面介紹的,他們都以add_開頭,具體有:

標(biāo)量類:add_scalar、add_scalars、add_custom_scalars、add_custom_scalars_marginchart、add_custom_scalars_multilinechart

數(shù)據(jù)顯示類:

  • 圖像:add_image、add_images、add_image_with_boxes、add_figure
  • 視頻:add_video
  • 音頻:add_audio
  • 文本:add_text
  • ???????Embedding:add_embedding
  • ???????點(diǎn)云:add_mesh

統(tǒng)計(jì)圖:add_histogram、add_histogram_raw、add_pr_curve、add_pr_curve_raw

網(wǎng)絡(luò)圖:add_onnx_graph、add_graph

???????超參數(shù)圖:add_hparams

因?yàn)槲夷壳爸饕谧鯟V、點(diǎn)云和NLP,對(duì)于語音、視頻設(shè)計(jì)的比較少,因此關(guān)于這些API以后用到了我再慢慢補(bǔ)充。

其實(shí)主要就是對(duì)官網(wǎng)上的翻譯,可以直接看官網(wǎng)上的介紹:https://pytorch.org/docs/stable/tensorboard.html

到此這篇關(guān)于Pytorch中使用TensorBoard詳情的文章就介紹到這了,更多相關(guān)Pytorch TensorBoard內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python(Tornado)模擬登錄小米搶手機(jī)

    Python(Tornado)模擬登錄小米搶手機(jī)

    用Python(Tornado)模擬登錄小米帳號(hào),搶小米手機(jī)
    2013-11-11
  • Python中的CSV文件使用

    Python中的CSV文件使用"with"語句的方式詳解

    with語句的主要用法是對(duì)語句中使用的對(duì)象進(jìn)行異常安全的清除.確保文件已關(guān)閉,鎖定已釋放,上下文恢復(fù)等.本文通過實(shí)例代碼給大家介紹Python中的CSV文件使用"with"語句的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2018-10-10
  • python根據(jù)出生日期返回年齡的方法

    python根據(jù)出生日期返回年齡的方法

    這篇文章主要介紹了python根據(jù)出生日期返回年齡的方法,實(shí)例分析了Python時(shí)間操作的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-03-03
  • 詳細(xì)介紹Python語言中的按位運(yùn)算符

    詳細(xì)介紹Python語言中的按位運(yùn)算符

    這篇文章主要介紹了Python語言中的按位運(yùn)算符,有需要的朋友可以參考一下
    2013-11-11
  • opencv實(shí)現(xiàn)回形遍歷像素算法

    opencv實(shí)現(xiàn)回形遍歷像素算法

    這篇文章主要為大家詳細(xì)介紹了opencv實(shí)現(xiàn)回形遍歷像素算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • Python實(shí)現(xiàn)的rsa加密算法詳解

    Python實(shí)現(xiàn)的rsa加密算法詳解

    這篇文章主要介紹了Python實(shí)現(xiàn)的rsa加密算法,結(jié)合完整實(shí)例形式分析了Python實(shí)現(xiàn)rsa加密算法的原理、步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • 解決python字典對(duì)值(值為列表)賦值出現(xiàn)重復(fù)的問題

    解決python字典對(duì)值(值為列表)賦值出現(xiàn)重復(fù)的問題

    今天小編就為大家分享一篇解決python字典對(duì)值(值為列表)賦值出現(xiàn)重復(fù)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Pytorch在NLP中的簡(jiǎn)單應(yīng)用詳解

    Pytorch在NLP中的簡(jiǎn)單應(yīng)用詳解

    今天小編就為大家分享一篇Pytorch在NLP中的簡(jiǎn)單應(yīng)用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • Python稀疏矩陣及參數(shù)保存代碼實(shí)現(xiàn)

    Python稀疏矩陣及參數(shù)保存代碼實(shí)現(xiàn)

    這篇文章主要介紹了Python稀疏矩陣及參數(shù)保存代碼實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • python驗(yàn)證碼圖片處理(二值化)

    python驗(yàn)證碼圖片處理(二值化)

    這篇文章主要介紹了python驗(yàn)證碼圖片處理(二值化),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11

最新評(píng)論