问题描述:训练过程中出现blocking_queue.cpp:50] Data layer prefetch queue empty
原因:SSD训练慢的原因是 在生成LMDB文件时没有将图片转化为300*300分辨率大小 所以在训练网络时需要转换图片分辨率 这样就造成了数据输入层预存队列为空 GPU一直在等待数据中 所以造成了训练异常缓慢。(图片resize是在CPU上运行的,CPU数据读入慢于GPU计算,导致GPU处于空闲,使得计算速度下降,迭代时间间隔扩大。)
解决办法:找到文件 /data/VOC0712/create_data.sh ,将width=0改为width=300,将height=0改为height=300.
cur_dir=$(cd $( dirname ${BASH_SOURCE[0]} ) && pwd )
root_dir=$cur_dir/../..
cd $root_dir
redo=1
data_root_dir="$HOME/data/VOCdevkit"
dataset_name="VOC0712"
mapfile="$root_dir/data/$dataset_name/labelmap_voc.prototxt"
anno_type="detection"
db="lmdb"
min_dim=0
max_dim=0
width=300 # 0
height=300 # 0
extra_cmd="--encode-type=jpg --encoded"
if [ $redo ]
then
extra_cmd="$extra_cmd --redo"
fi
for subset in test trainval
do
python $root_dir/scripts/create_annoset.py --anno-type=$anno_type --label-map-file=$mapfile --min-dim=$min_dim --max-dim=$max_dim --resize-width=$width --resize-height=$height --check-label $extra_cmd $data_root_dir $root_dir/data/$dataset_name/$subset.txt $data_root_dir/$dataset_name/$db/$dataset_name"_"$subset"_"$db examples/$dataset_name
done
注意:直接读入图片的是使用ImageDataLayer ,使用LMDB格式的数据是用DataLayer。