add EqualNumBottomTopBlobs() property for layers; use in
authorJeff Donahue <jeff.donahue@gmail.com>
Thu, 3 Jul 2014 21:39:35 +0000 (14:39 -0700)
committerJeff Donahue <jeff.donahue@gmail.com>
Thu, 3 Jul 2014 21:39:35 +0000 (14:39 -0700)
ConvolutionLayer

include/caffe/layer.hpp
include/caffe/vision_layers.hpp

index 690c36b..b8afcfe 100644 (file)
@@ -84,6 +84,10 @@ class Layer {
   virtual inline int MinTopBlobs() const { return -1; }
   virtual inline int MaxTopBlobs() const { return -1; }
 
+  // EqualNumBottomTopBlobs should return true for layers requiring an equal
+  // number of bottom and top blobs.
+  virtual inline bool EqualNumBottomTopBlobs() const { return false; }
+
   // Declare for each bottom blob whether to allow force_backward -- that is,
   // if AllowForceBackward(i) == false, we will ignore the force_backward
   // setting and backpropagate to blob i only if it needs gradient information
@@ -156,6 +160,11 @@ class Layer {
           << type_name() << " Layer produces at most " << MaxTopBlobs()
           << " top blob(s) as output.";
     }
+    if (EqualNumBottomTopBlobs()) {
+      CHECK_EQ(bottom.size(), top.size())
+          << type_name() << " Layer produces one top blob as output for each "
+          << "bottom blob input.";
+    }
   }
 
   DISABLE_COPY_AND_ASSIGN(Layer);
index b68dcbf..c9beebe 100644 (file)
@@ -100,8 +100,9 @@ class ConvolutionLayer : public Layer<Dtype> {
   virtual inline LayerParameter_LayerType type() const {
     return LayerParameter_LayerType_CONVOLUTION;
   }
-  virtual inline int ExactNumBottomBlobs() const { return 1; }
-  virtual inline int ExactNumTopBlobs() const { return 1; }
+  virtual inline int MinBottomBlobs() const { return 1; }
+  virtual inline int MinTopBlobs() const { return 1; }
+  virtual inline bool EqualNumBottomTopBlobs() const { return true; }
 
  protected:
   virtual Dtype Forward_cpu(const vector<Blob<Dtype>*>& bottom,