summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorEvan Shelhamer <shelhamer@imaginarynumber.net>2016-01-26 17:43:14 -0800
committerEvan Shelhamer <shelhamer@imaginarynumber.net>2016-01-26 17:43:14 -0800
commitdc831aa8f5d3b7d9473958f5b9e745c98755a0a6 (patch)
treed79db76aa2bbab5820cfa365915ba9279a669510 /include
parent6d111088ba7f8721f0d17f3a11cf33e1c4dd52c3 (diff)
parent081690709e4a199824f433cc196c55c47731073f (diff)
downloadcaffeonacl-dc831aa8f5d3b7d9473958f5b9e745c98755a0a6.tar.gz
caffeonacl-dc831aa8f5d3b7d9473958f5b9e745c98755a0a6.tar.bz2
caffeonacl-dc831aa8f5d3b7d9473958f5b9e745c98755a0a6.zip
Merge pull request #3591 from jeffdonahue/scale-bias-layer
Scale and Bias Layers
Diffstat (limited to 'include')
-rw-r--r--include/caffe/layers/bias_layer.hpp54
-rw-r--r--include/caffe/layers/scale_layer.hpp83
2 files changed, 137 insertions, 0 deletions
diff --git a/include/caffe/layers/bias_layer.hpp b/include/caffe/layers/bias_layer.hpp
new file mode 100644
index 00000000..eedc3aaa
--- /dev/null
+++ b/include/caffe/layers/bias_layer.hpp
@@ -0,0 +1,54 @@
+#ifndef CAFFE_BIAS_LAYER_HPP_
+#define CAFFE_BIAS_LAYER_HPP_
+
+#include <vector>
+
+#include "caffe/blob.hpp"
+#include "caffe/layer.hpp"
+#include "caffe/proto/caffe.pb.h"
+
+namespace caffe {
+
+/**
+ * @brief Computes a sum of two input Blobs, with the shape of the
+ * latter Blob "broadcast" to match the shape of the former.
+ * Equivalent to tiling the latter Blob, then computing the elementwise
+ * sum.
+ *
+ * The second input may be omitted, in which case it's learned as a parameter
+ * of the layer.
+ */
+template <typename Dtype>
+class BiasLayer : public Layer<Dtype> {
+ public:
+ explicit BiasLayer(const LayerParameter& param)
+ : Layer<Dtype>(param) {}
+ virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom,
+ const vector<Blob<Dtype>*>& top);
+ virtual void Reshape(const vector<Blob<Dtype>*>& bottom,
+ const vector<Blob<Dtype>*>& top);
+
+ virtual inline const char* type() const { return "Bias"; }
+ virtual inline int MinBottomBlobs() const { return 1; }
+ virtual inline int MaxBottomBlobs() const { return 2; }
+ virtual inline int ExactNumTopBlobs() const { return 1; }
+
+ virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom,
+ const vector<Blob<Dtype>*>& top);
+ virtual void Forward_gpu(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>*>& bottom);
+ virtual void Backward_gpu(const vector<Blob<Dtype>*>& top,
+ const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom);
+
+ private:
+ Blob<Dtype> bias_multiplier_;
+ int outer_dim_, bias_dim_, inner_dim_, dim_;
+};
+
+
+
+} // namespace caffe
+
+#endif // CAFFE_BIAS_LAYER_HPP_
diff --git a/include/caffe/layers/scale_layer.hpp b/include/caffe/layers/scale_layer.hpp
new file mode 100644
index 00000000..924df2e5
--- /dev/null
+++ b/include/caffe/layers/scale_layer.hpp
@@ -0,0 +1,83 @@
+#ifndef CAFFE_SCALE_LAYER_HPP_
+#define CAFFE_SCALE_LAYER_HPP_
+
+#include <vector>
+
+#include "caffe/blob.hpp"
+#include "caffe/layer.hpp"
+#include "caffe/proto/caffe.pb.h"
+
+#include "caffe/layers/bias_layer.hpp"
+
+namespace caffe {
+
+/**
+ * @brief Computes a product of two input Blobs, with the shape of the
+ * latter Blob "broadcast" to match the shape of the former.
+ * Equivalent to tiling the latter Blob, then computing the elementwise
+ * product.
+ *
+ * The second input may be omitted, in which case it's learned as a parameter
+ * of the layer.
+ */
+template <typename Dtype>
+class ScaleLayer: public Layer<Dtype> {
+ public:
+ explicit ScaleLayer(const LayerParameter& param)
+ : Layer<Dtype>(param) {}
+ virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom,
+ const vector<Blob<Dtype>*>& top);
+ virtual void Reshape(const vector<Blob<Dtype>*>& bottom,
+ const vector<Blob<Dtype>*>& top);
+
+ virtual inline const char* type() const { return "Scale"; }
+ // Scale
+ virtual inline int MinBottomBlobs() const { return 1; }
+ virtual inline int MaxBottomBlobs() const { return 2; }
+ virtual inline int ExactNumTopBlobs() const { return 1; }
+
+ protected:
+ /**
+ * In the below shape specifications, @f$ i @f$ denotes the value of the
+ * `axis` field given by `this->layer_param_.scale_param().axis()`, after
+ * canonicalization (i.e., conversion from negative to positive index,
+ * if applicable).
+ *
+ * @param bottom input Blob vector (length 2)
+ * -# @f$ (d_0 \times ... \times
+ * d_i \times ... \times d_j \times ... \times d_n) @f$
+ * the first factor @f$ x @f$
+ * -# @f$ (d_i \times ... \times d_j) @f$
+ * the second factor @f$ y @f$
+ * @param top output Blob vector (length 1)
+ * -# @f$ (d_0 \times ... \times
+ * d_i \times ... \times d_j \times ... \times d_n) @f$
+ * the product @f$ z = x y @f$ computed after "broadcasting" y.
+ * Equivalent to tiling @f$ y @f$ to have the same shape as @f$ x @f$,
+ * then computing the elementwise product.
+ */
+ virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom,
+ const vector<Blob<Dtype>*>& top);
+ virtual void Forward_gpu(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>*>& bottom);
+ virtual void Backward_gpu(const vector<Blob<Dtype>*>& top,
+ const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom);
+
+ shared_ptr<Layer<Dtype> > bias_layer_;
+ vector<Blob<Dtype>*> bias_bottom_vec_;
+ vector<bool> bias_propagate_down_;
+ int bias_param_id_;
+
+ Blob<Dtype> sum_multiplier_;
+ Blob<Dtype> sum_result_;
+ Blob<Dtype> temp_;
+ int axis_;
+ int outer_dim_, scale_dim_, inner_dim_;
+};
+
+
+} // namespace caffe
+
+#endif // CAFFE_SCALE_LAYER_HPP_