在訓練神經網絡的過程中往往要定時記錄Loss的值,以便查看訓練過程和方便調參。一般可以借助tensorboard等工具實時地可視化Loss情況,也可以手寫實時繪制Loss的函數。基於自己的需要,我要將每次訓練之后的Loss保存到文件夾中之后再統一整理,因此這里總結兩種保存loss到文件的方法以及讀取Loss並繪圖的方法。
一、采用torch.save(tensor, 'file_name')方法:
for epoch in range(config.NUM_EPOCH) #...中間略 loss = criterion(outputs,ground_truth) # 計算損失值 running_loss = loss.item() # loss累加 optimizer.zero_grad() loss.backward() optimizer.step() # 反向傳播后參數更新 if i % 200 == 199: Loss.append(running_loss) print('Epoch '+str(epoch)+' : '+str(i//200)+' , LOSS ='+str(running_loss)) Loss0 = torch.tensor(Loss) torch.save(Loss0,'/home/wangshuyu/MobileNet_v1/loss2/epoch_{}'.format(epoch))
將每個epoch中的Loss存在一個list中,最后轉成tensor類型存到文件中。
二、采用np.save('file_name', np_array)方法
for epoch in range(config.NUM_EPOCH) #...中間略 loss = criterion(outputs,ground_truth) # 計算損失值 running_loss = loss.item() # loss累加 optimizer.zero_grad() loss.backward() optimizer.step() # 反向傳播后參數更新 if i % 200 == 199: Loss.append(running_loss) print('Epoch '+str(epoch)+' : '+str(i//200)+' , LOSS ='+str(running_loss)) Loss0 = np.array(Loss) np.save('/home/wangshuyu/MobileNet_v1/loss2/epoch_{}'.format(epoch),Loss0)
np.save默認保存為.npy格式
另外,也可以使用np.savez方法將每個epoch的Loss數據壓縮保存在同一個文件中(.npz文件),詳情可以參考博客:numpy數據存儲(save、savetxt、savez)的區別
三、讀取並繪制Loss曲線
import matplotlib.pyplot as plt import torch import numpy as np def plot_loss(n): y = [] for i in range(0,n): enc = np.load('D:\MobileNet_v1\plan1-AddsingleLayer\loss\epoch_{}.npy'.format(i)) # enc = torch.load('D:\MobileNet_v1\plan1-AddsingleLayer\loss\epoch_{}'.format(i)) tempy = list(enc) y += tempy x = range(0,len(y)) plt.plot(x, y, '.-') plt_title = 'BATCH_SIZE = 32; LEARNING_RATE:0.001' plt.title(plt_title) plt.xlabel('per 200 times') plt.ylabel('LOSS') # plt.savefig(file_name) plt.show() if __name__ == "__main__": plot_loss(20)
得到曲線如下: