#ifndef CAFFE_DATA_LAYERS_HPP_ #define CAFFE_DATA_LAYERS_HPP_ #include #include "caffe/blob.hpp" #include "caffe/data_transformer.hpp" #include "caffe/internal_thread.hpp" #include "caffe/layer.hpp" #include "caffe/proto/caffe.pb.h" #include "caffe/util/blocking_queue.hpp" namespace caffe { /** * @brief Provides base for data layers that feed blobs to the Net. * * TODO(dox): thorough documentation for Forward and proto params. */ template class BaseDataLayer : public Layer { 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*>& bottom, const vector*>& top); virtual void DataLayerSetUp(const vector*>& bottom, const vector*>& top) {} // Data layers have no bottoms, so reshaping is trivial. virtual void Reshape(const vector*>& bottom, const vector*>& top) {} virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, const vector*>& bottom) {} virtual void Backward_gpu(const vector*>& top, const vector& propagate_down, const vector*>& bottom) {} protected: TransformationParameter transform_param_; shared_ptr > data_transformer_; bool output_labels_; }; template class Batch { public: Blob data_, label_; }; template class BasePrefetchingDataLayer : public BaseDataLayer, public InternalThread { public: explicit BasePrefetchingDataLayer(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. void LayerSetUp(const vector*>& bottom, const vector*>& top); virtual void Forward_cpu(const vector*>& bottom, const vector*>& top); virtual void Forward_gpu(const vector*>& bottom, const vector*>& top); protected: virtual void InternalThreadEntry(); virtual void load_batch(Batch* batch) = 0; vector > > prefetch_; BlockingQueue*> prefetch_free_; BlockingQueue*> prefetch_full_; Batch* prefetch_current_; Blob transformed_data_; }; } // namespace caffe #endif // CAFFE_DATA_LAYERS_HPP_