1. 程式人生 > >Tensorflow中的反捲積

Tensorflow中的反捲積

  • 實現函式:tf.nn.conv2d_transpose(input_tensor, filter_weights_tensor, output_shape, strides, padding)
    • input_tensor: 代表的是輸入的tensor,預設的size是[batch_size, w, h, channel]
    • filter_weight_tensor: 代表卷積運算時filter引數的tensor,預設的size是[filter_size, filter_size, output_channel, in_channel]
    • output_shape: 代表輸出的tensor的大小,是一個list[batch_size, output_w, output_h, output_channel]
    • strides: 代表對應卷積操作的步長,[1, stride_w, stride_h, 1]
    • padding: 補全的方式
  • 注意,如果outputshape沒設定對的話,會在執行時報錯。
  • 那麼如何計算output shape呢?這裡我們把反捲積稱之為卷積操作的轉置。假設我們padding的方式是SAME,輸入影象的size是 w

    i , h i , c i ,輸入影象的size是
    w o , h o , c o
    。filter的size是 f w , f h 。stride的大小是 s w , s h

    • c o 是取決於filter的個數。
    • w o = w i s w
    • h o = h i s h
    • 這裡我們就疑惑了,為什麼步長設定大了,反而得到的輸出結果還變大了呢?

      • 從理解角度來說,因為我們這裡是將反捲積看作卷積的轉置,所以我們可以把stride看成對應卷積操作的步長。比如說,我們通過卷積操作將 w o , h o 變成了 w i , h i ,這裡的步長就是上述卷積操作的步長。
      • 從實現角度來講,我們知道反捲積的本質還是卷積,他其實是在影象內部插入了許多0點,從而實現了步長大於1的操作。如下圖所示,其中藍色框中間的點就是插入的0點。其實內部反捲積的步長還是1,但是對應的卷積的步長就是2了。
        image

      反捲積和卷積的動畫

      • 每個反捲積操作都可以看成一個卷積操作的轉置,由於shape可以決定padding和stride的大小,我們的反捲積的padding 和stride大小和對應的卷積的padding和stride大小一致