前幾日在利用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_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/到瀏覽器即可看到結果:
左下角是我們文件的路徑,如果這一塊沒有出現打勾的文件,一般就是路徑填寫的有問題,這種情況下右邊的圖像也不會出來的。
應用到CNN網絡訓練
選取了一段代碼(完整代碼見另一篇博文):
#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跑了一下:
通過上面的圖可以看出,tensorboard記錄了每一步執行的loss和accuracy,而且還能看到執行到每一步時的耗時,這個對於認識模型、優化模型都是很有幫助的啦。
此外,tensorboard還可以可視化訓練的圖片和模型圖,圖片用 add_image,模型圖用 add_graph。詳見文末的官方文檔。不再一一舉例,按需自查。
更多可以參見官方文檔:
VISUALIZING MODELS, DATA, AND TRAINING WITH TENSORBOARD
其他參考文章: