『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介紹博客


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM