// Copyright 2018 The MACE Authors. 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 #include #include "mace/ops/ops_test_util.h" namespace mace { namespace ops { namespace test { namespace { template void RunDepthToSpace(const std::vector &input_shape, const std::vector &input_data, const int block_size, const std::vector &expected_shape, const std::vector &expected_data) { OpsTestNet net; net.AddInputFromArray("Input", input_shape, input_data); // Construct graph if (D == DeviceType::CPU) { net.TransformDataFormat( "Input", DataFormat::NHWC, "InputNCHW", DataFormat::NCHW); OpDefBuilder("DepthToSpace", "DepthToSpaceTest") .Input("InputNCHW") .Output("OutputNCHW") .AddIntArg("block_size", block_size) .Finalize(net.NewOperatorDef()); // Run net.RunOp(D); net.TransformDataFormat( "OutputNCHW", DataFormat::NCHW, "Output", DataFormat::NHWC); } else { OpDefBuilder("DepthToSpace", "DepthToSpaceTest") .Input("Input") .Output("Output") .AddIntArg("block_size", block_size) .Finalize(net.NewOperatorDef()); // Run net.RunOp(D); } auto expected = net.CreateTensor(expected_shape, expected_data); ExpectTensorNear(*expected, *net.GetOutput("Output"), 1e-5); } } // namespace class DepthToSpaceOpTest : public OpsTestBase {}; TEST_F(DepthToSpaceOpTest, Input1x2x16_B2_CPU) { RunDepthToSpace( {1, 1, 2, 16}, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}, 2, {1, 2, 4, 4}, {0, 1, 2, 3, 4, 5, 6, 7, 16, 17, 18, 19, 20, 21, 22, 23, 8, 9, 10, 11, 12, 13, 14, 15, 24, 25, 26, 27, 28, 29, 30, 31}); } TEST_F(DepthToSpaceOpTest, Input1x2x16_B2_OPENCL) { RunDepthToSpace( {1, 1, 2, 16}, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}, 2, {1, 2, 4, 4}, {0, 1, 2, 3, 4, 5, 6, 7, 16, 17, 18, 19, 20, 21, 22, 23, 8, 9, 10, 11, 12, 13, 14, 15, 24, 25, 26, 27, 28, 29, 30, 31}); } TEST_F(DepthToSpaceOpTest, Input1x1x16_B2_CPU) { RunDepthToSpace( {1, 1, 1, 16}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}, 2, {1, 2, 2, 4}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}); } TEST_F(DepthToSpaceOpTest, Input1x1x16_B2_OPENCL) { RunDepthToSpace( {1, 1, 1, 16}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}, 2, {1, 2, 2, 4}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}); } TEST_F(DepthToSpaceOpTest, InputLarger_B2_OPENCL) { const std::vector in = std::vector(192 * 192 * 128, 1.0); RunDepthToSpace({1, 192, 192, 128}, in, 2, {1, 384, 384, 32}, in); } namespace { template void RandomTest(const int block_size, const std::vector &shape) { testing::internal::LogToStderr(); srand(time(NULL)); // Construct graph OpsTestNet net; // Add input data net.AddRandomInput("Input", shape); net.TransformDataFormat( "Input", DataFormat::NHWC, "InputNCHW", DataFormat::NCHW); OpDefBuilder("DepthToSpace", "DepthToSpaceTest") .Input("InputNCHW") .AddIntArg("block_size", block_size) .Output("OutputNCHW") .Finalize(net.NewOperatorDef()); // Run net.RunOp(); net.TransformDataFormat( "OutputNCHW", DataFormat::NCHW, "Output", DataFormat::NHWC); OpDefBuilder("DepthToSpace", "DepthToSpaceTest") .Input("Input") .AddIntArg("block_size", block_size) .AddIntArg("T", static_cast(DataTypeToEnum::value)) .Output("GPUOutput") .Finalize(net.NewOperatorDef()); // Run net.RunOp(D); if (DataTypeToEnum::value == DT_FLOAT) { ExpectTensorNear(*net.GetTensor("Output"), *net.GetOutput("GPUOutput"), 1e-5); } else { ExpectTensorNear(*net.GetTensor("Output"), *net.GetOutput("GPUOutput"), 1e-3, 1e-4); } } } // namespace TEST_F(DepthToSpaceOpTest, OPENCLRandomFloat) { RandomTest(2, {1, 192, 192, 128}); } TEST_F(DepthToSpaceOpTest, OPENCLRandomHalf) { RandomTest(2, {1, 192, 192, 128}); } } // namespace test } // namespace ops } // namespace mace