From c57bb2d837dde02aabc399c63d85003296f83818 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=EB=B0=95=EC=A2=85=ED=98=84/=EB=8F=99=EC=9E=91=EC=A0=9C?= =?utf8?q?=EC=96=B4Lab=28SR=29/Senior=20Engineer/=EC=82=BC=EC=84=B1?= =?utf8?q?=EC=A0=84=EC=9E=90?= Date: Fri, 20 Apr 2018 14:48:06 +0900 Subject: [PATCH] [caffegen] Support Convolution Paramater Randomize (#112) This commit supports randomization on parameters of convolution layer. Signed-off-by: Jonghyun Park --- contrib/caffegen/src/LayerResolver.cpp | 2 + contrib/caffegen/src/ParameterRandomizePass.cpp | 60 ++++++++++++++++++++++++- 2 files changed, 60 insertions(+), 2 deletions(-) diff --git a/contrib/caffegen/src/LayerResolver.cpp b/contrib/caffegen/src/LayerResolver.cpp index 1494383..85849d6 100644 --- a/contrib/caffegen/src/LayerResolver.cpp +++ b/contrib/caffegen/src/LayerResolver.cpp @@ -1,5 +1,6 @@ #include "LayerResolver.h" #include "InputLayer.h" +#include "ConvolutionLayer.h" #include @@ -19,6 +20,7 @@ template std::unique_ptr make_factory(void) LayerResolver::LayerResolver() { _factories["Input"] = make_factory(); + _factories["Convolution"] = make_factory(); } const LayerFactory &LayerResolver::resolve(const std::string &type) const diff --git a/contrib/caffegen/src/ParameterRandomizePass.cpp b/contrib/caffegen/src/ParameterRandomizePass.cpp index 1d63ab2..d2c017f 100644 --- a/contrib/caffegen/src/ParameterRandomizePass.cpp +++ b/contrib/caffegen/src/ParameterRandomizePass.cpp @@ -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 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 bias_distribution(0.0f, 16.0f); + + for (int64_t n = 0; n < element_count(*bias_shape); ++n) + { + bias_blob->add_data(bias_distribution(_generator)); + } } -- 2.7.4