NVCaffe中detection_output_layer多卡训练过程中保存测试结果的问题

    我们通常在训练过程会设置每隔一定的迭代次数(test_interval)就跑一次valid,如果你使用的是多卡,查看训练日志你会发现有多条测试结果,他们出来不同的solver。最近在用caffe-jacinto跑ssd的时候突然想着把valid的结果保存下来,这个在detection_output_layer中可以通过配置相应的参数来指定,大体如下:

layer{
name: "detection_out"
type: "DetectionOutput"
bottom: "mbox_loc"
bottom: "mbox_conf_flatten"
bottom: "mbox_priorbox"
top: "detection_out"
include {
  phase: TEST
}
detection_output_param {
  ....
  save_output_param { #保存结果相关参数
    output_directory: "output" #保存结果的目录
    output_name_prefix: "comp4_det_test_" #保存结果文件前缀
    output_format: "VOC" #保存结果格式
    label_map_file: "../data/label_map_file.prototxt" #label和名字的对应
    name_size_file: "../data/test_name_size.txt" #valid数据集图片名字及其尺寸
    num_test_image: xx #这个参数很有意思
    resize_param {
      ....
    }
  }
}

但就是这个一个简单的事情在使用多卡训练的时候就遇到了问题,保存的结果不对!为了说明怎么个不对法,先回顾一下caffe关于训练过程中进行test的相关逻辑。简单起见,假设我valid数据集有128张图片,我有4张卡,batch size设置为8。照次,我跑完这个valid数据集需要迭代多少次呢?答案是16,总的数据集除以batch size。在配置solver.prototxt中的参数test_iter时就是据此计算的,此时test_iter就是16。因为有4张卡,一个batch size的数据会分到4张卡上去,一次迭代每张卡实际上只需要跑2(1/4个batch size)张图就可以了。总的下来,一个valid数据集跑完之后一张卡上实际上只跑了1/4的数据,即使忽略其它代码上的问题,一张卡(这个时候应该称一个solver更合适)只保存了1/4个valid数据集的结果。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章