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
}
}
有关文档,请参阅:
- http://caffe.berkeleyvision.org/tutorial/layers.html#images
- https://github.com/BVLC/caffe/blob/master/src/caffe/proto/caffe.proto#L770
您也可以在这里找到源代码:
特别感兴趣的是函数 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();
}
}
使用 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
}
}
有关文档,请参阅:
- http://caffe.berkeleyvision.org/tutorial/layers.html#images
- https://github.com/BVLC/caffe/blob/master/src/caffe/proto/caffe.proto#L770
您也可以在这里找到源代码:
特别感兴趣的是函数 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();
}
}