| 1158 | } |
| 1159 | |
| 1160 | void ExtractDeconvolutionParameters(const caffe::LayerParameter& src, XGraph& graph) |
| 1161 | { |
| 1162 | caffe::ConvolutionParameter src_parameter = src.convolution_param(); |
| 1163 | mapStrStr::const_iterator map_it= CaffeLayerMap.find(src.type()); |
| 1164 | string xlayerType = map_it->second; |
| 1165 | XLayer* dst = new XLayer(src.name(), xlayerType, src.top(0)); |
| 1166 | |
| 1167 | // Ensure number of input/output blobs |
| 1168 | checkNumberOfTopAndBottom(src, 1, 1); |
| 1169 | |
| 1170 | // Get OUTPUT_FEATURE_MAPS [MANDATORY] |
| 1171 | if(src_parameter.has_num_output()) |
| 1172 | { |
| 1173 | dst->deconv_params->M = src_parameter.num_output(); |
| 1174 | } |
| 1175 | else |
| 1176 | { |
| 1177 | cerr << "[EP015] \"num_output\" is not specified in the Deconvolution layer : " << src.name() << endl; |
| 1178 | exit(-1); |
| 1179 | } |
| 1180 | |
| 1181 | // Get FILTER SIZE [MANDATORY] |
| 1182 | if (src_parameter.has_kernel_h() || src_parameter.has_kernel_w()) |
| 1183 | { |
| 1184 | ELOG ( (src_parameter.kernel_size_size() > 0), |
| 1185 | EP151, |
| 1186 | "Mention either kernel_size or kernel_h/kernel_w for layer " << src.name() << ". Not both. !!") |
| 1187 | ASSERT((src_parameter.has_kernel_h() && src_parameter.has_kernel_w()), |
| 1188 | EP152, |
| 1189 | "Mention both kernel_h and kernel_w for layer " << src.name() << ". Or use kernel_size.") |
| 1190 | dst->deconv_params->filter_h = src_parameter.kernel_h(); |
| 1191 | dst->deconv_params->filter_w = src_parameter.kernel_w(); |
| 1192 | } |
| 1193 | else |
| 1194 | { |
| 1195 | ASSERT((src_parameter.kernel_size_size() > 0), |
| 1196 | EP153, "kernel_size is not specified in the Deconvolution layer : " << src.name()) |
| 1197 | dst->deconv_params->filter_h = src_parameter.kernel_size(0); |
| 1198 | dst->deconv_params->filter_w = src_parameter.kernel_size(0); |
| 1199 | } |
| 1200 | |
| 1201 | // Check if filters are not rectangular |
| 1202 | ASSERT( (dst->deconv_params->filter_h == dst->deconv_params->filter_w), |
| 1203 | EP154, "This version supports only square filters for Deconvolution layer: " << src.name() ) |
| 1204 | |
| 1205 | // Get PAD [DEFAULT = 0] |
| 1206 | if (src_parameter.has_pad_h() || src_parameter.has_pad_w()) |
| 1207 | { |
| 1208 | ELOG ( (src_parameter.pad_size() > 0), |
| 1209 | EP155, |
| 1210 | "Mention either pad or pad_h/pad_w for layer " << src.name() << ". Not both. !!") |
| 1211 | ASSERT((src_parameter.has_pad_h() && src_parameter.has_pad_w()), |
| 1212 | EP156, |
| 1213 | "Mention both pad_h and pad_w for layer " << src.name() << ". Or use pad.") |
| 1214 | dst->deconv_params->pad_h = src_parameter.pad_h(); |
| 1215 | dst->deconv_params->pad_w = src_parameter.pad_w(); |
| 1216 | } |
| 1217 | else |
no test coverage detected