[caffegen] Support Convolution Paramater Randomize (#112)
author박종현/동작제어Lab(SR)/Senior Engineer/삼성전자 <jh1302.park@samsung.com>
Fri, 20 Apr 2018 05:48:06 +0000 (14:48 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Fri, 20 Apr 2018 05:48:06 +0000 (14:48 +0900)
This commit supports randomization on parameters of convolution layer.

Signed-off-by: Jonghyun Park <jh1302.park@samsung.com>
contrib/caffegen/src/LayerResolver.cpp
contrib/caffegen/src/ParameterRandomizePass.cpp

index 1494383..85849d6 100644 (file)
@@ -1,5 +1,6 @@
 #include "LayerResolver.h"
 #include "InputLayer.h"
+#include "ConvolutionLayer.h"
 
 #include <nncc/foundation/Memory.h>
 
@@ -19,6 +20,7 @@ template<typename T> std::unique_ptr<LayerFactory> make_factory(void)
 LayerResolver::LayerResolver()
 {
   _factories["Input"] = make_factory<InputLayer>();
+  _factories["Convolution"] = make_factory<ConvolutionLayer>();
 }
 
 const LayerFactory &LayerResolver::resolve(const std::string &type) const
index 1d63ab2..d2c017f 100644 (file)
@@ -14,7 +14,63 @@ void ParameterRandomizePass::visit(InputLayer &)
   return;
 }
 
-void ParameterRandomizePass::visit(ConvolutionLayer &)
+void ParameterRandomizePass::visit(ConvolutionLayer &l)
 {
-  throw std::runtime_error{"Not supported, yet"};
+  assert(l.param().blobs_size() == 0);
+
+  caffe::ConvolutionParameter *conv_param = l.param().mutable_convolution_param();
+
+  auto element_count = [] (caffe::BlobShape &shape)
+  {
+    assert(shape.dim_size() > 0);
+
+    int64_t count = 1;
+
+    for (int axis = 0; axis < shape.dim_size(); ++axis)
+    {
+      count *= shape.dim(axis);
+    }
+
+    return count;
+  };
+
+  //
+  // Fill Kernel
+  //
+  caffe::BlobProto *weight_blob = l.param().add_blobs();
+  caffe::BlobShape *weight_shape = weight_blob->mutable_shape();
+
+  weight_shape->add_dim(l.num_effective_output());
+  weight_shape->add_dim(l.input_shape().dim(l.channel_axis()));
+
+  for (int spatial_axis = 0; spatial_axis < l.num_spatial_axes(); ++spatial_axis)
+  {
+    const auto kernel_dim = l.kernel_size(spatial_axis);
+    weight_shape->add_dim(kernel_dim);
+  }
+
+  // TODO Allow users to set mean and stddev
+  std::normal_distribution<float> weight_distribution(0.0f, 2.0f);
+
+  for (int64_t n = 0; n < element_count(*weight_shape); ++n)
+  {
+    weight_blob->add_data(weight_distribution(_generator));
+  }
+
+  //
+  // Fill Bias
+  //
+  assert(conv_param->bias_term());
+  caffe::BlobProto *bias_blob = l.param().add_blobs();
+  caffe::BlobShape *bias_shape = bias_blob->mutable_shape();
+
+  bias_shape->add_dim(l.num_effective_output());
+
+  // TODO Allow users to set mean and stddev
+  std::normal_distribution<float> bias_distribution(0.0f, 16.0f);
+
+  for (int64_t n = 0; n < element_count(*bias_shape); ++n)
+  {
+    bias_blob->add_data(bias_distribution(_generator));
+  }
 }