深度学习训练中数据是基础,为了让模型的训练效果更好,泛化性能更强,数据增强是一种广泛采用的技巧。
但是caffe官方的实现的一些数据输入层比如DataLayer、ImageDataLayer层所支持的数据增强操作实在比较有限,因此这里解读一下caffe中数据增强部分的代码,并分析如何修改源码增加数据增强的功能(主要是指明修改思路)
一、数据层相关的类图关系
Caffe网络正向传导时,首先进行的是DataLayer数据层的传导。该层从文件读取数据,加载至它的上一层卷积层。反向传播时,因为数据层不需要反传,所以它的Backward_cpu()和Backward_gpu()都是空函数。下图为数据层的类图关系:
最底层的基类(父类)为Layer层,这是所有层的基类。数据层的基类BaseDataLayer继承了Layer层,后面为BasePrefetchingDataLayer。
template <typename Dtype>
class BaseDataLayer : public Layer<Dtype> {
public:
explicit BaseDataLayer(const LayerParameter& param);
// LayerSetUp: implements common data layer setup functionality, and calls
// DataLayerSetUp to do special data layer setup for individual layer types.
// This method may not be overridden except by the BasePrefetchingDataLayer.
virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom,
const vector<Blob<Dtype>*>& top);
virtual void DataLayerSetUp(const vector<Blob<Dtype>*>& bottom,
const vector<Blob<Dtype>*>& top) {}
// Data layers have no bottoms, so reshaping is trivial.
virtual void Reshape(const vector<Blob<Dtype>*>& bottom,
const vector<Blob<Dtype>*>& top) {}
virtual void Backward_cpu(const vector<Blob<Dtype>*>& top,
const vector<bool>& propagate_down, const vector<Blob<Dtype&g