BatchNorm 和 Reshuffle 在每个 epoch 之后训练图像

BatchNorm and Reshuffle train images after each epoch

使用 BatchNorm 的推荐方法是在每个 epoch 之间重新洗牌训练图像集,这样给定的图像就不会在每次传递时落入具有相同图像的小批量中。

您如何使用 Caffe 实现这一目标?

如果您使用 ImageData 层作为输入,请将 "shuffle" 设置为 true

例如,如果您有:

layer {
  name: "data"
  type: "ImageData"
  top: "data"
  top: "label"
  transform_param {
    mirror: false
    crop_size: 227
    mean_file: "data/ilsvrc12/imagenet_mean.binaryproto"
  }
  image_data_param {
    source: "examples/_temp/file_list.txt"
    batch_size: 50
    new_height: 256
    new_width: 256
  }
}

只需添加:

layer {
  name: "data"
  type: "ImageData"
  top: "data"
  top: "label"
  transform_param {
    mirror: false
    crop_size: 227
    mean_file: "data/ilsvrc12/imagenet_mean.binaryproto"
  }
  image_data_param {
    source: "examples/_temp/file_list.txt"
    batch_size: 50
    new_height: 256
    new_width: 256
    shuffle: true
  }
}

有关文档,请参阅:

您也可以在这里找到源代码:

特别感兴趣的是函数 load_batch 中的代码,它在每个纪元结束时重新洗牌数据:

lines_id_++;
if (lines_id_ >= lines_size) {
  // We have reached the end. Restart from the first.
  DLOG(INFO) << "Restarting data prefetching from start.";
  lines_id_ = 0;
  if (this->layer_param_.image_data_param().shuffle()) {
    ShuffleImages();
  }
}