在利用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文件的输出保存路径,这里的“.”代表的是当前目录,我的截图示例如下:
(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.')
结果图为: