1. 程式人生 > >深度學習基礎--卷積--反捲積(deconvolution)

深度學習基礎--卷積--反捲積(deconvolution)

反捲積(deconvolution)

  這個概念很混亂,沒有統一的定義,在不同的地方出現,意義卻不一樣。
  上取樣的卷積層有很多名字:

全卷積(full convolution),
網路內上取樣( in-network upsampling),
微步幅卷積(fractionally-strided convolution),
反向卷積(backwards convolution),
去卷積(deconvolution),
上卷積(upconvolution),
轉置卷積(transposed convolution)。

  用「去卷積」這個術語是非常不推薦的,因為這是一個過載的術語:在數學運算或計算機視覺中的其他應用有著完全不同的含義。

Deconvolution的應用

  1)unsupervised learning,其實就是covolutional sparse coding
  這裡的deconv只是觀念上和傳統的conv反向,傳統的conv是從圖片生成feature map,而deconv是用unsupervised的方法找到一組kernel和feature map,讓它們重建圖片。

  2)CNN視覺化
  通過deconv將CNN中conv得到的feature map還原到畫素空間,以觀察特定的feature map對哪些pattern的圖片敏感,這裡的deconv其實不是conv的可逆運算,只是conv的transpose,所以tensorflow裡一般取名叫transpose_conv。

  3)upsampling
  在pixel-wise prediction比如image segmentation以及image generation中,由於需要做原始圖片尺寸空間的預測,而卷積由於stride往往會降低圖片size, 所以往往需要通過upsampling的方法來還原到原始圖片尺寸,deconv就充當了一個upsampling的角色。
  例如:FCN網路(編碼-解碼模型)中的upsampling,GAN中的Generative圖片生成。

具體的運算

  和卷積過程完全相反。通俗的說,先處理input(擴大),再做正常卷積。

  反捲積相當於卷積的輸入與輸出層進行交換,
  i,o表示卷積過程的輸入輸出大小,s,p,k分別表示卷積核的步進,pad的大小,卷積核的大小
  i’,o’表示反捲積過程的輸入輸出大小,s’,p’,k’分別表示卷積核的步進,pad的大小,卷積核的大小(反捲積過程的卷積核是卷積過程卷積核的轉置)
  反捲積過程即為將s,p,k變成s’,p’,k’再進行卷積
在這裡插入圖片描述

反捲積的具體過程

  1)將k,s,p的值轉換為k’,s’,p’。
  K,s,p→K’=k,s’=1,p’=k-p-1(另外每個點之間pad s-1個0)

  2)利用轉置後的卷積核進行卷積

  參考資料:https://github.com/vdumoulin/conv_arithmetic

例子

  對3* 3的圖片進行反捲積,k=3,s=2,p=1
  相當於對3*3的圖片進行k’=3,s’=1,p’=1(另外每個點之間pad s-1個0)的卷積,
  如下圖所示,下面的藍色是輸入,上面的綠色是輸出,在輸入上移動的灰色的是卷積核。
  O’=s(i’-1)+k-2p
在這裡插入圖片描述