卷积和转置卷积,都涉及到padding, 那么添加padding 的具体方式,就会影响到计算结果,所以搞清除tensorflow中卷积和转置卷积的具体实现有助于模型的灵活部署应用。

一、卷积

举例说明:

    X:  1        2        3        4          5 

       6        7        8        9         10

      11      12      13       14        15

      16      17       18      19        20

      21       22      23      24        25 

              

    w:    1   1   1   1

                      1    2   1   1

      1    1   3   1

                      1    1   1   4

如对于:tf.nn.conv2(X,w,stride=[1,1],padding='SAME')

需要在X 中添加3 行 3列, 那么在tensorflow 中的添加方式如下:

      left_w =  3/2    up_h =3/2

      right_w = 3-left_w    down_h = 3- up_h

也即:  添加padding 时如左右、上下不能呢个平均分配,则左边<=右边,上边<=下边

故,卷积后的 (0,0)位置的值为,  1*2 + 2*1+ 3*1+ 6*1+7*3+8*1+11*1+12*1+14*4

 

 

二 、转置卷积

X:    1        2        3        4          5             w:    1         1         1          1 

  6        7        8        9          10                    1         2         1          1

  11      12      13      14        15       1         2         3          1

  16      17      18      19        20

  21      22      23      24        25 

tf.nn.conv2d_transpose(X,W,tf.stack([10,10]),strides=[2,2],padding="SAME")

1、对X扩展, 

      strides=[2,2] 故扩展后的 X 为:(shape:10X10)

      1     0     2     0     3    0     4    0     5     0

      0     0     0     0     0    0     0    0     0     0

      6     0     7     0     8    0     9    0     10   0

      .      .      .      .      .     .      .     .       .     .

      .      .      .      .      .     .      .     .       .     .

2、加padding,由于padding = "SAME"  所以需要加 3行 3列

      对X 扩展再加padding 后的 高和宽为:

      H = X.H * stride + (w.H-1)

      W = X.W*stride + (w.W-1)

      l_h = ceil(((w.H - 1)*1.0 + (stride - 1)) / 2.0);       // 向上取整数

      l_h = l_h>(w.H - 1) ? (w.H - 1) : l_h;  // 在左边添加padding 的列数

      up_w = ceil(((w.W - 1)*1.0 + (stride - 1)) / 2.0)    // 向上取整数

      up_w = up_w>(w.W - 1) ? (w.W - 1) : up_h;   // 在上边添加padding 的行数

      说明: 

      input.shape:  5X5   ; stride = 3 ; w.shape =5*5  padding = "SAME" 时

      扩展后,input.shape = 15*15 , 其中 最右边扩展2列, 最下边扩展2行

      加padding后, input.shape = 19*19, 其中在最左边扩展3列, 最上边扩展3行; 最右边再扩展1列,最下边再扩展1行

      卷积(步长为1)后  , output .shape = 15*15      

3、卷积

      tensorflow 中conv2d_transpose对卷积的实现有别于conv2,  相当于将 w 进行reverse 后进行卷积。