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數據集的結果。

 

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