zoukankan      html  css  js  c++  java
  • tensorflow中卷积、转置卷积具体实现方式

    卷积和转置卷积,都涉及到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 后进行卷积。

           

           

  • 相关阅读:
    ESRI的地图控件和DEV控件存在冲突,造成调试中断无法通过
    使用Flex读取操作Excel文档的组件(开源组件)
    Flex 使用FileReference遇到的问题(未解决)
    Flex 学习站点汇总
    Puppet文档:模块基础
    Python实现ssh批量登录并执行命令【转】
    OpenDNS打造自由干净的网络环境【转】
    LAMP实验三:远程连接MySQL
    Puppet效果图【转]
    国内外DNS服务器地址列表【转】
  • 原文地址:https://www.cnblogs.com/feihu-h/p/11778040.html
Copyright © 2011-2022 走看看