在利用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檔案的輸出儲存路徑,這裡的“.”代表的是目前目錄,我的截圖示例如下:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISM1EzMykzMwETMyUDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
(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
最終打開儲存的圖檔save.png,如下所示:
(二)自己寫個小代碼繪制曲線
其實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.')
結果圖為: