使用GAN生成圖像必不可少的層就是上採樣,其中最經常使用的就是轉置卷積(Transposed Convolution)。若是把卷積操做轉換爲矩陣乘法的形式,轉置卷積實際上就是將其中的矩陣進行轉置,從而產生逆向的效果。所謂效果僅僅在於特徵圖的形狀,也就是說,若是卷積將特徵圖從形狀a映射到形狀b,其對應的轉置卷積就是從形狀b映射回形狀a,而其中的值並不一一對應,是不可逆的。另外,不要把逆卷積(Deconvolution)和轉置卷積混淆,逆卷積的目標在於構建輸入特徵圖的稀疏編碼(Sparse coding),並非以上採樣爲目的的。可是轉置卷積的確是來源於逆卷積,關於逆卷積與轉置卷積的論文請看[1][2]。ide
下面直接對轉置卷積的各類狀況進行舉例,從而全面理解轉置卷積在Pytorch中的運算機制。使用Pytorch而不是TF的緣由在於,TF中的padding方式只有兩種,即valid與same,並不能很好地幫咱們理解原理。並且TF和Pytorch插入0值的方式有些差別,雖然在模型層面,你只需關注模型輸入輸出的形狀,隱層的微小差別能夠經過訓練來抵消,可是爲了更好得把握模型結構,最好仍是使用Pytorch。函數
對於Pytorch的nn.ConvTranspose2d()的參數,下面的討論不考慮膨脹度dilation,默認爲1;output_padding就是在最終的輸出特徵外面再加上幾層0,因此也不討論,默認爲0;爲了便於理解,bias也忽略不計,設爲False;不失通常性,輸入輸出的channels都設爲1。除了對將卷積轉換成矩陣乘法的理解外,理解難點主要在於stride和padding的變化對轉置卷積產生的影響,所以下面咱們主要變化kernel_size、stride、padding三個參數來分析各類狀況。編碼
舉例以前要注意,轉換爲矩陣的形式是由卷積的結果獲得的,矩陣形式自己是不能直接得到的。要注意這個因果關係,轉換爲矩陣形式是爲了便於理解,以及推導轉置卷積。excel
首先是kernel_size = 2,stride=1,padding=0的狀況,以下圖: blog
圖中上半部分表示將卷積轉換爲矩陣乘法的形式。在卷積中,咱們是輸入一個3x3的特徵圖,輸出2x2的特徵圖,矩陣乘法形式如上圖上中部分所示;轉置卷積就是將這個矩陣乘法反過來,如上圖下中部分所示。而後將下中部分的矩陣乘法轉換爲卷積的形式,便可獲得轉置卷積的示意圖如上圖右下部分所示。ip
而後是kernel_size = 2,stride=1,padding=1的狀況(由於第一張圖中已有,虛線與註釋都不加了):get
與上一張圖的主要不一樣之處在於轉置卷積將卷積結果的最外層去掉,這是由於padding=1,也正符合與卷積相反的操做。也就是說,padding越大,轉置卷積就會去掉越多的外層,輸出就會越小。博客
爲了分析轉置卷積的卷積核與卷積的卷積核的區別,此次把kernel_size變爲3,以下圖:it
能夠看出,轉置卷積的先將輸入padding 2層,用於抵消卷積核帶來的規模上的減少,從而將輸出擴增到相對應卷積操做的輸入大小。而後,咱們能夠發現,卷積核是輸入的卷積核的逆序。也就是說,咱們輸入函數中的是1~9的方陣,而它實際做爲卷積核的是9~1的方陣。最後,由於padding=1,這對於卷積操做是向外加一層0,而對於逆卷積,就是去掉最外面的一層,因此獲得最終3x3的結果。io
最後,分析stride對轉置卷積的影響,將stride設爲2,以下圖:
分析在圖中都已寫明。你可能會奇怪,爲何這裏轉置卷積最終輸出與卷積的輸入形狀不一樣,這是由於卷積的padding並無被全都用上(只計算了一邊),而轉置卷積最後卻把兩邊的padding都去掉了,因此形成了卷積與轉置卷積不對應的狀況。
通過對以上各類實例的分析,對於某個$kernel \,size=k,stride=s,padding=p$的轉置卷積,若是輸入寬高都爲$n$,則輸出寬高爲
$\begin{aligned} m&=ns-(s-1)+2(k-1)-(k-1)-2p\\ &=(n-1)s-2p+k \\ \end{aligned}$
實際上,卷積與轉置卷積除了輸入輸出的形狀上相反之外,沒有別的聯繫,因此咱們只要會計算轉置卷積輸出的形狀便可。
以上圖都是用excel做的,已上傳至博客園文件,須要的能夠下載(點擊連接)。
[1] Zeiler M D, Krishnan D, Taylor G W, et al. Deconvolutional networks[C]. Computer Vision and Pattern Recognition, 2010.
[2] Zeiler M D, Fergus R. Visualizing and Understanding Convolutional Networks[C]. European Conference on Computer Vision, 2013.