ubuntu16.04下Caffe绘制训练过程的loss和accuracy曲线

时间:2022-06-10 08:09:42

      在利用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曲线