『TensotFlow』轉置卷積

網上解釋

做者:張萌
連接:https://www.zhihu.com/question/43609045/answer/120266511
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。

一句話解釋:逆卷積相對於卷積在神經網絡結構的正向和反向傳播中作相反的運算。python

逆卷積(Deconvolution)比較容易引發誤會,轉置卷積(Transposed Convolution)是一個更爲合適的叫法.api

舉個栗子:網絡

4x4的輸入,卷積Kernel爲3x3, 沒有Padding / Stride, 則輸出爲2x2。

輸入矩陣可展開爲16維向量,記做x
輸出矩陣可展開爲4維向量,記做y
卷積運算可表示爲y = Cxdom


不難想象 C其實就是以下的稀疏陣:

平時神經網絡中的正向傳播就是轉換成了如上矩陣運算。ide

那麼當反向傳播時又會如何呢?首先咱們已經有從更深層的網絡中獲得的\frac{\partial Loss}{\partial y}. spa


\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的運算。.net

補充理解

下圖標註有誤,「SAME」應爲「VALID」,kernel爲3,stride爲1,卷積輸出爲(輸入-核+1)/步長。orm

tensorflow接口

tf.nn.conv2d_transpose()blog

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

相關文章
相關標籤/搜索