日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Unfold与fold介绍

發(fā)布時間:2023/12/15 综合教程 39 生活家
生活随笔 收集整理的這篇文章主要介紹了 Unfold与fold介绍 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Unfold+fold

作者:elfin
參考資料來源:pytorch官網(wǎng)


目錄1、nn.Unfold2、nn.Fold


Top---Bottom

1、nn.Unfold

nn.Unfold是pytorch實現(xiàn)的一個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)

這里有四個參數(shù),與我們熟知的卷積操作很相似,那么與卷積有什么區(qū)別?

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

? 對于輸入特征圖shape=[N,C,H,W],我們的Conv2d是怎么工作的?

第一步,padding特征圖;

第二步,過濾器窗口對應的特征圖區(qū)域,平鋪這些元素;

第三步,根據(jù)步長滑動窗口,并進行第二步的計算;

此時我們得到的特征圖(shape=left[ N, C imes k imes k, frac{H}{stride} imes frac{W}{stride} ight])

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

(shape=(N, C imes prod( ext{kernel_size}), L)),其中(L)的計算為:

[L = prod_d leftlfloorfrac{ ext{spatial_size}[d] + 2 imes ext{padding}[d] %
- ext{dilation}[d] imes ( ext{kernel_size}[d] - 1) - 1}{ ext{stride}[d]} + 1ightfloor
]

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

第四步,將卷積核與 Unfold 之后的對象相乘;

第五步:[nn.Fold]

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


Top---Bottom

2、nn.Fold

pytorch接口:

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

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

那么pytorch是怎么處理這個過程的呢?輸入和輸出的shape明顯很難直觀對應起來,我們查詢源碼,可以追溯到torch._C._nn.col2im函數(shù),巧了,我們并不能在源碼中找到其代碼塊。下面是參考程序員修練之路的博客給出的代碼,我們對其進行驗證:

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記錄每個單元格的數(shù)字重復加了多少遍
    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與上面的結果是差距較大的,待下次再研究吧 ……

nn.Fold的處理過程

明顯上面的結果在nn.Fold上是不成立的,下面我們以下圖展示其處理過程:

Fold的處理步驟如下:

第一步: 從輸入中選擇一個block某通道上的所有元素,將其reshape到指定的形狀,這里的形狀就是kernal_size。需要注意的是dim=1的維度與kernal_size的關系。
第二步: 在輸出矩陣上填充reshape后的值。
第三步: 在輸入矩陣上使用stride=1進行滑窗,在輸出矩陣上,使用nn.Fold指定的stride進行滑窗,重復第一步、第二步。


Top---Bottom

完!

清澈的愛,只為中國

總結

以上是生活随笔為你收集整理的Unfold与fold介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。