zoukankan      html  css  js  c++  java
  • 『TensotFlow』转置卷积

    网上解释

    作者:张萌
    链接:https://www.zhihu.com/question/43609045/answer/120266511
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    一句话解释:逆卷积相对于卷积在神经网络结构的正向和反向传播中做相反的运算。

    逆卷积(Deconvolution)比较容易引起误会,转置卷积(Transposed Convolution)是一个更为合适的叫法.

    举个栗子:

    4x4的输入,卷积Kernel为3x3, 没有Padding / Stride, 则输出为2x2。

    输入矩阵可展开为16维向量,记作x
    输出矩阵可展开为4维向量,记作y
    卷积运算可表示为y = Cx


    不难想象C其实就是如下的稀疏阵:

    平时神经网络中的正向传播就是转换成了如上矩阵运算。

    那么当反向传播时又会如何呢?首先我们已经有从更深层的网络中得到的frac{partial Loss}{partial y}.


    frac{partial Loss}{partial x_j} =
sum_i frac{partial Loss}{partial y_i} frac{partial y_i}{partial x_j} = sum_i frac{partial Loss}{partial y_i} C_{i,j}  = frac{partial Loss}{partial y} cdot C_{*,j} = C_{*,j}^T frac{partial Loss}{partial y}

    回想第一句话,你猜的没错,所谓逆卷积其实就是正向时左乘C^T,而反向时左乘(C^T)^T,即C的运算。

    补充理解

    下图标注有误,“SAME”应为“VALID”,kernel为3,stride为1,卷积输出为(输入-核+1)/步长。

    tensorflow接口

    tf.nn.conv2d_transpose()

    kernel = tf.random_normal(shape=[2,2,3,1])
    
    # strides 和padding也是假想中 正向卷积的模样。当然,x是正向卷积后的模样
    y = tf.nn.conv2d_transpose(x,kernel,output_shape=[1,5,5,3],
        strides=[1,2,2,1],padding="SAME")
    # 在这里,output_shape=[1,6,6,3]也可以,考虑正向过程,[1,6,6,3]
    # 通过kernel_shape:[2,2,3,1],strides:[1,2,2,1]也可以
    

     注意:conv2d_transpose 中会计算 output_shape 能否通过给定的参数计算出 inputs的维度,如果不能,则报错。

    api介绍博客

  • 相关阅读:
    常用模块——hashlib模块
    day21作业
    常用模块——configparser模块
    常用模块——xml模块
    常用模块——json模块
    常用模块——shelve模块
    常用模块——pickle模块
    shutil模块
    常用模块——os模块
    简易nagios安装出现的问题及解决方法
  • 原文地址:https://www.cnblogs.com/hellcat/p/7778664.html
Copyright © 2011-2022 走看看