博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
『TensotFlow』转置卷积
阅读量:6263 次
发布时间:2019-06-22

本文共 884 字,大约阅读时间需要 2 分钟。

网上解释

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

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

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

举个栗子:

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

输入矩阵可展开为16维向量,记作x

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

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

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

那么当反向传播时又会如何呢?首先我们已经有从更深层的网络中得到的\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的维度,如果不能,则报错。

你可能感兴趣的文章
linux上查看swf文件.靠谱
查看>>
sql server两种分页方法
查看>>
一本离线的百科全书,当然无法和一本在线的百科全书抗衡。所谓的常识,在你的思考中被重构,根源就在于在线的崛起。...
查看>>
Floyd算法
查看>>
CentOS 6.4下安装Oracle 11gR2
查看>>
linux建立用户 详细
查看>>
jquery获取radio的值
查看>>
创建索引
查看>>
jQuery基础-创建HTML
查看>>
spring boot 热部署
查看>>
NYOJ-214 单调递增子序列(二) AC 分类: NYOJ ...
查看>>
[HDU 4417]Super Mario
查看>>
clip-path的妙用
查看>>
在FMOD中使用customRollOff实现更自然的声音衰减
查看>>
java日常-map转成json
查看>>
动画view
查看>>
自己写个多任务多线程断点下载框架
查看>>
Css 按钮
查看>>
Silverlight显示WCF详细异常信息
查看>>
BZOJ5299:[CQOI2018]解锁屏幕(状压DP)
查看>>