Publishing 2019 R1 content
[platform/upstream/dldt.git] / inference-engine / src / inference_engine / builders / ie_lrn_layer.cpp
1 // Copyright (C) 2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
3 //
4
5 #include <builders/ie_lrn_layer.hpp>
6 #include <ie_cnn_layer_builder.h>
7
8 #include <string>
9
10 using namespace InferenceEngine;
11
12 Builder::LRNLayer::LRNLayer(const std::string& name): LayerDecorator("LRN", name) {
13     getLayer()->getOutputPorts().resize(1);
14     getLayer()->getInputPorts().resize(1);
15     setSize(1);
16     setAlpha(1e-4);
17     setBeta(0.75f);
18     setBias(1.0f);
19 }
20
21 Builder::LRNLayer::LRNLayer(const Layer::Ptr& layer): LayerDecorator(layer) {
22     checkType("LRN");
23 }
24
25 Builder::LRNLayer::LRNLayer(const Layer::CPtr& layer): LayerDecorator(layer) {
26     checkType("LRN");
27 }
28
29 Builder::LRNLayer& Builder::LRNLayer::setName(const std::string& name) {
30     getLayer()->setName(name);
31     return *this;
32 }
33
34 const Port& Builder::LRNLayer::getPort() const {
35     return getLayer()->getOutputPorts()[0];
36 }
37
38 Builder::LRNLayer& Builder::LRNLayer::setPort(const Port &port) {
39     getLayer()->getOutputPorts()[0] = port;
40     getLayer()->getInputPorts()[0] = port;
41     return *this;
42 }
43
44 size_t Builder::LRNLayer::getSize() const {
45     return getLayer()->getParameters().at("size");
46 }
47
48 Builder::LRNLayer& Builder::LRNLayer::setSize(size_t size) {
49     getLayer()->getParameters()["size"] = size;
50     return *this;
51 }
52
53 float Builder::LRNLayer::getAlpha() const {
54     return getLayer()->getParameters().at("alpha");
55 }
56
57 Builder::LRNLayer& Builder::LRNLayer::setAlpha(float alpha) {
58     getLayer()->getParameters()["alpha"] = alpha;
59     return *this;
60 }
61
62 float Builder::LRNLayer::getBeta() const {
63     return getLayer()->getParameters().at("beta");
64 }
65
66 Builder::LRNLayer& Builder::LRNLayer::setBeta(float beta) {
67     getLayer()->getParameters()["beta"] = beta;
68     return *this;
69 }
70
71 float Builder::LRNLayer::getBias() const {
72     return getLayer()->getParameters().at("bias");
73 }
74
75 Builder::LRNLayer& Builder::LRNLayer::setBias(float bias) {
76     getLayer()->getParameters()["bias"] = bias;
77     return *this;
78 }
79
80 REG_VALIDATOR_FOR(LRN, [](const Builder::Layer::CPtr &input_layer, bool partial) {
81     Builder::LRNLayer layer(input_layer);
82     if (layer.getAlpha() <= 0) {
83         THROW_IE_EXCEPTION << "Alpha should be > 0";
84     }
85     if (layer.getBeta() <= 0) {
86         THROW_IE_EXCEPTION << "Beta should be > 0";
87     }
88     if (layer.getSize() == 0) {
89         THROW_IE_EXCEPTION << "Size should be > 0";
90     }
91     if (!input_layer->getInputPorts().empty() &&
92         !input_layer->getOutputPorts().empty() &&
93         !input_layer->getInputPorts()[0].shape().empty() &&
94         !input_layer->getOutputPorts()[0].shape().empty() &&
95         input_layer->getInputPorts()[0].shape() != input_layer->getOutputPorts()[0].shape()) {
96         THROW_IE_EXCEPTION << "Input and output ports should be equal";
97     }
98 });
99
100 REG_CONVERTER_FOR(LRN, [](const CNNLayerPtr& cnnLayer, Builder::Layer& layer) {
101     layer.getParameters()["bias"] = cnnLayer->GetParamAsFloat("bias", 1.0f);
102     layer.getParameters()["beta"] = cnnLayer->GetParamAsFloat("beta", 0.75f);
103     layer.getParameters()["alpha"] = cnnLayer->GetParamAsFloat("alpha", 1e-4f);
104     layer.getParameters()["size"] = cnnLayer->GetParamAsUInt("size", 1);
105 });