From 3cecba3345f0aba2db01220522b371b5861cd799 Mon Sep 17 00:00:00 2001 From: "Gu, Jinghui" Date: Tue, 30 Apr 2019 15:33:40 +0800 Subject: [PATCH 1/2] implement transpose operator for MKLDNN Signed-off-by: Gu, Jinghui --- .../operators/operator_fallback_ideep.cc | 2 - caffe2/ideep/operators/transpose_op.cc | 35 +++++++++++++++ caffe2/python/ideep/transpose_op_test.py | 43 +++++++++++++++++++ 3 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 caffe2/ideep/operators/transpose_op.cc create mode 100644 caffe2/python/ideep/transpose_op_test.py diff --git a/caffe2/ideep/operators/operator_fallback_ideep.cc b/caffe2/ideep/operators/operator_fallback_ideep.cc index f28a21c2b5293..349898485ca7b 100644 --- a/caffe2/ideep/operators/operator_fallback_ideep.cc +++ b/caffe2/ideep/operators/operator_fallback_ideep.cc @@ -43,7 +43,6 @@ #include #include #include -#include #include #include #include @@ -80,7 +79,6 @@ REGISTER_IDEEP_OPERATOR( IDEEPFallbackOp, SkipIndices<0>>); REGISTER_IDEEP_OPERATOR(Flatten, IDEEPFallbackOp>); REGISTER_IDEEP_OPERATOR(ResizeLike, IDEEPFallbackOp>); -REGISTER_IDEEP_OPERATOR(Transpose, IDEEPFallbackOp>); REGISTER_IDEEP_OPERATOR(Slice, IDEEPFallbackOp>); REGISTER_IDEEP_OPERATOR(Clip, IDEEPFallbackOp>); REGISTER_IDEEP_OPERATOR( diff --git a/caffe2/ideep/operators/transpose_op.cc b/caffe2/ideep/operators/transpose_op.cc new file mode 100644 index 0000000000000..d1833c7716823 --- /dev/null +++ b/caffe2/ideep/operators/transpose_op.cc @@ -0,0 +1,35 @@ +#include + +using namespace caffe2; + +namespace { + +class IDEEPTransposeOp final : public IDEEPOperator { + public: + USE_IDEEP_DEF_ALIASES(); + USE_IDEEP_OPERATOR_FUNCTIONS(); + + IDEEPTransposeOp(const OperatorDef& operator_def, Workspace* ws) + : IDEEPOperator(operator_def, ws), + axes_(this->template GetRepeatedArgument("axes")){ } + ~IDEEPTransposeOp() override {} + + bool RunOnDevice() override { + const auto& X = Input(INPUT); + auto* Y = Output(OUTPUT); + + Y->transpose_from(X, axes_); + + return true; + } + + private: + std::vector axes_; + + INPUT_TAGS(INPUT); + OUTPUT_TAGS(OUTPUT); +}; + +REGISTER_IDEEP_OPERATOR(Transpose, IDEEPTransposeOp); + +} // namespace diff --git a/caffe2/python/ideep/transpose_op_test.py b/caffe2/python/ideep/transpose_op_test.py new file mode 100644 index 0000000000000..590db9bc374c8 --- /dev/null +++ b/caffe2/python/ideep/transpose_op_test.py @@ -0,0 +1,43 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + +import unittest +import hypothesis.strategies as st +from hypothesis import given +import numpy as np +from caffe2.proto import caffe2_pb2 +from caffe2.python import core, workspace +import caffe2.python.hypothesis_test_util as hu +import caffe2.python.ideep_test_util as mu + +@unittest.skipIf(not workspace.C.use_mkldnn, "No MKLDNN support.") +class TransposeTest(hu.HypothesisTestCase): + @given( + X=hu.tensor(min_dim=1, max_dim=5, dtype=np.float32), use_axes=st.booleans(), **mu.gcs) + def test_transpose(self, X, use_axes, gc, dc): + ndim = len(X.shape) + axes = np.arange(ndim) + np.random.shuffle(axes) + + if (use_axes): + op = core.CreateOperator( + "Transpose", ["X"], ["Y"], axes=axes, device_option=gc) + else: + op = core.CreateOperator( + "Transpose", ["X"], ["Y"], device_option=gc) + + def transpose_ref(X): + if use_axes: + return [np.transpose(X, axes=axes)] + else: + return [np.transpose(X)] + + self.assertReferenceChecks(gc, op, [X], transpose_ref) + self.assertDeviceChecks(dc, op, [X], [0]) + self.assertGradientChecks(gc, op, [X], 0, [0]) + + +if __name__ == "__main__": + unittest.main() From 9112f87a958c7853dd37cb90a9d53439e2655c9e Mon Sep 17 00:00:00 2001 From: Jinghui <31264804+gujinghui@users.noreply.github.com> Date: Fri, 31 May 2019 13:39:31 +0800 Subject: [PATCH 2/2] remove extra parenthesis in transpose_op_test.py remove extra parenthesis in transpose_op_test.py --- caffe2/python/ideep/transpose_op_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/caffe2/python/ideep/transpose_op_test.py b/caffe2/python/ideep/transpose_op_test.py index 590db9bc374c8..736e6e8c64648 100644 --- a/caffe2/python/ideep/transpose_op_test.py +++ b/caffe2/python/ideep/transpose_op_test.py @@ -21,7 +21,7 @@ def test_transpose(self, X, use_axes, gc, dc): axes = np.arange(ndim) np.random.shuffle(axes) - if (use_axes): + if use_axes: op = core.CreateOperator( "Transpose", ["X"], ["Y"], axes=axes, device_option=gc) else: