您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“Pytorch中怎么使用TensorBoard”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Pytorch中怎么使用TensorBoard”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
在煉丹的時候,經常需要追蹤模型在訓練過程中性能的變化,例如:Regression任務中的MSE、分類任務中的準確率、生成(圖片)任務中圖片的生成質量、此外還有合成語音的質量……
大體上來說,所有需要追蹤的數據包括:標量(scalar)、圖像(image)、統計圖(diagram)、視頻(video)、音頻(audio)、文本(text)、Embedding等等
除了有大量的數據需要追蹤外,我們還需要很好的把這些數據顯示出來,即數據的寫入和顯示(讀取)要有異步IO,有的時候服務器在學校的機房托管,因此還需要能夠通過內網提供可視化……
因此,在種種需求之下,使用一個網頁程序來幫助我們進行數據的追蹤就成了一個很好的解決方案。具體來說,網頁程序實現了前后端的分離,后端只需要專注于數據的記錄,而前端專注于數據的顯示。此外,網頁程序可以進一步擴展,提供網絡服務。
因此,就有了TensorBoard這個網頁程序實現了我們上面的需求。TensorBoard最早是TensorFlow中的模塊,不過現在經過Pytorch團隊的努力,TensorBoard已經集成到了Pytorch中。
TensorBoard的教程主要分為兩部分,一部分是如何使用TensorBoard(即在訓練過程中添加數據,然后在瀏覽器中監視訓練的這整個pipeline)的教程,另外一部分是TensorBoard如何添加不同種類數據(即TensorBoard的API)的教程
上面說道,TensorBoard是分為前段顯示和后端數據記錄的,因此其Pipeline也分為兩步:
第一步:后端數據記錄第二步:前段查看數據
類似于Flask
和Django
中把后端程序(服務器)被抽象為了一個類,然而這個類中提供了方法來開啟和關閉服務,TensorBoard中也是把后端服務器抽象成了一個類:SummaryWriter
,不過不同的是,TensorBoard中的SummaryWriter
類在被聲明后就開啟了對應的服務,直到我們使用了SummaryWriter
關閉服務的API。
此外,還有一個不同的之處在于,TensorBoard的前段數據顯示和后端數據記錄是異步I/O
的,即后端程序(SummaryWriter
類的實例)將數據寫入到一個文件中,而前端程序讀取文件中的數據來進行顯示。因此后端所謂的服務指的就是數據的記錄,而非提供前端的顯示。數據記錄的實現方式即通過SummaryWriter
類中的方法
然后在開啟了后端程序的服務器之后,我們就可以通過各種API來添加數據了
導入包:
我們首先導入包
import torch from torch.utils.tensorboard import SummaryWriter
SummaryWriter
聲明之后就會開啟后端數據記錄的服務,因此在實例化該類的時候我們就需要保存數據的位置。聲明保存數據的位置有好幾種方式
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):指定了數據保存的文件夾的位置,如果該文件夾不存在則會創建一個出來。如果沒有指定的話,默認的保存的文件夾是./runs/現在的時間_主機名
,例如:Feb04_22-42-47_Alienware
,因此每次運行之后都會創建一個新的文件夾。在寫論文的時候我們會涉及一系列實驗,從不同的角度來說明一些問題,例如我們的假設是否正確、模型性能是否更好……因此最好不要用默認的實現來直接作為存放數據的文件夾,而是使用具有含義的二級結構,例如:runs/exp1
。這樣的話,所有的實驗1的數據都在這個文件夾下,這樣我們就可以方便的進行比較。
comment
(string):給默認的log_dir
添加的后綴,如果我們已經指定了log_dir
具體的值,那么這個參數就不會有任何的效果
purge_step
(int):TensorBoard在記錄數據的時候有可能會崩潰,例如在某一個epoch中,進行到第 T + X T+X T+X個step的時候由于各種原因(內存溢出)導致崩潰,那么當服務重啟之后,就會從 T T T個step重新開始將數據寫入文件,而中間的 X X X,即purge_step
指定的step內的數據都被被丟棄。
max_queue
(int):在記錄數據的時候,在內存中開的隊列的長度,當隊列慢了之后就會把數據寫入磁盤(文件)中。
flush_secs
(int):以秒為單位的寫入磁盤的間隔,默認是120秒,即兩分鐘。
filename_suffix
(string):添加到log_dir
中每個文件的后綴。更多文件名稱設置要參考tensorboard.summary.writer.event_file_writer.EventFileWriter
類。
因此,一個成熟的數據記錄方式就是在runs
文件夾下按照一定的意義來劃分二級文件夾,例如網絡結構1
、網絡結構2
、實驗1
、實驗2
等等。
想后端服務程序添加數據使用的是SummaryWriter
類中的一系列方法,這些方法都以add_
開頭,例如:add_scalar
、add_scalars
、add_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
后面在第二部分會詳細的講解每個方法,這里先講共性。
每個方法根據需要添加的數據的不同,方法中具體的參數也不同,但是所有的方法終歸都是要添加數據的,因此會存在相同的參數。具體來說,相同的參數包括:
tag
(str):用于給數據進行分類的標簽,標簽中可以包含父級和子級標簽。例如給訓練的loss以loss/train
的tag,而給驗證以loss/val
的tag,這樣的話,最終的效果就是訓練的loss和驗證的loss都被分到了loss
這個父級標簽下。而train
和val
則是具體用于區分兩個參數的標識符(identifier)。例如我們現在有兩個tag,cos/dense
和cos/sparse
,那么最終展示下來的效果是這樣的。此外,只支持二級標簽
globa_step
(int):首先,每個epoch中我們都會更新固定的step。因此,在一個數據被加入的時候,有兩種step,第一種step是數據被加入時當前epoch已經進行了多少個step,第二種step是數據被加入時候,累計(包括之前的epoch)已經進行了多少個step。而考慮到我們在繪圖的時候往往是需要觀察所有的step下的數據的變化,因此global_step
指的就是當前數據被加入的時候已經計算了多少個step。計算global_step
的步驟很簡單,就是 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
實例化開始到當前數據被加入時候所經歷時間(以秒計算),默認是使用time.time()
來自動計算的,當然我們也可以指定這個參數來進行修改。這個參數一般不改
以添加標量(add_scalar)為例,演示一下添加數據的方法的用法。其他的方法第二部分會講
writer = SummaryWriter() for epoch in range(n_epoch := 10): for step in range(total_step := 100): # 訓練代碼讀取數據來進行顯示。 # ... # ... # 計算 loss loss = np.sin(step * 0.01) # 添加標量 writer.add_scalar(tag="loss/train", scalar_value=loss, global_step=epoch * total_step + step)
然后可以看到的效果如下:
我們剛才說過,SummaryWriter這樣的后端程序在被實例化出來就自動開啟了數據記錄的服務,而我們在完成了所有的數據記錄只有,需要關閉服務。
關閉服務很簡單,就是直接調用close
方法即可
writer.close()
最終,總結一下整個后端數據記錄的流程,其實就三步:
實例化SummaryWriter
類,同時指定數據保存的文件夾利用SummaryWriter
類提供的方法,添加不同類型的的數據關閉SummaryWriter
類,中止服務
因為TensorBoard是異步I/O的網頁服務程序,因此后端程序在把數據寫入到文件的時候,前端程序可以讀取數據來進行顯示。
具體來說,后端數據記錄程序會把所有的數據記錄到同一個文件夾下的多個文件內,以方便前端顯示程序多線程加速讀取。因此,前端顯示程序在啟動的時候需要指定讀取的文件夾
前端顯示程序提供了CLI(命令行)界面,因此我們直接在命令行啟動就行了
tensorboard --logdir=數據文件夾
其中數據文件夾就是在聲明SummaryWriter時候指定的文件夾。
例如:
tensorboard --logdir=./Feb05_01-00-48_Alienware/
而在我們啟動前端顯示程序之后,就會得到一個端口,訪問這個端口就能看到顯示的效果
訪問該端口就能看到程序:
有的時候,在服務器上訓練模型的時候為了避免和別人的TensorBoard的端口撞了,我們需要指定新的端口。或者有的時候我們在docker容器里跑TensorBoard,我們通過一個端口映射到主機上去,這個時候就需要指定TensorBoard使用特定的端口。
具體來說就是通過CLI的--port
參數
tensorboard --logdir=數據文件夾 --port=端口
例如我們現在指定上面的例子端口為10000
tensorboard --logdir=./Feb05_01-00-48_Alienware/ --port=10000
最后,總結一下使用TensorFlow的Pipeline,首先在訓練的過程中使用SummaryWriter來記錄數據,記錄的過程中需要注意文件夾需要來合理的劃分。
然后我們在前端查看的時候,運行tensorboard
的CLI程序即可,一般用的最多的就是--log_dir
和--port
兩個參數。
此外,如果是服務器上的話,那么tensorboard的CLI運行在服務器上,然后在自己的電腦上,利用瀏覽器,通過內網來查看訓練過程。
上面講完了SummaryWriter的Workflow/Pipeline,剩下的就是SummaryWriter添加數據的API的講解了。關于這些API的話,正如上面介紹的,他們都以add_
開頭,具體有:
標量類:add_scalar
、add_scalars
、add_custom_scalars
、add_custom_scalars_marginchart
、add_custom_scalars_multilinechart
、
數據顯示類:
圖像:add_image
、add_images
、add_image_with_boxes
、add_figure
視頻:add_video
音頻:add_audio
文本:add_text
Embedding:add_embedding
點云:add_mesh
統計圖:add_histogram
、add_histogram_raw
、add_pr_curve
、add_pr_curve_raw
網絡圖:add_onnx_graph
、add_graph
超參數圖:add_hparams
讀到這里,這篇“Pytorch中怎么使用TensorBoard”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。