Caffe
hdf5_output_layer.hpp
1 #ifndef CAFFE_HDF5_OUTPUT_LAYER_HPP_
2 #define CAFFE_HDF5_OUTPUT_LAYER_HPP_
3 
4 #include "hdf5.h"
5 
6 #include <string>
7 #include <vector>
8 
9 #include "caffe/blob.hpp"
10 #include "caffe/layer.hpp"
11 #include "caffe/proto/caffe.pb.h"
12 
13 namespace caffe {
14 
15 #define HDF5_DATA_DATASET_NAME "data"
16 #define HDF5_DATA_LABEL_NAME "label"
17 
23 template <typename Dtype>
24 class HDF5OutputLayer : public Layer<Dtype> {
25  public:
26  explicit HDF5OutputLayer(const LayerParameter& param)
27  : Layer<Dtype>(param), file_opened_(false) {}
28  virtual ~HDF5OutputLayer();
29  virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom,
30  const vector<Blob<Dtype>*>& top);
31  // Data layers should be shared by multiple solvers in parallel
32  virtual inline bool ShareInParallel() const { return true; }
33  // Data layers have no bottoms, so reshaping is trivial.
34  virtual void Reshape(const vector<Blob<Dtype>*>& bottom,
35  const vector<Blob<Dtype>*>& top) {}
36 
37  virtual inline const char* type() const { return "HDF5Output"; }
38  // TODO: no limit on the number of blobs
39  virtual inline int ExactNumBottomBlobs() const { return 2; }
40  virtual inline int ExactNumTopBlobs() const { return 0; }
41 
42  inline std::string file_name() const { return file_name_; }
43 
44  protected:
45  virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom,
46  const vector<Blob<Dtype>*>& top);
47  virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom,
48  const vector<Blob<Dtype>*>& top);
49  virtual void Backward_cpu(const vector<Blob<Dtype>*>& top,
50  const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom);
51  virtual void Backward_gpu(const vector<Blob<Dtype>*>& top,
52  const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom);
53  virtual void SaveBlobs();
54 
55  bool file_opened_;
56  std::string file_name_;
57  hid_t file_id_;
58  Blob<Dtype> data_blob_;
59  Blob<Dtype> label_blob_;
60 };
61 
62 } // namespace caffe
63 
64 #endif // CAFFE_HDF5_OUTPUT_LAYER_HPP_
An interface for the units of computation which can be composed into a Net.
Definition: layer.hpp:33
A layer factory that allows one to register layers. During runtime, registered layers can be called b...
Definition: blob.hpp:14
virtual void Forward_cpu(const vector< Blob< Dtype > *> &bottom, const vector< Blob< Dtype > *> &top)
Using the CPU device, compute the layer output.
Definition: hdf5_output_layer.cpp:41
Write blobs to disk as HDF5 files.
Definition: hdf5_output_layer.hpp:24
virtual void Reshape(const vector< Blob< Dtype > *> &bottom, const vector< Blob< Dtype > *> &top)
Adjust the shapes of top blobs and internal buffers to accommodate the shapes of the bottom blobs...
Definition: hdf5_output_layer.hpp:34
virtual int ExactNumTopBlobs() const
Returns the exact number of top blobs required by the layer, or -1 if no exact number is required...
Definition: hdf5_output_layer.hpp:40
virtual void Backward_gpu(const vector< Blob< Dtype > *> &top, const vector< bool > &propagate_down, const vector< Blob< Dtype > *> &bottom)
Using the GPU device, compute the gradients for any parameters and for the bottom blobs if propagate_...
virtual void Backward_cpu(const vector< Blob< Dtype > *> &top, const vector< bool > &propagate_down, const vector< Blob< Dtype > *> &bottom)
Using the CPU device, compute the gradients for any parameters and for the bottom blobs if propagate_...
Definition: hdf5_output_layer.cpp:62
virtual int ExactNumBottomBlobs() const
Returns the exact number of bottom blobs required by the layer, or -1 if no exact number is required...
Definition: hdf5_output_layer.hpp:39
virtual const char * type() const
Returns the layer type.
Definition: hdf5_output_layer.hpp:37
virtual void LayerSetUp(const vector< Blob< Dtype > *> &bottom, const vector< Blob< Dtype > *> &top)
Does layer-specific setup: your layer should implement this function as well as Reshape.
Definition: hdf5_output_layer.cpp:12
virtual bool ShareInParallel() const
Whether a layer should be shared by multiple nets during data parallelism. By default, all layers except for data layers should not be shared. data layers should be shared to ensure each worker solver access data sequentially during data parallelism.
Definition: hdf5_output_layer.hpp:32
virtual void Forward_gpu(const vector< Blob< Dtype > *> &bottom, const vector< Blob< Dtype > *> &top)
Using the GPU device, compute the layer output. Fall back to Forward_cpu() if unavailable.
A wrapper around SyncedMemory holders serving as the basic computational unit through which Layers...
Definition: blob.hpp:24