使用Pytorch中的tensorboard可視化網絡訓練參數

前幾日在利用Pytorch訓練CIFAR-10數據集時,就在想這些訓練過程中的loss怎麼才能可視化出來,於是去找了一下,網上大部分的方法都是利用tensorboardX來實現的,後來發現其實新版本Pytorch裏邊自帶的tensorboard就可以實現可視化。(應該是版本升級之後tensorboardX被torch.utils.tensorboard取代了)於是就嘗試了一番:

環境配置

安裝tensorboard(感覺安裝了torch之後其實這一步好像都不用安裝,因爲它是包含在torch裏邊的),但剛開始沒試成功還是安裝了:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tensorboard

初步試驗

試一下以下官方給的示例:

from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter()
x = range(100)
for i in x:
    writer.add_scalar('y=2x', i * 2, i)
writer.close()

這個示例是將訓練的日誌保存在了和你這個python文件同級的目錄下,或者理解爲 ‘./runs’ 。咱先不管啥意思,先試一下結果,運行之後,再去terminal 下調用一下命令:

tensorboard --logdir=E:\runs

後面這個E:\runs是我程序所在的目錄,這一塊支持中文路徑,我試過了。然後就會報錯

cudart64_101.dll not found

就找到這個解決方法:

cudart64_101.dll not found解決方法

其實說的就是把原安裝目錄下的cudart64_102.dll複製一份改名爲cudart64_101.dll,方法的確有效。

再次在terminal 中執行上面的命令,可以看到已經tensorboard運行了:

2020-06-15 10:02:55.349105: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudart64_101.dll
Serving TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_all
TensorBoard 2.2.1 at http://localhost:6006/ (Press CTRL+C to quit)

複製http://localhost:6006/到瀏覽器即可看到結果:

image-20200615111406520

左下角是我們文件的路徑,如果這一塊沒有出現打勾的文件,一般就是路徑填寫的有問題,這種情況下右邊的圖像也不會出來的。

應用到CNN網絡訓練

選取了一段代碼(完整代碼見另一篇博文):

利用Pytorch訓練CIFAR-10數據集

#model.train()
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter('cifar-10')
for epoch in range(EPOCH):
    for i,data in enumerate(train_loader):
        inputs,labels = data
        inputs,labels = inputs.to(device),labels.to(device)
        
        #前向傳播
        outputs = model(inputs)
        #計算損失函數
        loss = criterion(outputs,labels)
        #清空上一輪的梯度
        optimizer.zero_grad()
        
        #反向傳播
        loss.backward()
        #參數更新
        optimizer.step()
        if  i%50 == 0:
            writer.add_scalar("Train/Loss", loss.item(), epoch*len(train_loader)+i)
        #print('it’s training...{}'.format(i))
    print('epoch{} loss:{:.4f}'.format(epoch+1,loss.item()))

#保存模型參數
torch.save(model,'cifar10_densenet161.pt')
print('cifar10_densenet161.pt saved')
#模型加載
#model = torch.load('cifar10_resnet.pt')#161.200epoch
model = torch.load('cifar10_densenet161.pt')
#測試
#model.eval()
model.train()

correct,total = 0,0
for j,data in enumerate(test_loader):
    inputs,labels = data
    inputs,labels = inputs.to(device),labels.to(device)
    #前向傳播
    outputs = model(inputs)
    _, predicted = torch.max(outputs.data,1)
    total =total+labels.size(0)
    correct = correct +(predicted == labels).sum().item()
    if  j%20 == 0:
        writer.add_scalar("Train/Accuracy", 100.0*correct/total, j)
print('準確率:{:.4f}%'.format(100.0*correct/total))

可以看出核心語句:

writer.add_scalar(“Train/Accuracy”, 100.0*correct/total, j)

方法原型:

def add_scalar(self, tag, scalar_value, global_step=None, walltime=None):

tag:畫圖的標題

scalar_value:當前存入的數值,即y軸的值

global_step:在哪一步存入了一次數據,即x軸的值

由於只在本地筆記本上跑一下示意,選擇了epoch=2跑了一下:

image-20200615152756641

通過上面的圖可以看出,tensorboard記錄了每一步執行的loss和accuracy,而且還能看到執行到每一步時的耗時,這個對於認識模型、優化模型都是很有幫助的啦。

此外,tensorboard還可以可視化訓練的圖片和模型圖,圖片用 add_image,模型圖用 add_graph。詳見文末的官方文檔。不再一一舉例,按需自查。

更多可以參見官方文檔:

VISUALIZING MODELS, DATA, AND TRAINING WITH TENSORBOARD

其他參考文章:

pytorch使用tensorboard實現可視化

用tensorboard實現可視化

PyTorch裏如何利用TensorBoard–詳解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章