1、torch.nn.Unfold
函數(shù)作用:
unfold?是展開的意思涩笤,在?torch?中則是只卷不積匾浪,相當(dāng)于只滑窗,不進(jìn)行元素相乘
參數(shù):
kernel_size: _size_any_t, 卷積核的大小
dilation: _size_any_t=1, 卷積核元素之間的空洞個(gè)數(shù)
padding: _size_any_t=0, 填充特征四周的列數(shù)粹淋,默認(rèn)為 0,則不填充
stride: _size_any_t=1瑟慈,卷積核移動(dòng)的步長(zhǎng)
函數(shù)理解:
參考資料:
PYTORCH實(shí)現(xiàn)手動(dòng)滑窗廓啊,卷積(利用UNFOLD,FOLD操作)
unfold 過程:
① 對(duì)于 batch 里的每個(gè)數(shù)據(jù)分別進(jìn)行 unfold
② 分別在每個(gè)數(shù)據(jù)的每個(gè)通道上,使用大小為 k*k 的卷積核進(jìn)行從左往右封豪,從上向下的滑窗
③ 對(duì)于在每個(gè)通道上分別得到的第一個(gè)滑窗區(qū)域,分別進(jìn)行 reshape 成行向量炒瘟,然后把在所有通道上得到的行向量吹埠,進(jìn)行橫向拼接,得到新的行向量
④ 對(duì)于在每個(gè)通道上得到的滑窗區(qū)域都進(jìn)行步驟 ③ 的操作疮装,直到所有的滑窗區(qū)域都處理完
⑤ 將步驟 ③ 和 步驟 ④ 中得到的行向量缘琅,進(jìn)行縱向拼接,得到一個(gè)矩陣
⑥ 完成 unfold 操作廓推,將 batch 中每個(gè)數(shù)據(jù)進(jìn)行 unfold 得到的矩陣進(jìn)行堆放刷袍,得到輸出結(jié)果
例子:
x?=?torch.range(1,?2*3*4*5)
print(x.shape)
batch_x?=?x.reshape([2,?3,?4,?5])
print(batch_x.shape)
#?unfold?是展開的意思,在?torch?中則是只卷不積樊展,相當(dāng)于只滑窗呻纹,不進(jìn)行元素相乘
unfold?=?torch.nn.Unfold(3)
res?=?unfold(batch_x)
print(res.shape)
結(jié)果:
torch.Size([2, 27, 6])
分析:
假設(shè)輸入的 batch_x 維度為 [2, 3, 4, 5],其中 2 是批的數(shù)據(jù)量大小 B专缠, 3 是通道數(shù) C雷酪,4 是高度 H,5 是寬度 W 涝婉。使用的卷積核大小 K 為 3*3哥力,移動(dòng)步長(zhǎng) S 為 1,padding 為 0
① 在 B 的每個(gè)數(shù)據(jù)上進(jìn)行 unfold
② 同時(shí)在每個(gè)通道上的最左上角開始進(jìn)行滑動(dòng)墩弯,對(duì)于每個(gè)通道吩跋,得到大小為 9 的滑動(dòng)區(qū)域,然后進(jìn)行 Reshape 成維度為 [1, 9] 的行向量渔工。然后將在所有 3 個(gè)通道上得到的 3 個(gè)行向量锌钮,進(jìn)行橫向拼接,得到維度為 [1, 27] 的行向量涨缚。
③ 依次將卷積核按照從左到右轧粟,從上往下的順序策治,按照步長(zhǎng) 1 進(jìn)行滑動(dòng),每個(gè)滑動(dòng)的區(qū)域經(jīng)過步驟 ② 中處理后都能得到一個(gè)維度為 [1, 27] 的行向量兰吟,共得到 6 個(gè)維度為 [1, 27]通惫,然后縱向堆疊成維度為 [6, 27] 的矩陣
④ 將每個(gè)數(shù)據(jù)經(jīng)過 unfold 得到的維度為 [6, 27]? 的矩陣進(jìn)行堆疊成維度為 [2, 27, 6]? 的張量