From: 남궁석/On-Device Lab(SR)/Engineer/삼성전자 Date: Mon, 19 Aug 2019 07:37:29 +0000 (+0900) Subject: [moco-tf] Support TFSoftmax Canonicalization (#6672) X-Git-Tag: accepted/tizen/unified/20190903.052428~334 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=baa625ff5d1eaf9407a7b15f8099cec605ec9215;p=platform%2Fcore%2Fml%2Fnnfw.git [moco-tf] Support TFSoftmax Canonicalization (#6672) * [moco-tf] Support TFSoftmax Canonicalization This commit will enable TFSoftmax Canonicalization Signed-off-by: Seok NamKoong * remove comment --- diff --git a/compiler/moco-tf/src/Canonicalization/SoftmaxCanonicalizer.cpp b/compiler/moco-tf/src/Canonicalization/SoftmaxCanonicalizer.cpp new file mode 100644 index 0000000..3b5043f --- /dev/null +++ b/compiler/moco-tf/src/Canonicalization/SoftmaxCanonicalizer.cpp @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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 "SoftmaxCanonicalizer.h" + +#include "Annotations/ShapeInferenceData.h" + +#include "Dialect/TFDialect.h" +#include "Dialect/TFNodes.h" +#include "Dialect/TFNodeVisitor.h" +#include "Dialect/TFNodeImpl.h" + +#include + +namespace +{ + +bool canonicalize_softmax(loco::Graph *graph, moco::tf::TFSoftmax *node) +{ + LOGGER(l); + + INFO(l) << "TFNodeCanonicalize TFSoftmax begin"; + + /** + * This will replace shape inferred TFSoftmax node into canonical TensorSoftmax + * + * Before + * In ---- TFSoftmax ---- Out(s) + * + * After + * ------ TFSoftmax + * / + * In ---- TensorSoftmax ----- Out(s) + */ + + auto softmax_shape = node->annot(); + + // Canonicalization into TensorSoftmax is valid when softmax has shape info + assert(softmax_shape); + + auto softmax_tensor_shape = softmax_shape->tensor_shape(); + + // Create loco node to replace + auto softmax = graph->nodes()->create(); + + // replace + auto in = node->logits(); + softmax->input(in); + softmax->axis(softmax_tensor_shape.rank() - 1); + replace(node).with(softmax); + + INFO(l) << "TFNodeCanonicalize TFSoftmax done"; + + return true; +} + +} // namespace + +namespace moco +{ +namespace tf +{ + +bool SoftmaxCanonicalizer::run(loco::Graph *graph) +{ + auto active_nodes = loco::active_nodes(loco::output_nodes(graph)); + bool changed = false; + + for (auto node : active_nodes) + { + if (node->dialect() == TFDialect::get()) + { + auto tf_softmax = dynamic_cast(node); + if (tf_softmax != nullptr) + { + if (canonicalize_softmax(graph, tf_softmax)) + changed = true; + } + } + } + + return changed; +} + +} // namespace tf +} // namespace moco diff --git a/compiler/moco-tf/src/Canonicalization/SoftmaxCanonicalizer.h b/compiler/moco-tf/src/Canonicalization/SoftmaxCanonicalizer.h new file mode 100644 index 0000000..6debf41 --- /dev/null +++ b/compiler/moco-tf/src/Canonicalization/SoftmaxCanonicalizer.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + +#ifndef __MOCO_TF_SOFTMAX_CANONICALIZER_H__ +#define __MOCO_TF_SOFTMAx_CANONICALIZER_H__ + +#include "Transform.h" + +#include + +namespace moco +{ +namespace tf +{ + +/** +* @brief Canonicalize TF-dialect TFSoftmax into canonical Softmax node +*/ +class SoftmaxCanonicalizer : public Transform +{ +public: + const char *name(void) const final { return "SoftmaxCanonicalizer"; } + +public: + bool run(loco::Graph *graph) override; +}; + +} // namespace tf +} // namespace moco + +#endif // __MOCO_TF_SOFTMAX_CANONICALIZER_H__ diff --git a/compiler/moco-tf/src/Canonicalizer.cpp b/compiler/moco-tf/src/Canonicalizer.cpp index f33a2f5..163424e 100644 --- a/compiler/moco-tf/src/Canonicalizer.cpp +++ b/compiler/moco-tf/src/Canonicalizer.cpp @@ -34,6 +34,7 @@ #include "Canonicalization/ReluCanonicalizer.h" #include "Canonicalization/Relu6Canonicalizer.h" #include "Canonicalization/ReshapeCanonicalizer.h" +#include "Canonicalization/SoftmaxCanonicalizer.h" #include "Canonicalization/SqrtCanonicalizer.h" #include "Canonicalization/SquaredDifferenceCanonicalizer.h" #include "Canonicalization/SqueezeCanonicalizer.h" @@ -91,6 +92,7 @@ void Canonicalizer::canonicalize(loco::Graph *g) const phase.emplace_back(stdex::make_unique()); phase.emplace_back(stdex::make_unique()); phase.emplace_back(stdex::make_unique()); + phase.emplace_back(stdex::make_unique()); phase.emplace_back(stdex::make_unique()); phase.emplace_back(stdex::make_unique()); phase.emplace_back(stdex::make_unique());