如何在Xception文件中计算可分离的卷积?

时间:2017-02-11 11:27:41

标签: deep-learning conv-neural-network

我阅读了Xception论文(其中甚至是描述NN的Keras Model)并且它讨论了可分离的卷积。 我试图了解如何计算完全。我没有把它留给不精确的单词,而是将下面的伪代码包含在内,总结了我的理解。代码从特征映射18x18x728映射到18x18x1024:

XSIZE = 18;
YSIZE = 18;
ZSIZE = 728;
ZSIXE2 = 1024;

float mapin[XSIZE][YSIZE][ZSIZE];  // Input map
float imap[XSIZE][YSIZE][ZSIZE2];  // Intermediate map
float mapout[XSIZE][YSIZE][ZSIZE2];  // Output map

float wz[ZSIZE][ZSIZE2]; // Weights for 1x1 convs
float wxy[3][3][ZSIZE2];  // Weights for 3x3 convs

// Apply 1x1 convs
for(y=0;y<YSIZE;y++)
  for(x=0;x<XSIZE;x++)
    for(o=0;o<ZSIZE2;o++){
      s=0.0;
      for(z=0;z<ZSIZE;z++)
        s+=mapin[x][y][z]*wz[z][o];
      imap[x][y][o]=s;
    }

// Apply 2D 3x3 convs
for(o=0;o<ZSIZE2;o++)
  for(y=0y<YSIZE;y++)
    for(x=0;x<XSIZE;x++){
      s=0.0;
      for(i=-1;i<2;i++)
        for(j=-1;j<2;j++)
          s+=imap[x+j][y+i][o]*wxy[j+1][i+1][o]; // This value is 0 if falls off the edge
      mapout[x][y][o]=s;
    }

这是对的吗?如果没有,你能建议类似用C或伪C写的修补程序吗?

非常感谢你。

1 个答案:

答案 0 :(得分:0)

我在Tensorflow中发现了tf.nn.separable_conv2d。所以我构建了一个非常简单的图形,并且在随机数的帮助下,我试图获得上面的代码以匹配结果。正确的代码是:

XSIZE = 18;
YSIZE = 18;
ZSIZE = 728;
ZSIXE2 = 1024;

float mapin[XSIZE][YSIZE][ZSIZE];  // Input map
float imap[XSIZE][YSIZE][ZSIZE];  // Intermediate map
float mapout[XSIZE][YSIZE][ZSIZE2];  // Output map

float wxy[3][3][ZSIZE];  // Weights for 3x3 convs
float wz[ZSIZE][ZSIZE2]; // Weights for 1x1 convs


// Apply 2D 3x3 convs
for(o=0;o<ZSIZE;o++)
  for(y=0y<YSIZE;y++)
    for(x=0;x<XSIZE;x++){
      s=0.0;
      for(i=-1;i<2;i++)
        for(j=-1;j<2;j++)
          s+=mapin[x+j][y+i][o]*wxy[j+1][i+1][o]; // This value is 0 if falls off the edge
      imap[x][y][o]=s;
    }

// Apply 1x1 convs
for(y=0;y<YSIZE;y++)
  for(x=0;x<XSIZE;x++)
    for(o=0;o<ZSIZE2;o++){
      s=0.0;
      for(z=0;z<ZSIZE;z++)
        s+=imap[x][y][z]*wz[z][o];
      mapout[x][y][o]=s;
    }

主要区别在于执行两组卷积的顺序。 令我惊讶的是,即使ZSIZE == ZSIZE2,订单也很重要。