2 // Copyright (c) 2018 Intel Corporation
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
8 // http://www.apache.org/licenses/LICENSE-2.0
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
17 ///////////////////////////////////////////////////////////////////////////////////////////////////
18 #include <gtest/gtest.h>
19 #include "api/CPP/memory.hpp"
20 #include <api/CPP/input_layout.hpp>
21 #include "api/CPP/max_unpooling.hpp"
22 #include <api/CPP/topology.hpp>
23 #include <api/CPP/network.hpp>
24 #include <api/CPP/engine.hpp>
25 #include "test_utils/test_utils.h"
26 #include <api/CPP/reorder.hpp>
27 #include <api/CPP/data.hpp>
28 #include <api/CPP/mutable_data.hpp>
29 #include <api/CPP/pooling.hpp>
30 #include "test_utils/float16.h"
32 using namespace cldnn;
33 using namespace tests;
35 TEST(max_unpooling_gpu, basic_in2x3x2x2) {
40 // Forward Max Pooling Input:
41 // f0: b0: 1 2 -10 b1: 0 0 -11
42 // f0: b0: 3 4 -14 b1: 0.5 -0.5 -15
43 // f1: b0: 5 6 -12 b1: 1.5 5.2 -13
44 // f1: b0: 7 8 16 b1: 12 9 17
47 // f0: b0: 4 4 b1: 0.5 0
48 // f1: b0: 8 16 b1: 12 17
51 // f0: b0: 4 4 b1: 15 13
52 // f1: b0: 10 11 b1: 21 23
55 // f0: b0: 0 0 0 b1: 0 0 0
56 // f0: b0: 0 4 0 b1: 0.5 0 0
57 // f1: b0: 0 0 0 b1: 0 0 0
58 // f1: b0: 0 8 16 b1: 12 0 17
60 const auto& engine = get_test_engine();
62 auto input = memory::allocate(engine, { data_types::f32, format::bfyx, { 2, 2, 2, 1 } });
63 auto arg_max = memory::allocate(engine, { data_types::f32, format::bfyx,{ 2, 2, 2, 1 } });
80 topology.add(input_layout("input", input.get_layout()));
81 topology.add(data("arg_max", arg_max));
82 topology.add(max_unpooling("max_unpooling", "input", "arg_max", { 1, 1, 2, 2 }, { 1, 1, 1, 1 }));
84 network network(engine, topology);
86 network.set_input_data("input", input);
88 auto outputs = network.execute();
90 auto output = outputs.at("max_unpooling").get_memory();
91 auto output_ptr = output.pointer<float>();
92 auto output_layout = output.get_layout();
94 EXPECT_EQ(output_layout.format, format::bfyx);
95 EXPECT_EQ(output_layout.size.spatial[1], 2);
96 EXPECT_EQ(output_layout.size.spatial[0], 3);
97 EXPECT_EQ(output_layout.size.feature[0], 2);
98 EXPECT_EQ(output_layout.size.batch[0], 2);
100 std::vector<float> expected_output_vec = {
111 for (size_t i = 0; i < expected_output_vec.size(); ++i) {
112 EXPECT_EQ(expected_output_vec[i], output_ptr[i]);
116 TEST(max_unpooling_gpu, basic_in2x3x2x2_output_padding) {
120 // Output Padding : 0x0x1x1
122 // Forward Max Pooling Input:
123 // f0: b0: 1 2 -10 b1: 0 0 -11
124 // f0: b0: 3 4 -14 b1: 0.5 -0.5 -15
125 // f1: b0: 5 6 -12 b1: 1.5 5.2 -13
126 // f1: b0: 7 8 16 b1: 12 9 17
129 // f0: b0: 4 4 b1: 0.5 0
130 // f1: b0: 8 16 b1: 12 17
133 // f0: b0: 4 4 b1: 15 13
134 // f1: b0: 10 11 b1: 21 23
137 // f0: b0: 0 0 0 b1: 0 0 0
138 // f0: b0: 0 4 0 b1: 0.5 0 0
139 // f1: b0: 0 0 0 b1: 0 0 0
140 // f1: b0: 0 8 16 b1: 12 0 17
142 const auto& engine = get_test_engine();
144 auto input = memory::allocate(engine, { data_types::f32, format::bfyx,{ 2, 2, 2, 1 } });
145 auto arg_max = memory::allocate(engine, { data_types::f32, format::bfyx,{ 2, 2, 2, 1 } });
154 set_values(arg_max, {
162 topology.add(input_layout("input", input.get_layout()));
163 topology.add(data("arg_max", arg_max));
164 topology.add(max_unpooling("max_unpooling", "input", "arg_max", { 1, 1, 2, 2 }, { 1, 1, 1, 1 }, { 0, 0, 0, 0 }, padding({ 0, 0, 1, 1 }, 0)));
166 network network(engine, topology);
168 network.set_input_data("input", input);
170 auto outputs = network.execute();
172 auto output = outputs.at("max_unpooling").get_memory();
173 auto output_ptr = output.pointer<float>();
174 auto output_layout = output.get_layout();
176 EXPECT_EQ(output_layout.format, format::bfyx);
177 EXPECT_EQ(output_layout.size.spatial[1], 2);
178 EXPECT_EQ(output_layout.size.spatial[0], 3);
179 EXPECT_EQ(output_layout.size.feature[0], 2);
180 EXPECT_EQ(output_layout.size.batch[0], 2);
182 std::vector<float> expected_output_vec = {
183 0.f, 0.f, 0.f, 0.f, 0.f,
184 0.f, 0.f, 0.f, 0.f, 0.f,
185 0.f, 0.f, 4.f, 0.f, 0.f,
186 0.f, 0.f, 0.f, 0.f, 0.f,
187 0.f, 0.f, 0.f, 0.f, 0.f,
188 0.f, 0.f, 0.f, 0.f, 0.f,
189 0.f, 0.f, 8.f, 16.f, 0.f,
190 0.f, 0.f, 0.f, 0.f, 0.f,
191 0.f, 0.f, 0.f, 0.f, 0.f,
192 0.f, 0.f, 0.f, 0.f, 0.f,
193 0.f, 0.5f, 0.f, 0.f, 0.f,
194 0.f, 0.f, 0.f, 0.f, 0.f,
195 0.f, 0.f, 0.f, 0.f, 0.f,
196 0.f, 0.f, 0.f, 0.f, 0.f,
197 0.f, 12.f, 0.f, 17.f, 0.f,
198 0.f, 0.f, 0.f, 0.f, 0.f,
200 std::vector<float> out;
201 for (size_t i = 0; i < expected_output_vec.size(); ++i) {
202 out.push_back(output_ptr[i]);
203 EXPECT_EQ(expected_output_vec[i], output_ptr[i]);
207 TEST(max_unpooling_gpu, basic_in2x3x2x2_output_size) {
211 // Output size explicitly provided
213 // Forward Max Pooling Input:
214 // f0: b0: 1 2 -10 b1: 0 0 -11
215 // f0: b0: 3 4 -14 b1: 0.5 -0.5 -15
216 // f1: b0: 5 6 -12 b1: 1.5 5.2 -13
217 // f1: b0: 7 8 16 b1: 12 9 17
220 // f0: b0: 4 4 b1: 0.5 0
221 // f1: b0: 8 16 b1: 12 17
224 // f0: b0: 4 4 b1: 15 13
225 // f1: b0: 10 11 b1: 21 23
228 // f0: b0: 0 0 0 b1: 0 0 0
229 // f0: b0: 0 4 0 b1: 0.5 0 0
230 // f1: b0: 0 0 0 b1: 0 0 0
231 // f1: b0: 0 8 16 b1: 12 0 17
233 const auto& engine = get_test_engine();
235 auto input = memory::allocate(engine, { data_types::f32, format::bfyx,{ 2, 2, 2, 1 } });
236 auto arg_max = memory::allocate(engine, { data_types::f32, format::bfyx,{ 2, 2, 2, 1 } });
245 set_values(arg_max, {
253 topology.add(input_layout("input", input.get_layout()));
254 topology.add(data("arg_max", arg_max));
255 topology.add(max_unpooling("max_unpooling", "input", "arg_max", {2, 2, 3, 2}));
257 network network(engine, topology);
259 network.set_input_data("input", input);
261 auto outputs = network.execute();
263 auto output = outputs.at("max_unpooling").get_memory();
264 auto output_ptr = output.pointer<float>();
265 auto output_layout = output.get_layout();
267 EXPECT_EQ(output_layout.format, format::bfyx);
268 EXPECT_EQ(output_layout.size.spatial[1], 2);
269 EXPECT_EQ(output_layout.size.spatial[0], 3);
270 EXPECT_EQ(output_layout.size.feature[0], 2);
271 EXPECT_EQ(output_layout.size.batch[0], 2);
273 std::vector<float> expected_output_vec = {
283 for (size_t i = 0; i < expected_output_vec.size(); ++i) {
284 EXPECT_EQ(expected_output_vec[i], output_ptr[i]);
288 TEST(max_unpooling_gpu, basic_in2x3x2x2_fp16) {
292 // Input values in fp16
294 // Forward Max Pooling Input:
295 // f0: b0: 1 2 -10 b1: 0 0 -11
296 // f0: b0: 3 4 -14 b1: 0.5 -0.5 -15
297 // f1: b0: 5 6 -12 b1: 1.5 5.2 -13
298 // f1: b0: 7 8 16 b1: 12 9 17
301 // f0: b0: 4 4 b1: 0.5 0
302 // f1: b0: 8 16 b1: 12 17
305 // f0: b0: 4 4 b1: 15 13
306 // f1: b0: 10 11 b1: 21 23
309 // f0: b0: 0 0 0 b1: 0 0 0
310 // f0: b0: 0 4 0 b1: 0.5 0 0
311 // f1: b0: 0 0 0 b1: 0 0 0
312 // f1: b0: 0 8 16 b1: 12 0 17
314 const auto& engine = get_test_engine();
316 auto input = memory::allocate(engine, { data_types::f16, format::bfyx,{ 2, 2, 2, 1 } });
317 auto arg_max = memory::allocate(engine, { data_types::f32, format::bfyx,{ 2, 2, 2, 1 } });
320 FLOAT16(4.0f), FLOAT16(4.0f),
321 FLOAT16(8.0f), FLOAT16(16.0f),
322 FLOAT16(0.5f), FLOAT16(0.0f),
323 FLOAT16(12.0f), FLOAT16(17.0f)
326 set_values(arg_max, {
334 topology.add(input_layout("input", input.get_layout()));
335 topology.add(data("arg_max", arg_max));
336 topology.add(max_unpooling("max_unpooling", "input", "arg_max", { 1, 1, 2, 2 }, { 1, 1, 1, 1 }));
338 network network(engine, topology);
340 network.set_input_data("input", input);
342 auto outputs = network.execute();
344 auto output = outputs.at("max_unpooling").get_memory();
345 auto output_ptr = output.pointer<uint16_t>();
346 auto output_layout = output.get_layout();
348 EXPECT_EQ(output_layout.format, format::bfyx);
349 EXPECT_EQ(output_layout.size.spatial[1], 2);
350 EXPECT_EQ(output_layout.size.spatial[0], 3);
351 EXPECT_EQ(output_layout.size.feature[0], 2);
352 EXPECT_EQ(output_layout.size.batch[0], 2);
354 std::vector<float> expected_output_vec = {
364 for (size_t i = 0; i < expected_output_vec.size(); ++i) {
365 EXPECT_EQ(expected_output_vec[i], float16_to_float32(output_ptr[i]));
369 TEST(max_unpooling_gpu, basic_in2x2x3x2_max_with_argmax_pooling_unpooling) {
374 // Forward Max Pooling Input:
375 // f0: b0: 1 2 -10 b1: 0 0 -11
376 // f0: b0: 3 4 -14 b1: 0.5 -0.5 -15
377 // f1: b0: 5 6 -12 b1: 1.5 5.2 -13
378 // f1: b0: 7 8 16 b1: 12 9 17
380 // Forward Max Pooling Output:
381 // f0: b0: 4 4 b1: 0.5 0
382 // f1: b0: 8 16 b1: 12 17
385 // f0: b0: 4 4 b1: 15 13
386 // f1: b0: 10 11 b1: 21 23
389 // f0: b0: 0 0 0 b1: 0 0 0
390 // f0: b0: 0 4 0 b1: 0.5 0 0
391 // f1: b0: 0 0 0 b1: 0 0 0
392 // f1: b0: 0 8 16 b1: 12 0 17
395 const auto& engine = get_test_engine();
397 auto input = memory::allocate(engine, { data_types::f32, format::bfyx,{ 2, 2, 3, 2 } });
398 auto arg_max = memory::allocate(engine, { data_types::f32, format::bfyx,{ 2, 2, 2, 1 } });
412 topology.add(input_layout("input", input.get_layout()));
413 topology.add(mutable_data("arg_max", arg_max));
414 topology.add(pooling("pooling_max_with_argmax", "input", "arg_max", pooling_mode::max_with_argmax, { 1, 1, 2, 2 }, { 1, 1, 1, 1 }));
415 topology.add(max_unpooling("max_unpooling", "pooling_max_with_argmax", "arg_max", { 1, 1, 2, 2 }, { 1, 1, 1, 1 }));
417 network network(engine, topology);
419 network.set_input_data("input", input);
421 auto outputs = network.execute();
423 auto output = outputs.at("max_unpooling").get_memory();
424 auto output_ptr = output.pointer<float>();
425 auto output_layout = output.get_layout();
426 auto argmax_ptr = arg_max.pointer<float>();
428 EXPECT_EQ(output_layout.format, format::bfyx);
429 EXPECT_EQ(output_layout.size.spatial[1], 2);
430 EXPECT_EQ(output_layout.size.spatial[0], 3);
431 EXPECT_EQ(output_layout.size.feature[0], 2);
432 EXPECT_EQ(output_layout.size.batch[0], 2);
434 std::vector<float> expected_argmax_vec = {
441 std::vector<float> expected_output_vec = {
452 for (size_t i = 0; i < expected_output_vec.size(); ++i) {
453 EXPECT_EQ(expected_output_vec[i], output_ptr[i]);
456 for (size_t i = 0; i < expected_argmax_vec.size(); ++i) {
457 EXPECT_EQ(expected_argmax_vec[i], argmax_ptr[i]);