YOLOv2训练时参数调整情况及分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaomifanhxx/article/details/81095074

    在进行YOLOv2训练的时候,我们想要更直观的看到模型的情况,那我们可以使用模型训练可视化得到模型的参数随时间变化的情况,这样我们也能判断出模型的好坏。(并不是训练时间越长,模型越好,我们通过可视化来找到较为理想的参数)

    在检测各项指标的时候(如loss,IOU等),我们可以使用验证集来判断我们模型的好坏,但这个判断只能使用保存好的参数,我们并不能实时的查看模型的好坏。因此,我们可以将训练时的参数保存下来,并进行可视化,实现实时查看。

1.保存训练过程的参数

1.1如果我们是在后台(即服务器端)执行,通过如下命令我们可以得到nohup文件,里面存储的是训练过程的参数。

nohup ./darknet detector train obj.data cfg/train.cfg [weights] &

1.2如果我们是在自己电脑上执行,通过如下命令我们可以得到我们定义的文件,里面存储的是训练过程的参数。

./darknet detector train cfg/obj.data cfg/train.cfg [weights] 2>&1 | tee log.txt

(log.txt表示的是我们存储训练过程参数的文件)

2.训练中参数的意义

(1)Region Avg IOU:平均的IOU,代表着预测的Bounding Box和Ground truth的交集与并集之比,(batch/subdivision)期望该值趋近于1。(2)Class:是标注物体的概率,期望该值趋近于1。(3)Obj:期望该值趋近于1。(4)No Obj:期望该值越来越小,但不为0。(5)AvgRecall:期望该值趋近于1,召回率比较高说明效果较好(6)count表示输出有多少个目标总和

3.训练完一个batch后的参数的意义

(1)20001表示是第20001个batch。(2)表示总体的损失。(3)表示平均损失,该数值越低越好。(4)代表当前的学习率。(5)表示当前批次训练花费的总时间。(6)表示参与训练的图片数目的总和。

4.python处理(由于我们需要分析的是avg_loss等数据的趋势)

4.1首先将保存的训练过程参数的文件进行分析,将我们要得到的数据存储到另外的txt中去

def extract_log(log_file,new_log_file,key_word):
    f = open(log_file)
    train_log = open(new_log_file, 'w')
    for line in f:
        # 去除多gpu的同步log
        if 'Syncing' in line:
            continue
        # 去除除零错误的log
        if 'nan' in line:
            continue
        if key_word in line:
            train_log.write(line)

    f.close()
    train_log.close()

extract_log('C:/Users/zjunzhao/Desktop/log.txt','C:/Users/zjunzhao/Desktop/222.txt','images') 

这样我们可以得到如下的txt文档,这样我们可以进行提取结果,进行画图。

4.2对进行处理后的txt进行python处理,得到我们所要的avg_loss图像

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#%matplotlib inline
result = pd.read_csv('C:/Users/zjunzhao/Desktop/222.txt',error_bad_lines=False, names=['loss', 'avg', 'rate', 'seconds', 'images'])
result.head(20)
result['loss']=result['loss'].str.split(' ').str.get(1)
print(result['loss'])
result['avg']=result['avg'].str.split(' ').str.get(1)
result['rate']=result['rate'].str.split(' ').str.get(1)
result['seconds']=result['seconds'].str.split(' ').str.get(1)
result['images']=result['images'].str.split(' ').str.get(1)
result.head()
result.tail()
result['loss']=pd.to_numeric(result['loss'])
result['avg']=pd.to_numeric(result['avg'])
result['rate']=pd.to_numeric(result['rate'])
result['seconds']=pd.to_numeric(result['seconds'])
result['images']=pd.to_numeric(result['images'])
result.dtypes
fig = plt.figure();
ax = fig.add_subplot(1, 1, 1)
ax.plot(result['avg'].values,label='avg_loss')
#ax.plot(result['loss'].values,label='loss')
ax.legend(loc='best')
ax.set_title('The loss curves')
ax.set_xlabel('batches')
fig.savefig('avg_loss')
#fig.savefig('loss')

这样我们就可以得到avg_loss图像

这样我们就能可视化,更直观的查看我们所要看的参数的改变情况,并根据不同情况进行分析。

pd.to_numeric()解析:https://yq.aliyun.com/articles/444105

参考博文:https://blog.csdn.net/yudiemiaomiao/article/details/72469135

猜你喜欢

转载自blog.csdn.net/xiaomifanhxx/article/details/81095074