• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) Facebook, Inc. and its affiliates.
2 // All rights reserved.
3 //
4 // Copyright 2019 Google LLC
5 //
6 // This source code is licensed under the BSD-style license found in the
7 // LICENSE file in the root directory of this source tree.
8 
9 #pragma once
10 
11 #include <benchmark/benchmark.h>
12 
13 
14 #define BENCHMARK_DWCONV(dwconv_fn) \
15   BENCHMARK_CAPTURE(dwconv_fn, mobilenet_v1, "MobileNet v1")->Apply(MobileNetV1DWConvArguments)->UseRealTime(); \
16   BENCHMARK_CAPTURE(dwconv_fn, mobilenet_v2, "MobileNet v2")->Apply(MobileNetV2DWConvArguments)->UseRealTime(); \
17   BENCHMARK_CAPTURE(dwconv_fn, mobilenet_v3_small, "MobileNet v3 Small")->Apply(MobileNetV3SmallDWConvArguments)->UseRealTime(); \
18   BENCHMARK_CAPTURE(dwconv_fn, mobilenet_v3_large, "MobileNet v3 Large")->Apply(MobileNetV3LargeDWConvArguments)->UseRealTime(); \
19   BENCHMARK_CAPTURE(dwconv_fn, shufflenet_v1_g1, "ShuffleNet v1 (1 group)")->Apply(ShuffleNetV1G1DWConvArguments)->UseRealTime(); \
20   BENCHMARK_CAPTURE(dwconv_fn, shufflenet_v1_g2, "ShuffleNet v1 (2 groups)")->Apply(ShuffleNetV1G2DWConvArguments)->UseRealTime(); \
21   BENCHMARK_CAPTURE(dwconv_fn, shufflenet_v1_g3, "ShuffleNet v1 (3 groups)")->Apply(ShuffleNetV1G3DWConvArguments)->UseRealTime(); \
22   BENCHMARK_CAPTURE(dwconv_fn, shufflenet_v1_g4, "ShuffleNet v1 (4 groups)")->Apply(ShuffleNetV1G4DWConvArguments)->UseRealTime(); \
23   BENCHMARK_CAPTURE(dwconv_fn, shufflenet_v1_g8, "ShuffleNet v1 (8 groups)")->Apply(ShuffleNetV1G8DWConvArguments)->UseRealTime(); \
24   BENCHMARK_CAPTURE(dwconv_fn, shufflenet_v2_x05, "ShuffleNet v2 0.5X")->Apply(ShuffleNetV2X05DWConvArguments)->UseRealTime(); \
25   BENCHMARK_CAPTURE(dwconv_fn, shufflenet_v2_x10, "ShuffleNet v2 1.0X")->Apply(ShuffleNetV2X10DWConvArguments)->UseRealTime(); \
26   BENCHMARK_CAPTURE(dwconv_fn, shufflenet_v2_x15, "ShuffleNet v2 1.5X")->Apply(ShuffleNetV2X15DWConvArguments)->UseRealTime(); \
27   BENCHMARK_CAPTURE(dwconv_fn, shufflenet_v2_x20, "ShuffleNet v2 2.0X")->Apply(ShuffleNetV2X20DWConvArguments)->UseRealTime();
28 
29 
30 // ShuffleNet v1 with 1 group.
ShuffleNetV1G1DWConvArguments(benchmark::internal::Benchmark * b)31 static void ShuffleNetV1G1DWConvArguments(benchmark::internal::Benchmark* b) {
32   b->ArgNames({"H", "W", "KH", "KW", "PH", "PW", "S", "D", "G"});
33 
34   /********* Stage 2: stride-2 unit *********/
35   /*        H   W  KH  KW  PH  PW  S  D   G */
36   b->Args({56, 56,  3,  3,  2,  2, 2, 1,  36});
37   /********* Stage 2: stride-1 units ********/
38   /*        H   W  KH  KW  PH  PW  S  D   G */
39   b->Args({28, 28,  3,  3,  2,  2, 2, 1,  36});
40   /********* Stage 3: stride-2 unit *********/
41   /*        H   W  KH  KW  PH  PW  S  D   G */
42   b->Args({28, 28,  3,  3,  2,  2, 2, 1,  72});
43   /********* Stage 3: stride-1 units ********/
44   /*        H   W  KH  KW  PH  PW  S  D   G */
45   b->Args({14, 14,  3,  3,  2,  2, 2, 1,  72});
46   /********* Stage 4: stride-2 unit *********/
47   /*        H   W  KH  KW  PH  PW  S  D   G */
48   b->Args({14, 14,  3,  3,  2,  2, 2, 1, 144});
49   /********* Stage 4: stride-1 units ********/
50   /*        H   W  KH  KW  PH  PW  S  D   G */
51   b->Args({ 7,  7,  3,  3,  2,  2, 2, 1, 144});
52 }
53 
54 // ShuffleNet v1 with 2 groups.
ShuffleNetV1G2DWConvArguments(benchmark::internal::Benchmark * b)55 static void ShuffleNetV1G2DWConvArguments(benchmark::internal::Benchmark* b) {
56   b->ArgNames({"H", "W", "KH", "KW", "PH", "PW", "S", "D", "G"});
57 
58   /********* Stage 2: stride-2 unit *********/
59   /*       H   W   KH  KW  PH  PW  S  D   G */
60   b->Args({56, 56,  3,  3,  2,  2, 2, 1,  50});
61   /********* Stage 2: stride-1 units ********/
62   /*       H   W   KH  KW  PH  PW  S  D   G */
63   b->Args({28, 28,  3,  3,  2,  2, 2, 1,  50});
64   /********* Stage 3: stride-2 unit *********/
65   /*       H   W   KH  KW  PH  PW  S  D   G */
66   b->Args({28, 28,  3,  3,  2,  2, 2, 1, 100});
67   /********* Stage 3: stride-1 units ********/
68   /*       H   W   KH  KW  PH  PW  S  D   G */
69   b->Args({14, 14,  3,  3,  2,  2, 2, 1, 100});
70   /********* Stage 4: stride-2 unit *********/
71   /*       H   W   KH  KW  PH  PW  S  D   G */
72   b->Args({14, 14,  3,  3,  2,  2, 2, 1, 200});
73   /********* Stage 4: stride-1 units ********/
74   /*       H   W   KH  KW  PH  PW  S  D   G */
75   b->Args({ 7,  7,  3,  3,  2,  2, 2, 1, 200});
76 }
77 
78 // ShuffleNet v1 with 3 groups.
ShuffleNetV1G3DWConvArguments(benchmark::internal::Benchmark * b)79 static void ShuffleNetV1G3DWConvArguments(benchmark::internal::Benchmark* b) {
80   b->ArgNames({"H", "W", "KH", "KW", "PH", "PW", "S", "D", "G"});
81 
82   /********* Stage 2: stride-2 unit **********/
83   /*        H   W   KH  KW  PH  PW  S  D   G */
84   b->Args({56, 56,  3,  3,  2,  2, 2, 1,  60});
85   /********* Stage 2: stride-1 units *********/
86   /*        H   W   KH  KW  PH  PW  S  D   G */
87   b->Args({28, 28,  3,  3,  2,  2, 2, 1,  60});
88   /********* Stage 3: stride-2 unit **********/
89   /*        H   W   KH  KW  PH  PW  S  D   G */
90   b->Args({28, 28,  3,  3,  2,  2, 2, 1, 120});
91   /********* Stage 3: stride-1 units *********/
92   /*        H   W   KH  KW  PH  PW  S  D   G */
93   b->Args({14, 14,  3,  3,  2,  2, 2, 1, 120});
94   /********* Stage 4: stride-2 unit **********/
95   /*        H   W   KH  KW  PH  PW  S  D   G */
96   b->Args({14, 14,  3,  3,  2,  2, 2, 1, 240});
97   /********* Stage 4: stride-1 units *********/
98   /*        H   W   KH  KW  PH  PW  S  D   G */
99   b->Args({ 7,  7,  3,  3,  2,  2, 2, 1, 240});
100 }
101 
102 // ShuffleNet v1 with 4 groups.
ShuffleNetV1G4DWConvArguments(benchmark::internal::Benchmark * b)103 static void ShuffleNetV1G4DWConvArguments(benchmark::internal::Benchmark* b) {
104   b->ArgNames({"H", "W", "KH", "KW", "PH", "PW", "S", "D", "G"});
105 
106   /********* Stage 2: stride-2 unit *********/
107   /*       H   W   KH  KW  PH  PW  S  D   G */
108   b->Args({56, 56,  3,  3,  2,  2, 2, 1,  68});
109   /********* Stage 2: stride-1 units ********/
110   /*       H   W   KH  KW  PH  PW  S  D   G */
111   b->Args({28, 28,  3,  3,  2,  2, 2, 1,  68});
112   /********* Stage 3: stride-2 unit *********/
113   /*       H   W   KH  KW  PH  PW  S  D   G */
114   b->Args({28, 28,  3,  3,  2,  2, 2, 1, 136});
115   /********* Stage 3: stride-1 units ********/
116   /*       H   W   KH  KW  PH  PW  S  D   G */
117   b->Args({14, 14,  3,  3,  2,  2, 2, 1, 136});
118   /********* Stage 4: stride-2 unit *********/
119   /*       H   W   KH  KW  PH  PW  S  D   G */
120   b->Args({14, 14,  3,  3,  2,  2, 2, 1, 272});
121   /********* Stage 4: stride-1 units ********/
122   /*       H   W   KH  KW  PH  PW  S  D   G */
123   b->Args({ 7,  7,  3,  3,  2,  2, 2, 1, 272});
124 }
125 
126 // ShuffleNet v1 with 8 groups.
ShuffleNetV1G8DWConvArguments(benchmark::internal::Benchmark * b)127 static void ShuffleNetV1G8DWConvArguments(benchmark::internal::Benchmark* b) {
128   b->ArgNames({"H", "W", "KH", "KW", "PH", "PW", "S", "D", "G"});
129 
130   /********* Stage 2: stride-2 unit *********/
131   /*        H   W  KH  KW  PH  PW  S  D   G */
132   b->Args({56, 56,  3,  3,  2,  2, 2, 1,  96});
133   /********* Stage 2: stride-1 units ********/
134   /*        H   W  KH  KW  PH  PW  S  D   G */
135   b->Args({28, 28,  3,  3,  2,  2, 2, 1,  96});
136   /********* Stage 3: stride-2 unit *********/
137   /*        H   W  KH  KW  PH  PW  S  D   G */
138   b->Args({28, 28,  3,  3,  2,  2, 2, 1, 192});
139   /********* Stage 3: stride-1 units ********/
140   /*        H   W  KH  KW  PH  PW  S  D   G */
141   b->Args({14, 14,  3,  3,  2,  2, 2, 1, 192});
142   /********* Stage 4: stride-2 unit *********/
143   /*        H   W  KH  KW  PH  PW  S  D   G */
144   b->Args({14, 14,  3,  3,  2,  2, 2, 1, 384});
145   /********* Stage 4: stride-1 units ********/
146   /*        H   W  KH  KW  PH  PW  S  D   G */
147   b->Args({ 7,  7,  3,  3,  2,  2, 2, 1, 384});
148 }
149 
150 // ShuffleNet v2 (0.5X scale)
ShuffleNetV2X05DWConvArguments(benchmark::internal::Benchmark * b)151 static void ShuffleNetV2X05DWConvArguments(benchmark::internal::Benchmark* b) {
152   b->ArgNames({"H", "W", "KH", "KW", "PH", "PW", "S", "D", "G"});
153 
154   /**************** Stage 2 *****************/
155   /*        H   W  KH  KW  PH  PW  S  D   G */
156   b->Args({56, 56,  3,  3,  2,  2, 2, 1, 24});
157   b->Args({28, 28,  3,  3,  2,  2, 1, 1, 24});
158   /**************** Stage 3 *****************/
159   /*        H   W  KH  KW  PH  PW  S  D   G */
160   b->Args({28, 28,  3,  3,  2,  2, 2, 1, 48});
161   b->Args({14, 14,  3,  3,  2,  2, 1, 1, 48});
162   /**************** Stage 4 *****************/
163   /*        H   W  KH  KW  PH  PW  S  D   G */
164   b->Args({14, 14,  3,  3,  2,  2, 2, 1, 96});
165   b->Args({ 7,  7,  3,  3,  2,  2, 1, 1, 96});
166 }
167 
168 // ShuffleNet v2 (1.0X scale)
ShuffleNetV2X10DWConvArguments(benchmark::internal::Benchmark * b)169 static void ShuffleNetV2X10DWConvArguments(benchmark::internal::Benchmark* b) {
170   b->ArgNames({"H", "W", "KH", "KW", "PH", "PW", "S", "D", "G"});
171 
172   /**************** Stage 2 *****************/
173   /*        H   W  KH  KW  PH  PW  S  D   G */
174   b->Args({56, 56,  3,  3,  2,  2, 2, 1,  24});
175   b->Args({56, 56,  3,  3,  2,  2, 2, 1,  58});
176   b->Args({28, 28,  3,  3,  2,  2, 1, 1,  58});
177   /**************** Stage 3 *****************/
178   /*        H   W  KH  KW  PH  PW  S  D   G */
179   b->Args({28, 28,  3,  3,  2,  2, 2, 1, 116});
180   b->Args({14, 14,  3,  3,  2,  2, 1, 1, 116});
181   /**************** Stage 4 *****************/
182   /*        H   W  KH  KW  PH  PW  S  D   G */
183   b->Args({14, 14,  3,  3,  2,  2, 2, 1, 232});
184   b->Args({ 7,  7,  3,  3,  2,  2, 1, 1, 232});
185 }
186 
187 // ShuffleNet v2 (1.5X scale)
ShuffleNetV2X15DWConvArguments(benchmark::internal::Benchmark * b)188 static void ShuffleNetV2X15DWConvArguments(benchmark::internal::Benchmark* b) {
189   b->ArgNames({"H", "W", "KH", "KW", "PH", "PW", "S", "D", "G"});
190 
191   /**************** Stage 2 *****************/
192   /*        H   W  KH  KW  PH  PW  S  D   G */
193   b->Args({56, 56,  3,  3,  2,  2, 2, 1,  24});
194   b->Args({56, 56,  3,  3,  2,  2, 2, 1,  88});
195   b->Args({28, 28,  3,  3,  2,  2, 1, 1,  88});
196   /**************** Stage 3 *****************/
197   /*        H   W  KH  KW  PH  PW  S  D   G */
198   b->Args({28, 28,  3,  3,  2,  2, 2, 1, 176});
199   b->Args({14, 14,  3,  3,  2,  2, 1, 1, 176});
200   /**************** Stage 4 *****************/
201   /*        H   W  KH  KW  PH  PW  S  D   G */
202   b->Args({14, 14,  3,  3,  2,  2, 2, 1, 352});
203   b->Args({ 7,  7,  3,  3,  2,  2, 1, 1, 352});
204 }
205 
206 // ShuffleNet v2 (2.0X scale)
ShuffleNetV2X20DWConvArguments(benchmark::internal::Benchmark * b)207 static void ShuffleNetV2X20DWConvArguments(benchmark::internal::Benchmark* b) {
208   b->ArgNames({"H", "W", "KH", "KW", "PH", "PW", "S", "D", "G"});
209 
210   /***************** Stage 2 ****************/
211   /*        H   W  KH  KW  PH  PW  S  D   G */
212   b->Args({56, 56,  3,  3,  2,  2, 2, 1,  24});
213   b->Args({56, 56,  3,  3,  2,  2, 2, 1, 122});
214   b->Args({28, 28,  3,  3,  2,  2, 1, 1, 122});
215   /***************** Stage 3 ****************/
216   /*        H   W  KH  KW  PH  PW  S  D   G */
217   b->Args({28, 28,  3,  3,  2,  2, 2, 1, 244});
218   b->Args({14, 14,  3,  3,  2,  2, 1, 1, 244});
219   /***************** Stage 4 ****************/
220   /*        H   W  KH  KW  PH  PW  S  D   G */
221   b->Args({14, 14,  3,  3,  2,  2, 2, 1, 488});
222   b->Args({ 7,  7,  3,  3,  2,  2, 1, 1, 488});
223 }
224 
MobileNetV1DWConvArguments(benchmark::internal::Benchmark * b)225 static void MobileNetV1DWConvArguments(benchmark::internal::Benchmark* b) {
226   b->ArgNames({"H", "W", "KH", "KW", "PH", "PW", "S", "D", "G"});
227 
228   /*        H    W   KH  KW  PH  PW  S  D    G */
229   b->Args({112, 112,  3,  3,  2,  2, 1, 1,   32});
230   b->Args({112, 112,  3,  3,  2,  2, 2, 1,   64});
231   b->Args({ 56,  56,  3,  3,  2,  2, 1, 1,  128});
232   b->Args({ 56,  56,  3,  3,  2,  2, 2, 1,  128});
233   b->Args({ 28,  28,  3,  3,  2,  2, 1, 1,  256});
234   b->Args({ 28,  28,  3,  3,  2,  2, 2, 1,  256});
235   b->Args({ 14,  14,  3,  3,  2,  2, 1, 1,  512});
236   b->Args({ 14,  14,  3,  3,  2,  2, 2, 1,  512});
237   b->Args({  7,   7,  3,  3,  2,  2, 1, 1, 1024});
238 }
239 
MobileNetV2DWConvArguments(benchmark::internal::Benchmark * b)240 static void MobileNetV2DWConvArguments(benchmark::internal::Benchmark* b) {
241   b->ArgNames({"H", "W", "KH", "KW", "PH", "PW", "S", "D", "G"});
242 
243   /**************** Bottleneck 1 ***************/
244   /*        H    W   KH  KW  PH  PW  S  D    G */
245   b->Args({112, 112,  3,  3,  2,  2, 1, 1,  32});
246 
247   /**************** Bottleneck 2 ***************/
248   /*        H    W   KH  KW  PH  PW  S  D    G */
249   b->Args({112, 112,  3,  3,  2,  2, 2, 1,  96});
250   b->Args({ 56,  56,  3,  3,  2,  2, 1, 1, 144});
251 
252   /**************** Bottleneck 3 ***************/
253   /*        H    W   KH  KW  PH  PW  S  D    G */
254   b->Args({ 56,  56,  3,  3,  2,  2, 2, 1, 144});
255   b->Args({ 28,  28,  3,  3,  2,  2, 1, 1, 192});
256 //b->Args({ 28,  28,  3,  3,  2,  2, 1, 1, 192});
257 
258   /**************** Bottleneck 4 ***************/
259   /*        H    W   KH  KW  PH  PW  S  D    G */
260   b->Args({ 28,  28,  3,  3,  2,  2, 2, 1, 192});
261   b->Args({ 14,  14,  3,  3,  2,  2, 1, 1, 384});
262 //b->Args({ 14,  14,  3,  3,  2,  2, 1, 1, 384});
263 //b->Args({ 14,  14,  3,  3,  2,  2, 1, 1, 384});
264 
265   /**************** Bottleneck 5 ***************/
266   /*        H    W   KH  KW  PH  PW  S  D    G */
267 //b->Args({ 14,  14,  3,  3,  2,  2, 1, 1, 384});
268   b->Args({ 14,  14,  3,  3,  2,  2, 1, 1, 576});
269 //b->Args({ 14,  14,  3,  3,  2,  2, 1, 1, 576});
270 
271   /**************** Bottleneck 6 ***************/
272   /*        H    W   KH  KW  PH  PW  S  D    G */
273   b->Args({ 14,  14,  3,  3,  2,  2, 2, 1, 576});
274   b->Args({  7,   7,  3,  3,  2,  2, 1, 1, 960});
275 //b->Args({  7,   7,  3,  3,  2,  2, 1, 1, 960});
276 
277   /**************** Bottleneck 7 ***************/
278   /*        H    W   KH  KW  PH  PW  S  D    G */
279 //b->Args({  7,   7,  3,  3,  2,  2, 1, 1, 960});
280 }
281 
MobileNetV3SmallDWConvArguments(benchmark::internal::Benchmark * b)282 static void MobileNetV3SmallDWConvArguments(benchmark::internal::Benchmark* b) {
283   b->ArgNames({"H", "W", "KH", "KW", "PH", "PW", "S", "D", "G"});
284 
285   /*************** Bottleneck 1 ***************/
286   /*        H    W   KH  KW  PH  PW  S  D   G */
287   b->Args({112, 112,  3,  3,  2,  2, 2, 1,  16});
288   /*************** Bottleneck 2 ***************/
289   /*        H    W   KH  KW  PH  PW  S  D   G */
290   b->Args({ 56,  56,  3,  3,  2,  2, 2, 1,  72});
291   /*************** Bottleneck 3 ***************/
292   /*        H    W   KH  KW  PH  PW  S  D   G */
293   b->Args({ 28,  28,  3,  3,  2,  2, 1, 1,  88});
294   /*************** Bottleneck 4 ***************/
295   /*        H    W   KH  KW  PH  PW  S  D   G */
296   b->Args({ 28,  28,  5,  5,  4,  4, 2, 1,  96});
297   /*************** Bottleneck 5 ***************/
298   /*        H    W   KH  KW  PH  PW  S  D   G */
299   b->Args({ 14,  14,  5,  5,  4,  4, 1, 1, 240});
300   /*************** Bottleneck 6 ***************/
301   /*        H    W   KH  KW  PH  PW  S  D   G */
302 //b->Args({ 14,  14,  5,  5,  4,  4, 1, 1, 240});
303   /*************** Bottleneck 7 ***************/
304   /*        H    W   KH  KW  PH  PW  S  D   G */
305   b->Args({ 14,  14,  5,  5,  4,  4, 1, 1, 120});
306   /*************** Bottleneck 8 ***************/
307   /*        H    W   KH  KW  PH  PW  S  D   G */
308   b->Args({ 14,  14,  5,  5,  4,  4, 1, 1, 144});
309   /*************** Bottleneck 9 ***************/
310   /*        H    W   KH  KW  PH  PW  S  D   G */
311   b->Args({ 14,  14,  5,  5,  4,  4, 2, 1, 288});
312   /*************** Bottleneck 10 **************/
313   /*        H    W   KH  KW  PH  PW  S  D   G */
314   b->Args({  7,   7,  5,  5,  4,  4, 1, 1, 576});
315   /*************** Bottleneck 11 **************/
316   /*        H    W   KH  KW  PH  PW  S  D   G */
317 //b->Args({  7,   7,  5,  5,  4,  4, 1, 1, 576});
318 }
319 
MobileNetV3LargeDWConvArguments(benchmark::internal::Benchmark * b)320 static void MobileNetV3LargeDWConvArguments(benchmark::internal::Benchmark* b) {
321   b->ArgNames({"H", "W", "KH", "KW", "PH", "PW", "S", "D", "G"});
322 
323   /*************** Bottleneck 1 ***************/
324   /*        H    W   KH  KW  PH  PW  S  D   G */
325   b->Args({112, 112,  3,  3,  2,  2, 1, 1,  16});
326   /*************** Bottleneck 2 ***************/
327   /*        H    W   KH  KW  PH  PW  S  D   G */
328   b->Args({112, 112,  3,  3,  2,  2, 2, 1,  64});
329   /*************** Bottleneck 3 ***************/
330   /*        H    W   KH  KW  PH  PW  S  D   G */
331   b->Args({ 56,  56,  3,  3,  2,  2, 1, 1,  72});
332   /*************** Bottleneck 4 ***************/
333   /*        H    W   KH  KW  PH  PW  S  D   G */
334   b->Args({ 56,  56,  5,  5,  4,  4, 2, 1,  72});
335   /*************** Bottleneck 5 ***************/
336   /*        H    W   KH  KW  PH  PW  S  D   G */
337   b->Args({ 28,  28,  5,  5,  4,  4, 1, 1, 120});
338   /*************** Bottleneck 6 ***************/
339   /*        H    W   KH  KW  PH  PW  S  D   G */
340 //b->Args({ 28,  28,  5,  5,  4,  4, 1, 1, 120});
341   /*************** Bottleneck 7 ***************/
342   /*        H    W   KH  KW  PH  PW  S  D   G */
343   b->Args({ 28,  28,  3,  3,  2,  2, 2, 1, 240});
344   /*************** Bottleneck 8 ***************/
345   /*        H    W   KH  KW  PH  PW  S  D   G */
346   b->Args({ 14,  14,  3,  3,  2,  2, 1, 1, 200});
347   /*************** Bottleneck 9 ***************/
348   /*        H    W   KH  KW  PH  PW  S  D   G */
349   b->Args({ 14,  14,  3,  3,  2,  2, 1, 1, 184});
350   /*************** Bottleneck 10 **************/
351   /*        H    W   KH  KW  PH  PW  S  D   G */
352 //b->Args({ 14,  14,  3,  3,  2,  2, 1, 1, 184});
353   /*************** Bottleneck 11 **************/
354   /*        H    W   KH  KW  PH  PW  S  D   G */
355   b->Args({ 14,  14,  3,  3,  2,  2, 1, 1, 480});
356   /*************** Bottleneck 12 **************/
357   /*        H    W   KH  KW  PH  PW  S  D   G */
358   b->Args({ 14,  14,  3,  3,  2,  2, 1, 1, 672});
359   /*************** Bottleneck 13 **************/
360   /*        H    W   KH  KW  PH  PW  S  D   G */
361   b->Args({ 14,  14,  5,  5,  4,  4, 2, 1, 672});
362   /*************** Bottleneck 14 **************/
363   /*        H    W   KH  KW  PH  PW  S  D   G */
364   b->Args({  7,   7,  5,  5,  4,  4, 1, 1, 960});
365   /*************** Bottleneck 15 **************/
366   /*        H    W   KH  KW  PH  PW  S  D   G */
367 //b->Args({  7,   7,  5,  5,  4,  4, 1, 1, 960});
368 }
369