1.深度学习 | 反卷积/转置卷积 的理解 transposed conv/deconv
https://blog.youkuaiyun.com/u014722627/article/details/60574260
2.关于tensorflow中转置卷积使用的理解
https://blog.youkuaiyun.com/silence2015/article/details/78649734
3.https://www.zhihu.com/question/43609045
作者:小华仔
链接:https://www.zhihu.com/question/43609045/answer/150012768
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
很多人上来就说 Deconvolution 不对,应该叫什么什么,balabala,这些都已经看的都想骂人了(不是不尊敬答题人,只是有卵用?还是不理解 Deconvolution 的工作方式)。是的是的,你说的都对,但是我还是不理解啊啊啊啊啊啊啊啊啊啊啊!!!!!
大家也都知道了这里的 Deconvolution 不是信号处理中的 Deconvolution(把convolution处理过的信号,尽最大可能的还原回去),这里只是想说明 Convolution 把图片变小,为了完成某些任务需要把图片再变大回去,所以叫 Deconvolution(因为 Convolution 的叫法本身也是错误的),从这个角度理解,我认为这种叫法也是可以说得通的(取 Deconvolution 这中叫法的人肯定想对那些说这种叫法不合理的人说:你们就不知道意会吗,非要从代码实现上来说吗?!)。
大多数人所说的更合适的叫法是 Transposed Convolution,有两个原因:
- 它就是 Convolution Network 的一种镜像,所以叫 Transposed Convolution。
- 从代码实现上,他就是把 filter 取了转置(Transpose),而这种做法又跟 backwards propagation 的代码实现一样,所以又叫 Backwards Convolution。这两种叫法都与代码实现上有很大很大的关系。
这个 Convolution arithmetic,大家也都已经刚看过了。
看过这些动图之后,想必很多人都认为 Transposed Convolution 就是卷积,答案是对的。就是 pad(通常用 0 进行 pad),然后进行卷积。
但是这种做法效率不高,怎么办?习惯性想到:转化为矩阵乘积的方式。怎么转?把 filter 取转置就行了(数学角度的正确性证明这里不说了,那么多公式矩阵也不会有多少人看,你可用个例子看一下,有助于理解),你会发现这与进行pad,然后卷积的做法是一致的。代码实现上 Deconvolution 就是这么干的。
注意1:这里的 filter 是变形后的 filter,不是最原始的 filter,这一点很重要!!!!可以看得票最高的那个回答。
注意2: Deconvolution Network 部分的 filter 可以不是前面 Convolution Network 部分学习到的取转置后的 filter,在 Deconvolution Network 部分可以自己学习新的 filter (原始 filter 的大小与前面 Convolution Network 对应层的 filter 的大小保持一致,但是在代码实现时,变形后的 filter 的大小,是前面 Convolution Network 对应层的变形后的 filter大小的转置(绕,比如 Convolution Network 部分是4 X 16,这里就是16 X 4)。
当然,这也是我个人理解,如有错误,还请各位大神不吝赐教,非常感谢。