1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
5 #include <gtest/gtest.h>
7 #include <ie_builders.hpp>
8 #include <builders/ie_convolution_layer.hpp>
10 #include "builder_test.hpp"
12 using namespace testing;
13 using namespace InferenceEngine;
15 class ConvolutionLayerBuilderTest : public BuilderTestCommon {};
17 TEST_F(ConvolutionLayerBuilderTest, cannotCreateConvolutionWithoutWeight) {
18 Builder::Network network("Test");
20 Builder::ConvolutionLayer convBuilder("Convolution");
21 convBuilder.setStrides({4, 4});
22 convBuilder.setKernel({11, 11});
23 convBuilder.setOutDepth(96);
24 convBuilder.setInputPort(Port({1, 3, 225, 225}));
25 convBuilder.setDilation({1, 1});
26 size_t ind = network.addLayer(convBuilder);
27 ASSERT_THROW(network.getLayer(ind)->validate(false), InferenceEngine::details::InferenceEngineException);
30 TEST_F(ConvolutionLayerBuilderTest, getExistsLayerFromNetworkBuilderWithInputPort) {
31 Builder::Network network("Test");
32 Builder::ConvolutionLayer convBuilder("Convolution");
34 convBuilder.setStrides({4, 4});
35 convBuilder.setKernel({11, 11});
36 convBuilder.setOutDepth(96);
37 convBuilder.setInputPort(Port({1, 3, 225, 225}));
38 convBuilder.setDilation({1, 1});
40 idx_t convId = network.addLayer(convBuilder);
42 idx_t weightsId = network.addLayer(Builder::ConstLayer("weights").setData(generateBlob(Precision::FP32, {96, 3, 11, 11}, Layout::OIHW)));
43 network.connect({weightsId}, {convId, 1});
45 idx_t biasesId = network.addLayer(Builder::ConstLayer("biases").setData(generateBlob(Precision::FP32, {96}, Layout::C)));
46 network.connect({biasesId}, {convId, 2});
48 Builder::ConvolutionLayer convBuilderFromNetwork(network.getLayer(convId));
50 ASSERT_EQ(convBuilderFromNetwork.getStrides(), convBuilder.getStrides());
51 ASSERT_EQ(convBuilderFromNetwork.getKernel(), convBuilder.getKernel());
52 ASSERT_EQ(convBuilderFromNetwork.getPaddingsEnd(), convBuilder.getPaddingsEnd());
53 ASSERT_EQ(convBuilderFromNetwork.getPaddingsBegin(), convBuilder.getPaddingsBegin());
54 ASSERT_EQ(convBuilderFromNetwork.getOutDepth(), convBuilder.getOutDepth());
55 ASSERT_EQ(convBuilderFromNetwork.getDilation(), convBuilder.getDilation());
58 TEST_F(ConvolutionLayerBuilderTest, getExistsLayerFromNetworkBuilderWithoutInputPort) {
59 Builder::Network network("Test");
60 Builder::ConvolutionLayer convBuilder("Convolution");
62 convBuilder.setStrides({4, 4});
63 convBuilder.setKernel({11, 11});
64 convBuilder.setOutDepth(96);
65 convBuilder.setDilation({1, 1});
67 idx_t convId = network.addLayer(convBuilder);
69 idx_t weightsId = network.addLayer(Builder::ConstLayer("weights").setData(generateBlob(Precision::FP32, {96, 3, 11, 11}, Layout::OIHW)));
70 network.connect({weightsId}, {convId, 1});
72 idx_t biasesId = network.addLayer(Builder::ConstLayer("biases").setData(generateBlob(Precision::FP32, {96}, Layout::C)));
73 network.connect({biasesId}, {convId, 2});
75 Builder::ConvolutionLayer convBuilderFromNetwork(network.getLayer(convId));
77 ASSERT_EQ(convBuilderFromNetwork.getStrides(), convBuilder.getStrides());
78 ASSERT_EQ(convBuilderFromNetwork.getKernel(), convBuilder.getKernel());
79 ASSERT_EQ(convBuilderFromNetwork.getPaddingsEnd(), convBuilder.getPaddingsEnd());
80 ASSERT_EQ(convBuilderFromNetwork.getPaddingsBegin(), convBuilder.getPaddingsBegin());
81 ASSERT_EQ(convBuilderFromNetwork.getOutDepth(), convBuilder.getOutDepth());
82 ASSERT_EQ(convBuilderFromNetwork.getDilation(), convBuilder.getDilation());
85 TEST_F(ConvolutionLayerBuilderTest, cannotCreateConvolutionWithWrongNumberOfInputChannels) {
86 Builder::Network network("Test");
87 Builder::ConvolutionLayer convBuilder("Convolution");
89 convBuilder.setStrides({4, 4});
90 convBuilder.setKernel({11, 11});
91 convBuilder.setOutDepth(96);
92 convBuilder.setInputPort(Port({1, 64, 225, 225})); // here
94 idx_t convId = network.addLayer(convBuilder);
96 idx_t weightsId = network.addLayer(Builder::ConstLayer("weights").setData(generateBlob(Precision::FP32, {96, 3, 11, 11}, Layout::OIHW)));
97 network.connect({weightsId}, {convId, 1});
99 idx_t biasesId = network.addLayer(Builder::ConstLayer("biases").setData(generateBlob(Precision::FP32, {96}, Layout::C)));
100 network.connect({biasesId}, {convId, 2});
102 ASSERT_THROW(network.getLayer(convId)->validate(false), InferenceEngine::details::InferenceEngineException);
105 TEST_F(ConvolutionLayerBuilderTest, canCreateCorrcetConvolution) {
106 Builder::Network network("Test");
107 Builder::ConvolutionLayer convBuilder("Convolution");
109 convBuilder.setStrides({4, 4});
110 convBuilder.setKernel({11, 11});
111 convBuilder.setOutDepth(96);
112 convBuilder.setInputPort(Port({1, 3, 225, 225})); // here
114 idx_t convId = network.addLayer(convBuilder);
116 idx_t weightsId = network.addLayer(Builder::ConstLayer("weights").setData(generateBlob(Precision::FP32, {96, 3, 11, 11}, Layout::OIHW)));
117 network.connect({weightsId}, {convId, 1});
119 idx_t biasesId = network.addLayer(Builder::ConstLayer("biases").setData(generateBlob(Precision::FP32, {96}, Layout::C)));
120 network.connect({biasesId}, {convId, 2});
122 ASSERT_NO_THROW(network.getLayer(convId)->validate(false));
125 TEST_F(ConvolutionLayerBuilderTest, cannotCreateConvolutionWithGroup) {
126 Builder::Network network("Test");
127 Builder::ConvolutionLayer convBuilder("Convolution");
129 convBuilder.setStrides({4, 4});
130 convBuilder.setKernel({11, 11});
131 convBuilder.setOutDepth(96);
132 convBuilder.setGroup(2);
133 convBuilder.setInputPort(Port({1, 6, 225, 225}));
135 idx_t convId = network.addLayer(convBuilder);
137 idx_t weightsId = network.addLayer(Builder::ConstLayer("weights").setData(generateBlob(Precision::FP32, {96, 6, 11, 11}, Layout::OIHW)));
138 // should be {96, 6 / 2, 11, 11}
139 network.connect({weightsId}, {convId, 1});
141 idx_t biasesId = network.addLayer(Builder::ConstLayer("biases").setData(generateBlob(Precision::FP32, {96}, Layout::C)));
142 network.connect({biasesId}, {convId, 2});
144 ASSERT_THROW(network.getLayer(convId)->validate(false), InferenceEngine::details::InferenceEngineException);
147 TEST_F(ConvolutionLayerBuilderTest, canCreateConvolution) {
148 Builder::Network network("Test");
149 Builder::ConvolutionLayer convBuilder("Convolution");
151 convBuilder.setStrides({4, 4});
152 convBuilder.setKernel({11, 11});
153 convBuilder.setOutDepth(96);
154 convBuilder.setGroup(2);
155 convBuilder.setInputPort(Port({1, 6, 225, 225})); // here
157 idx_t convId = network.addLayer(convBuilder);
159 idx_t weightsId = network.addLayer(Builder::ConstLayer("weights").setData(generateBlob(Precision::FP32, {96, 3, 11, 11}, Layout::OIHW)));
160 network.connect({weightsId}, {convId, 1});
162 idx_t biasesId = network.addLayer(Builder::ConstLayer("biases").setData(generateBlob(Precision::FP32, {96}, Layout::C)));
163 network.connect({biasesId}, {convId, 2});
165 ASSERT_NO_THROW(network.getLayer(convId)->validate(false));
168 TEST_F(ConvolutionLayerBuilderTest, cannotCreateConvolutionWithWrongOutDepth) {
169 Builder::Network network("Test");
170 Builder::ConvolutionLayer convBuilder("Convolution");
172 convBuilder.setStrides({4, 4});
173 convBuilder.setKernel({11, 11});
174 convBuilder.setOutDepth(4); // here
175 convBuilder.setInputPort(Port({1, 3, 225, 225}));
177 idx_t convId = network.addLayer(convBuilder);
179 idx_t weightsId = network.addLayer(Builder::ConstLayer("weights").setData(generateBlob(Precision::FP32, {96, 3, 11, 11}, Layout::OIHW)));
180 network.connect({weightsId}, {convId, 1});
182 idx_t biasesId = network.addLayer(Builder::ConstLayer("biases").setData(generateBlob(Precision::FP32, {96}, Layout::C)));
183 network.connect({biasesId}, {convId, 2});
185 ASSERT_THROW(network.getLayer(convId)->validate(false), InferenceEngine::details::InferenceEngineException);
188 TEST_F(ConvolutionLayerBuilderTest, cannotCreateConvolutionWithWrongStrides) {
189 Builder::Network network("Test");
190 Builder::ConvolutionLayer convBuilder("Convolution");
192 convBuilder.setStrides({4, 0}); // here
193 convBuilder.setKernel({11, 11});
194 convBuilder.setOutDepth(96);
195 convBuilder.setInputPort(Port({1, 3, 225, 225}));
196 convBuilder.setPaddingsEnd({0, 0});
197 convBuilder.setPaddingsBegin({0, 0});
198 convBuilder.setDilation({0, 0});
199 ASSERT_THROW(network.addLayer(convBuilder), InferenceEngine::details::InferenceEngineException);
202 TEST_F(ConvolutionLayerBuilderTest, cannotCreateConvolutionWithWrongKernel1) {
203 Builder::Network network("Test");
204 Builder::ConvolutionLayer convBuilder("Convolution");
206 convBuilder.setStrides({4, 4});
207 convBuilder.setKernel({11, 0}); // here
208 convBuilder.setOutDepth(96);
209 convBuilder.setInputPort(Port({1, 3, 225, 225}));
211 ASSERT_THROW(network.addLayer(convBuilder), InferenceEngine::details::InferenceEngineException);
214 TEST_F(ConvolutionLayerBuilderTest, cannotCreateConvolutionWithWrongKernel2) {
215 Builder::Network network("Test");
216 Builder::ConvolutionLayer convBuilder("Convolution");
218 convBuilder.setStrides({4, 4});
219 convBuilder.setKernel({11, 11, 11}); // here
220 convBuilder.setOutDepth(96);
221 convBuilder.setInputPort(Port({1, 3, 225, 225}));
223 ASSERT_THROW(network.addLayer(convBuilder), InferenceEngine::details::InferenceEngineException);
226 TEST_F(ConvolutionLayerBuilderTest, cannotCreateConvolutionWithWrongDilation1) {
227 Builder::Network network("Test");
228 Builder::ConvolutionLayer convBuilder("Convolution");
230 convBuilder.setStrides({4, 4});
231 convBuilder.setKernel({11, 11});
232 convBuilder.setOutDepth(96);
233 convBuilder.setInputPort(Port({1, 3, 225, 225}));
234 convBuilder.setDilation({1, 0}); // here
236 ASSERT_THROW(network.addLayer(convBuilder), InferenceEngine::details::InferenceEngineException);
239 TEST_F(ConvolutionLayerBuilderTest, cannotCreateConvolutionWithWrongDilation2) {
240 Builder::Network network("Test");
241 Builder::ConvolutionLayer convBuilder("Convolution");
243 convBuilder.setStrides({4, 4});
244 convBuilder.setKernel({11, 11});
245 convBuilder.setOutDepth(96);
246 convBuilder.setInputPort(Port({1, 3, 225, 225}));
247 convBuilder.setDilation({1, 1, 1}); // here
249 ASSERT_THROW(network.addLayer(convBuilder), InferenceEngine::details::InferenceEngineException);
252 TEST_F(ConvolutionLayerBuilderTest, canCreateLayerWithNumberOfGroupDividingNumberOfInputChannels) {
253 Builder::Network network("Test");
254 Builder::ConvolutionLayer convLayer("Convolution");
256 size_t weightsId = network.addLayer(Builder::ConstLayer("weights").setData(generateBlob(Precision::FP32, {96, 2, 11, 11}, Layout::OIHW)));
257 size_t biasesId = network.addLayer(Builder::ConstLayer("biases").setData(generateBlob(Precision::FP32, {96}, Layout::C)));
259 convLayer.setStrides({4, 4});
260 convLayer.setKernel({11, 11});
261 convLayer.setOutDepth(96);
262 convLayer.setInputPort(Port({1, 6, 225, 225}));
263 convLayer.setDilation({1, 1});
265 convLayer.setGroup(3);
266 size_t convId = network.addLayer(convLayer);
267 network.connect({weightsId}, {convId, 1});
268 network.connect({biasesId}, {convId, 2});
269 ASSERT_NO_THROW(network.getLayer(convId)->validate(false));
272 TEST_F(ConvolutionLayerBuilderTest, canCreateLayerWithWeightsNotAvailableForGroup) {
273 Builder::Network network("Test");
274 Builder::ConvolutionLayer convLayer("Convolution");
276 size_t weightsId = network.addLayer(Builder::ConstLayer("weights").setData(generateBlob(Precision::FP32, {96, 5, 11, 11}, Layout::OIHW)));
277 size_t biasesId = network.addLayer(Builder::ConstLayer("biases").setData(generateBlob(Precision::FP32, {96}, Layout::C)));
279 convLayer.setStrides({4, 4});
280 convLayer.setKernel({11, 11});
281 convLayer.setOutDepth(96);
282 convLayer.setInputPort(Port({1, 6, 225, 225}));
283 convLayer.setDilation({1, 1});
285 convLayer.setGroup(3);
286 ASSERT_THROW(network.addLayer({{weightsId}, {biasesId}}, convLayer),
287 InferenceEngine::details::InferenceEngineException); // 6 / 3 != 5
290 TEST_F(ConvolutionLayerBuilderTest, cannotCreateLayerWithNumberOfGroupNotDividingNumberOfInputChannels) {
291 Builder::Network network("Test");
292 Builder::ConvolutionLayer convLayer("Convolution");
294 size_t weightsId = network.addLayer(Builder::ConstLayer("weights").setData(generateBlob(Precision::FP32, {96, 2, 11, 11}, Layout::OIHW)));
295 size_t biasesId = network.addLayer(Builder::ConstLayer("biases").setData(generateBlob(Precision::FP32, {96}, Layout::C)));
297 convLayer.setStrides({4, 4});
298 convLayer.setKernel({11, 11});
299 convLayer.setOutDepth(96);
300 convLayer.setInputPort(Port({1, 6, 225, 225}));
301 convLayer.setDilation({1, 1});
303 convLayer.setGroup(4);
304 ASSERT_THROW(network.addLayer({{weightsId}, {biasesId}}, convLayer),
305 InferenceEngine::details::InferenceEngineException); // 6 % 4 == 2