From: 박종현/동작제어Lab(SR)/Staff Engineer/삼성전자 Date: Wed, 5 Sep 2018 06:19:38 +0000 (+0900) Subject: [enco] Build AvgPool2D op from caffe model (#1341) X-Git-Tag: nncc_backup~1939 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ce03d0f6349f13dcb1340f447eb7fa7bc2ef8fbe;p=platform%2Fcore%2Fml%2Fnnfw.git [enco] Build AvgPool2D op from caffe model (#1341) With this commit, enco caffe frontend is now able to build a simple AvgPool2D op from caffe model. Signed-off-by: Jonghyun Park --- diff --git a/contrib/enco/frontend/caffe/src/Frontend.cpp b/contrib/enco/frontend/caffe/src/Frontend.cpp index b424e9d..ab9ab95 100644 --- a/contrib/enco/frontend/caffe/src/Frontend.cpp +++ b/contrib/enco/frontend/caffe/src/Frontend.cpp @@ -295,17 +295,39 @@ enco::Bundle Frontend::load(void) const ofm_obj->bag(ofm_bag); ofm_obj->reorder(); - // TODO Support other pooling method - assert(!param.has_pool() || (param.pool() == ::caffe::PoolingParameter_PoolMethod_MAX)); + using PoolingOpBuilder = std::function; - // Create a MaxPool2D op - auto op = m->entity()->op()->create(); + std::map builders; - op->window()->vertical(spec.window_height()); - op->window()->horizontal(spec.window_width()); + // MaxPool2D op builder + builders[PoolingMethod::Max] = [](coco::Module *m, const PoolingSpec &spec) { + auto op = m->entity()->op()->create(); - op->stride()->vertical(spec.vertical_stride()); - op->stride()->horizontal(spec.horizontal_stride()); + op->window()->vertical(spec.window_height()); + op->window()->horizontal(spec.window_width()); + + op->stride()->vertical(spec.vertical_stride()); + op->stride()->horizontal(spec.horizontal_stride()); + + return op; + }; + + // AvgPool2D op builder + builders[PoolingMethod::Avg] = [](coco::Module *m, const PoolingSpec &spec) { + auto op = m->entity()->op()->create(); + + op->window()->vertical(spec.window_height()); + op->window()->horizontal(spec.window_height()); + + assert(spec.vertical_stride() == 1); + assert(spec.horizontal_stride() == 1); + + return op; + }; + + // Create a pooling op + auto builder = builders.at(spec.method()); + auto op = builder(m.get(), spec); // Create a UnitF instruction auto ins = m->entity()->instr()->create();