天天看點

ubuntu16.04下Caffe繪制訓練過程的loss和accuracy曲線

      在利用Caffe訓練相應的網絡模型後,往往需要繪制訓練過程中的資料,這樣可以更加直覺地展示我們的實驗結果,事實上,caffe自帶了這樣的小工具,當然你也可以自己寫個代碼,下面分别介紹這兩種方法:

     (一)利用caffe自帶工具

       (1)首先假設你生成的log檔案名為train.log,利用你的~/caffe/tools/extra/parse_log.py來解析train.log檔案,會生成兩個檔案,分别為:train.log.test、train.log.train。為了友善示範,這裡将train.log檔案拷貝到與~/caffe/tools/extra/parse_log.py相同的目錄下,在該目錄右鍵打開終端,執行以下指令即可(不要忘記了最後的“.”):

python parse_log_rs.py train.log .
           

注意:不要忘記了最後的“.”,代表的是你train.log.test、train.log.train檔案的輸出儲存路徑,這裡的“.”代表的是目前目錄,我的截圖示例如下:

ubuntu16.04下Caffe繪制訓練過程的loss和accuracy曲線

        (2)利用你的~/caffe/tools/extra/plot_training_log.py.example來繪制相應的loss和accuracy曲線,這裡建議你生成該檔案的一個拷貝,保留原始檔案,新檔案名字為plot_training_log.py。執行指令:

cp plot_training_log.py.example plot_training_log.py
           

           然後執行以下指令即可繪制相應曲線:

python plot_training_log.py 0 save.png train.log
           

    參數“save.png”代表你儲存繪制圖像的檔案名,train.log就是你最初訓練獲得log檔案,其中的“0”代表地是其中一種類型,事實上這裡有8中模式,具體模式如下,你可以依次嘗試:

Notes:  
        1. Supporting multiple logs.  
        2. Log file name must end with the lower-cased ".log".  
    Supported chart types:  
        0: Test accuracy  vs. Iters  
        1: Test accuracy  vs. Seconds  
        2: Test loss  vs. Iters  
        3: Test loss  vs. Seconds  
        4: Train learning rate  vs. Iters  
        5: Train learning rate  vs. Seconds  
        6: Train loss  vs. Iters  
        7: Train loss  vs. Seconds  
           

如果你在運作上述代碼出現了以下錯誤,直接執行以下安裝指令即可:

sudo apt-get install python-tk
           
ubuntu16.04下Caffe繪制訓練過程的loss和accuracy曲線

最終打開儲存的圖檔save.png,如下所示:

ubuntu16.04下Caffe繪制訓練過程的loss和accuracy曲線

     (二)自己寫個小代碼繪制曲線

       其實caffe提供的工具已經非常完整了,我們還可以進去代碼結合自己的需求進行相應的修改。唯一的不足時,上述方法往往是單個曲線的繪制,如果你想把loos與accuracy曲線疊加在一個圖上,就可以采用下面的代碼來完成:

注意:第一步還是需要利用~/caffe/tools/extra/parse_log.py來解析train.log檔案,生成兩個檔案,分别為:train.log.test、train.log.train。

注意:你可以更該相應的參數名來繪制你想要的曲線,例如:

ax1.plot(train_log["NumIters"], train_log["loss"], 'r')   # 繪制訓練疊代次數與loss曲線,可以選擇檔案中其它的參數繪制曲線      
ax2.plot(test_log["NumIters"], test_log["accuary"], 'm')  # 繪制測試疊代次數與準确率曲線
      

plot_loss_accuracy.py

#-*-coding:utf-8-*-

import pandas as pd
import matplotlib.pyplot as plt

train_log = pd.read_csv("train.log.train")   # 你的檔案名
test_log = pd.read_csv("train.log.test")     # 你的檔案名

_, ax1 = plt.subplots()
ax1.set_title("train loss and test loss")    # 标題
# ax1.plot(train_log["NumIters"], train_log["loss"], alpha=0.5)
ax1.plot(train_log["NumIters"], train_log["loss"], 'r')   # 繪制訓練疊代次數與loss曲線,可以選擇檔案中其它的參數繪制曲線
# ax1.plot(test_log["NumIters"], test_log["loss"], 'g')   # 繪制測試疊代次數與loss曲線
ax1.set_xlabel('iteration')
ax1.set_ylabel('train loss')
plt.legend(loc='upper left')

ax2 = ax1.twinx()
# ax2.plot(test_log["NumIters"], test_log["acc/top-1"], 'r')
# ax2.plot(test_log["NumIters"], test_log["acc/top-5"], 'm')
# ax2.plot(test_log["NumIters"], test_log["accuary"], 'r')
ax2.plot(test_log["NumIters"], test_log["accuary"], 'm')  # 繪制測試疊代次數與準确率曲線
ax2.set_ylabel('test accuracy')
plt.legend(loc='upper right')

plt.show()

print('Done.')
           

結果圖為:

ubuntu16.04下Caffe繪制訓練過程的loss和accuracy曲線