| 1006 | } |
| 1007 | |
| 1008 | void ExtractConvolutionParameters(const caffe::LayerParameter& src, XGraph& graph) |
| 1009 | { |
| 1010 | caffe::ConvolutionParameter src_parameter = src.convolution_param(); |
| 1011 | mapStrStr::const_iterator map_it = CaffeLayerMap.find(src.type()); |
| 1012 | string xlayerType = map_it->second; |
| 1013 | XLayer* dst = new XLayer(src.name(), xlayerType, src.top(0)); |
| 1014 | |
| 1015 | // Ensure number of input/output blobs |
| 1016 | checkNumberOfTopAndBottom(src, 1, 1); |
| 1017 | |
| 1018 | // Get OUTPUT_FEATURE_MAPS [MANDATORY] |
| 1019 | if(src_parameter.has_num_output()) |
| 1020 | { |
| 1021 | dst->conv_params->M = src_parameter.num_output(); |
| 1022 | } |
| 1023 | else |
| 1024 | { |
| 1025 | cerr << "[EP012] \"num_output\" is not specified in the convolution layer : " << src.name() << endl; |
| 1026 | exit(-1); |
| 1027 | } |
| 1028 | |
| 1029 | // Get FILTER SIZE [MANDATORY] |
| 1030 | if (src_parameter.has_kernel_h() || src_parameter.has_kernel_w()) |
| 1031 | { |
| 1032 | ELOG ( (src_parameter.kernel_size_size() > 0), |
| 1033 | EP151, |
| 1034 | "Mention either kernel_size or kernel_h/kernel_w for layer " << src.name() << ". Not both. !!") |
| 1035 | ASSERT((src_parameter.has_kernel_h() && src_parameter.has_kernel_w()), |
| 1036 | EP152, |
| 1037 | "Mention both kernel_h and kernel_w for layer " << src.name() << ". Or use kernel_size.") |
| 1038 | dst->conv_params->filter_h = src_parameter.kernel_h(); |
| 1039 | dst->conv_params->filter_w = src_parameter.kernel_w(); |
| 1040 | } |
| 1041 | else |
| 1042 | { |
| 1043 | ASSERT((src_parameter.kernel_size_size() > 0), |
| 1044 | EP153, "kernel_size is not specified in the convolution layer : " << src.name()) |
| 1045 | dst->conv_params->filter_h = src_parameter.kernel_size(0); |
| 1046 | dst->conv_params->filter_w = src_parameter.kernel_size(0); |
| 1047 | } |
| 1048 | |
| 1049 | // Check if filters are not rectangular |
| 1050 | ASSERT( (dst->conv_params->filter_h == dst->conv_params->filter_w), |
| 1051 | EP154, "This version supports only square filters for convolution layer: " << src.name() ) |
| 1052 | |
| 1053 | // Get PAD [DEFAULT = 0] |
| 1054 | if (src_parameter.has_pad_h() || src_parameter.has_pad_w()) |
| 1055 | { |
| 1056 | ELOG ( (src_parameter.pad_size() > 0), |
| 1057 | EP155, |
| 1058 | "Mention either pad or pad_h/pad_w for layer " << src.name() << ". Not both. !!") |
| 1059 | ASSERT((src_parameter.has_pad_h() && src_parameter.has_pad_w()), |
| 1060 | EP156, |
| 1061 | "Mention both pad_h and pad_w for layer " << src.name() << ". Or use pad.") |
| 1062 | dst->conv_params->pad_h = src_parameter.pad_h(); |
| 1063 | dst->conv_params->pad_w = src_parameter.pad_w(); |
| 1064 | } |
| 1065 | else |
no test coverage detected