1. 程式人生 > 其它 >Unfold與fold介紹

Unfold與fold介紹

Unfold+fold


作者:elfin 參考資料來源:pytorch官網


目錄

Top---Bottom

1、nn.Unfold

nn.Unfold是pytorch實現的一個layer,那麼這個layer是幹嘛的呢?

torch.nn.Unfold(kernel_size: Union[T, Tuple[T, ...]], 
                dilation: Union[T, Tuple[T, ...]] = 1, 
                padding: Union[T, Tuple[T, ...]] = 0, 
                stride: Union[T, Tuple[T, ...]] = 1)

這裡有四個引數,與我們熟知的卷積操作很相似,那麼與卷積有什麼區別?

實際上nn.Unfold就是卷積操作的第一步。

​ 對於輸入特徵圖shape=[N,C,H,W],我們的Conv2d是怎麼工作的?

  • 第一步,padding特徵圖;

  • 第二步,過濾器視窗對應的特徵圖區域,平鋪這些元素;

  • 第三步,根據步長滑動視窗,並進行第二步的計算;

    此時我們得到的特徵圖\(shape=\left[ N, C \times k \times k, \frac{H}{stride} \times \frac{W}{stride} \right]\)

    上面的shape這裡給的是一般情況的特例,實際我們表示為:

    \(shape=(N, C \times \prod(\text{kernel_size}), L)\),其中\(L\)的計算為:

    \[L = \prod_d \left\lfloor\frac{\text{spatial_size}[d] + 2 \times \text{padding}[d] % - \text{dilation}[d] \times (\text{kernel_size}[d] - 1) - 1}{\text{stride}[d]} + 1\right\rfloor \]

    以上三步實際就是為乘法做準備!

  • 第四步,將卷積核與 Unfold 之後的物件相乘;

  • 第五步:[nn.Fold]

nn.Unfold就是將輸入的特徵圖“reshape”到卷積乘法所需要的形狀,只是很多元素在特徵圖中是重疊出現的,所以叫unfold,即我們要先平鋪。


Top---Bottom

2、nn.Fold

pytorch介面:

torch.nn.Fold(output_size, kernel_size, dilation=1, padding=0, stride=1)

對於\(shape=(N, C \times \prod(\text{kernel_size}), L)\)的輸入,nn.Fold計算得到輸出\(shape=(N, C, output\_size[0], output\_size[1])\)

那麼pytorch是怎麼處理這個過程的呢?輸入和輸出的shape明顯很難直觀對應起來,我們查詢原始碼,可以追溯到torch._C._nn.col2im函式,巧了,我們並不能在原始碼中找到其程式碼塊。下面是參考程式設計師修練之路的部落格給出的程式碼,我們對其進行驗證:

def col2im(input, output_size, block_size):
    p, q = block_size
    sx = output_size[0] - p + 1
    sy = output_size[1] - q + 1
    result = np.zeros(output_size)
    weight = np.zeros(output_size)  # weight記錄每個單元格的數字重複加了多少遍
    col = 0
    # 沿著行移動,所以先保持列(i)不動,沿著行(j)走
    for i in range(sy):
        for j in range(sx):
            result[j:j + p, i:i + q] += input[:, col].reshape(block_size, order='F')
            weight[j:j + p, i:i + q] += np.ones(block_size)
            col += 1
    return result / weight

這個Fold與上面的結果是差距較大的,待下次再研究吧 ……


Top---Bottom

完!

清澈的愛,只為中國