From 5f4ac776d1d18fe445aee46ef9b6a2bf4b21cd49 Mon Sep 17 00:00:00 2001 From: nihuini Date: Fri, 9 Feb 2018 17:17:30 +0800 Subject: [PATCH] implement instancenorm --- src/CMakeLists.txt | 1 + src/layer/instancenorm.cpp | 88 ++++++++++++++++++++++++++++++++++++++ src/layer/instancenorm.h | 45 +++++++++++++++++++ 3 files changed, 134 insertions(+) create mode 100644 src/layer/instancenorm.cpp create mode 100644 src/layer/instancenorm.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3a14d8bdb..ecf3c78b0 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -141,6 +141,7 @@ ncnn_add_layer(DetectionOutput) ncnn_add_layer(Interp) ncnn_add_layer(DeconvolutionDepthWise) ncnn_add_layer(ShuffleChannel) +ncnn_add_layer(InstanceNorm) add_library(ncnn STATIC ${ncnn_SRCS}) diff --git a/src/layer/instancenorm.cpp b/src/layer/instancenorm.cpp new file mode 100644 index 000000000..eba3a97c1 --- /dev/null +++ b/src/layer/instancenorm.cpp @@ -0,0 +1,88 @@ +// Tencent is pleased to support the open source community by making ncnn available. +// +// Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved. +// +// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// https://opensource.org/licenses/BSD-3-Clause +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#include "instancenorm.h" +#include + +namespace ncnn { + +DEFINE_LAYER_CREATOR(InstanceNorm) + +InstanceNorm::InstanceNorm() +{ + one_blob_only = true; + support_inplace = true; +} + +int InstanceNorm::load_param(const ParamDict& pd) +{ + channels = pd.get(0, 0); + eps = pd.get(1, 0.001f); + + return 0; +} + +int InstanceNorm::load_model(const ModelBin& mb) +{ + gamma_data = mb.load(channels, 1); + if (gamma_data.empty()) + return -100; + + beta_data = mb.load(channels, 1); + if (beta_data.empty()) + return -100; + + return 0; +} + +int InstanceNorm::forward_inplace(Mat& bottom_top_blob) const +{ + // x = (x - mean) / (sqrt(var) + eps) * gamma + beta + + int w = bottom_top_blob.w; + int h = bottom_top_blob.h; + int size = w * h; + + #pragma omp parallel for + for (int q=0; q