1.概述
最近接触了一个问题,如何用c++去实现图像中的maxpooling操作,在网上找了一些资料,发现只有一些简单的实现算法,这些算法实际运行复杂度较高。因此,本文,探究了如何利用c++的多线程(OpenMP)、“一条指令操作多个数据”(SIMD)等方向出发,优化maxpooling操作。
2. maxpooling
参考博客对Max Pooling的理解_117瓶果粒橙-CSDN博客_maxpooling中的理解,整个图片被不重叠的分割成若干个同样大小的小块(pooling size)。每个小块内只取最大的数字,再舍弃其他节点后,保持原有的平面结构得出 output。
在这篇文章中设定最大池化操作的参数kernel_size=3,stride=2,padding=1(在图像周围填充一格0),那么在输入矩阵src1为:
1 |
1 |
2 |
4 |
5 |
6 |
7 |
8 |
3 |
2 |
1 |
0 |
1 |
2 |
3 |
4 |
最大池化的结果应该为
6 | 8 |
6 | 8 |
3.pytorch实现和c++实现
pytorch
c++(版本1)
//求maxpooling操作
vector<vector<vector<vector<int>>>> maxpooling(){
int batch = src1.size(); int channel = src1[0].size();
int height=src1[0][0].size(); int width=src1[0][0][0].size();
int out_h = (height-3+2)/2, out_w = (width-3+2)/2;
int mod_h = (height-3+2)%2, mod_w =(width-3+2)%2;
if (mod_h != 0) out_h++;
if (mod_w != 0) out_w++;
//先填充
vector<vector<vector<vector<int>>>> pad_map;
for(int b=0;b<batch;b++){
vector<vector<vector<int>>> c_tmp;
for(int c=0;c<channel;c++){
vector<vector<int>> h_tmp(height+2,vector<int>(width+2,0));
for(int h=0;h<height+2;h++){
for(int w=0;w<width+2;w++){