| @@ -58,7 +58,7 @@ int Pooling_arm::forward(const Mat& bottom_blob, Mat& top_blob) const | |||||
| w = bottom_blob_bordered.w; | w = bottom_blob_bordered.w; | ||||
| h = bottom_blob_bordered.h; | h = bottom_blob_bordered.h; | ||||
| } | } | ||||
| else if (pad_w == -233 && pad_h == -233) | |||||
| else if (pad_mode == 2) // tensorflow padding=SAME | |||||
| { | { | ||||
| int wpad = kernel_w + (w - 1) / stride_w * stride_w - w; | int wpad = kernel_w + (w - 1) / stride_w * stride_w - w; | ||||
| int hpad = kernel_h + (h - 1) / stride_h * stride_h - h; | int hpad = kernel_h + (h - 1) / stride_h * stride_h - h; | ||||
| @@ -76,12 +76,12 @@ int Pooling_arm::forward(const Mat& bottom_blob, Mat& top_blob) const | |||||
| int outw = (w - kernel_w) / stride_w + 1; | int outw = (w - kernel_w) / stride_w + 1; | ||||
| int outh = (h - kernel_h) / stride_h + 1; | int outh = (h - kernel_h) / stride_h + 1; | ||||
| int wtail = (w - kernel_w) % stride_w; | |||||
| int htail = (h - kernel_h) % stride_h; | |||||
| if ((pad_w == -233 && pad_h == -233) || (pad_w == -2333 && pad_h == -2333)) | |||||
| int wtail = 0; | |||||
| int htail = 0; | |||||
| if (pad_mode == 0) // full padding | |||||
| { | { | ||||
| wtail = 0; | |||||
| htail = 0; | |||||
| wtail = (w - kernel_w) % stride_w; | |||||
| htail = (h - kernel_h) % stride_h; | |||||
| } | } | ||||
| if (wtail != 0 || htail != 0) | if (wtail != 0 || htail != 0) | ||||
| { | { | ||||
| @@ -35,6 +35,7 @@ int Pooling::load_param(const ParamDict& pd) | |||||
| pad_w = pd.get(3, 0); | pad_w = pd.get(3, 0); | ||||
| pad_h = pd.get(13, pad_w); | pad_h = pd.get(13, pad_w); | ||||
| global_pooling = pd.get(4, 0); | global_pooling = pd.get(4, 0); | ||||
| pad_mode = pd.get(5, 0); | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -105,7 +106,7 @@ int Pooling::forward(const Mat& bottom_blob, Mat& top_blob) const | |||||
| w = bottom_blob_bordered.w; | w = bottom_blob_bordered.w; | ||||
| h = bottom_blob_bordered.h; | h = bottom_blob_bordered.h; | ||||
| } | } | ||||
| else if (pad_w == -233 && pad_h == -233) | |||||
| else if (pad_mode == 2) // tensorflow padding=SAME | |||||
| { | { | ||||
| int wpad = kernel_w + (w - 1) / stride_w * stride_w - w; | int wpad = kernel_w + (w - 1) / stride_w * stride_w - w; | ||||
| int hpad = kernel_h + (h - 1) / stride_h * stride_h - h; | int hpad = kernel_h + (h - 1) / stride_h * stride_h - h; | ||||
| @@ -123,12 +124,12 @@ int Pooling::forward(const Mat& bottom_blob, Mat& top_blob) const | |||||
| int outw = (w - kernel_w) / stride_w + 1; | int outw = (w - kernel_w) / stride_w + 1; | ||||
| int outh = (h - kernel_h) / stride_h + 1; | int outh = (h - kernel_h) / stride_h + 1; | ||||
| int wtail = (w - kernel_w) % stride_w; | |||||
| int htail = (h - kernel_h) % stride_h; | |||||
| if ((pad_w == -233 && pad_h == -233) || (pad_w == -2333 && pad_h == -2333)) | |||||
| int wtail = 0; | |||||
| int htail = 0; | |||||
| if (pad_mode == 0) // full padding | |||||
| { | { | ||||
| wtail = 0; | |||||
| htail = 0; | |||||
| wtail = (w - kernel_w) % stride_w; | |||||
| htail = (h - kernel_h) % stride_h; | |||||
| } | } | ||||
| if (wtail != 0 || htail != 0) | if (wtail != 0 || htail != 0) | ||||
| { | { | ||||
| @@ -40,6 +40,7 @@ public: | |||||
| int pad_w; | int pad_w; | ||||
| int pad_h; | int pad_h; | ||||
| int global_pooling; | int global_pooling; | ||||
| int pad_mode;// 0=full 1=valid 2=SAME | |||||
| }; | }; | ||||
| } // namespace ncnn | } // namespace ncnn | ||||
| @@ -1092,9 +1092,14 @@ int main(int argc, char** argv) | |||||
| pool = 1; | pool = 1; | ||||
| } | } | ||||
| int pad_mode = 1; | |||||
| if (pooling_convention == "valid") | if (pooling_convention == "valid") | ||||
| { | { | ||||
| // TODO valid and full mode | |||||
| pad_mode = 1; | |||||
| } | |||||
| else if (pooling_convention == "full") | |||||
| { | |||||
| pad_mode = 0; | |||||
| } | } | ||||
| fprintf(pp, " 0=%d", pool); | fprintf(pp, " 0=%d", pool); | ||||
| @@ -1105,6 +1110,7 @@ int main(int argc, char** argv) | |||||
| if (!pad.empty()) | if (!pad.empty()) | ||||
| fprintf(pp, " 3=%d", pad[0]); | fprintf(pp, " 3=%d", pad[0]); | ||||
| fprintf(pp, " 4=%d", global_pool); | fprintf(pp, " 4=%d", global_pool); | ||||
| fprintf(pp, " 5=%d", pad_mode); | |||||
| } | } | ||||
| else if (n.op == "SliceChannel") | else if (n.op == "SliceChannel") | ||||
| { | { | ||||
| @@ -530,6 +530,7 @@ int main(int argc, char** argv) | |||||
| int pad = 0; | int pad = 0; | ||||
| int global_pooling = 0; | int global_pooling = 0; | ||||
| int pad_mode = 1; | |||||
| tensorflow::AttrValue value_ksize; | tensorflow::AttrValue value_ksize; | ||||
| if (find_attr_value(node, "ksize", value_ksize)) | if (find_attr_value(node, "ksize", value_ksize)) | ||||
| @@ -552,11 +553,11 @@ int main(int argc, char** argv) | |||||
| { | { | ||||
| if (value_padding.s() == "VALID") | if (value_padding.s() == "VALID") | ||||
| { | { | ||||
| pad = 0; | |||||
| pad_mode = 1; | |||||
| } | } | ||||
| else if (value_padding.s() == "SAME") | else if (value_padding.s() == "SAME") | ||||
| { | { | ||||
| pad = -233; | |||||
| pad_mode = 2; | |||||
| } | } | ||||
| } | } | ||||
| @@ -567,6 +568,7 @@ int main(int argc, char** argv) | |||||
| fprintf(pp, " 12=%d", stride_h); | fprintf(pp, " 12=%d", stride_h); | ||||
| fprintf(pp, " 3=%d", pad); | fprintf(pp, " 3=%d", pad); | ||||
| fprintf(pp, " 4=%d", global_pooling); | fprintf(pp, " 4=%d", global_pooling); | ||||
| fprintf(pp, " 5=%d", pad_mode); | |||||
| } | } | ||||
| else if (node.op() == "Concat" || node.op() == "ConcatV2") | else if (node.op() == "Concat" || node.op() == "ConcatV2") | ||||
| { | { | ||||
| @@ -1075,6 +1077,7 @@ int main(int argc, char** argv) | |||||
| int pad = 0; | int pad = 0; | ||||
| int global_pooling = 0; | int global_pooling = 0; | ||||
| int pad_mode = 1; | |||||
| tensorflow::AttrValue value_ksize; | tensorflow::AttrValue value_ksize; | ||||
| if (find_attr_value(node, "ksize", value_ksize)) | if (find_attr_value(node, "ksize", value_ksize)) | ||||
| @@ -1097,11 +1100,11 @@ int main(int argc, char** argv) | |||||
| { | { | ||||
| if (value_padding.s() == "VALID") | if (value_padding.s() == "VALID") | ||||
| { | { | ||||
| pad = -2333; | |||||
| pad_mode = 1; | |||||
| } | } | ||||
| else if (value_padding.s() == "SAME") | else if (value_padding.s() == "SAME") | ||||
| { | { | ||||
| pad = -233; | |||||
| pad_mode = 2; | |||||
| } | } | ||||
| } | } | ||||
| @@ -1112,6 +1115,7 @@ int main(int argc, char** argv) | |||||
| fprintf(pp, " 12=%d", stride_h); | fprintf(pp, " 12=%d", stride_h); | ||||
| fprintf(pp, " 3=%d", pad); | fprintf(pp, " 3=%d", pad); | ||||
| fprintf(pp, " 4=%d", global_pooling); | fprintf(pp, " 4=%d", global_pooling); | ||||
| fprintf(pp, " 5=%d", pad_mode); | |||||
| } | } | ||||
| else if (node.op() == "Min" || node.op() == "Minimum") | else if (node.op() == "Min" || node.op() == "Minimum") | ||||
| { | { | ||||