[PyTorch] non-local的patch版本實現(xiàn)

MM 18有篇文章《Non-locally Enhanced Encoder-Decoder Network for Single Image De-raining》,這篇文章把兩大吃顯存利器——non-local 和 densely connection一起給用了(絕望臉)耕捞,如果要控制顯存使用的話宽堆,就對實現(xiàn)要求比較高了奇昙。里面提到了一個控制 non-local 運算的方法纤控,將feature map劃分成patch,在patch內(nèi)進行non-local操作活烙,而不是原來的全局non-local徐裸。

思路

這里實現(xiàn)一下這個patch版本的non-local。一般的non-local實現(xiàn)啸盏,請參考:Github 傳送門重贺。
思路很簡單,就是把patch的索引作為一個特殊的batch索引,原來的non-local運算會逐batch中的樣本進行气笙,現(xiàn)在就是逐batch中的樣本次企、逐每個樣本中的patch進行了。

圖1. 新的索引

上圖中潜圃,索引的第1個位置表示batch缸棵,第2、3個位置表示patch谭期,將1~3個位置的索引看成整體堵第,作為這個特殊的“batch”的索引。此時崇堵,patch版本的 non-local 就和一般的 non-local 沒有太大區(qū)別了型诚。

實現(xiàn)

那么,如何實現(xiàn)這樣的一個新索引呢鸳劳?
假如有輸入圖像 (B, C, H, W)狰贯,首先需要將最后兩個表示位置的索引分解成四個索引,兩個表示塊的位置赏廓,兩個表示塊中元素的位置涵紊,例如要將行分解成m塊、列分解成n塊幔摸,就得到(B, C, m, H/m, n, W/n)摸柄,使用 view 方法就能實現(xiàn)。如果對這個實現(xiàn)有疑惑既忆,可以參考附錄中的例子驱负。
然后進行轉(zhuǎn)置(或者說是交換索引的位置),得到(B, m, n, C, H/m, W/n)患雇。這里使用前三個索引跃脊,表示具體某個patch(batch中某個feature map的某個patch)。最后苛吱,使用這個新的Tensor來進行non-local的操作即可酪术,方法類似,僅僅是在前面多了兩個索引翠储。

# implementation in PyTorch
# x=>(b, c, m, h/m, n, w/n)
# e.g. nb_patches = [2, 2]
b, c, h, w = x.size()
x = x.view(b, c,
           nb_patches[0], h / nb_patches[0],
           nb_patches[1], w / nb_patches[1])
# x=>(b, m, n, h/m, w/n, c)->(b, m, n, h/m*w/n, c)
x = x.permute(0, 2, 4, 3, 5, 1).contiguous()
x = x.view(b, nb_patches[0], nb_patches[1], -1, c)

附錄

圖2. view 用法舉例

如果不確定view的使用绘雁,可以舉個簡單的例子,如上圖的4 \times 4的一個方塊 X援所,顯然大小就是(1, 1, 4, 4)庐舟。上圖里中間一列,左邊表示元素住拭,右邊表示原來的元素索引继阻。如果使用 view 就是在新的 Tensor 中按順序排列舊的 Tensor 中的元素耻涛。按如下代碼重新排列元素废酷。圖中右邊一列瘟檩,就是使用了 view 后的新索引。

X = X.view(1, 1, 2, 4/2, 2, 4/2)

所以澈蟆,對于左上角的patch墨辛,其索引是(0,0),右上角則是(0, 1)趴俘,也就是使用view得到新的 Tensor的第3睹簇、5個位置的索引。

待填坑: Tensor中的contiguous方法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寥闪,一起剝皮案震驚了整個濱河市太惠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疲憋,老刑警劉巖凿渊,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缚柳,居然都是意外死亡埃脏,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門秋忙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來彩掐,“玉大人,你說我怎么就攤上這事灰追《掠模” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵弹澎,是天一觀的道長朴下。 經(jīng)常有香客問我,道長裁奇,這世上最難降的妖魔是什么桐猬? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮刽肠,結(jié)果婚禮上溃肪,老公的妹妹穿的比我還像新娘。我一直安慰自己音五,他們只是感情好惫撰,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著躺涝,像睡著了一般厨钻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天夯膀,我揣著相機與錄音诗充,去河邊找鬼。 笑死诱建,一個胖子當(dāng)著我的面吹牛蝴蜓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播俺猿,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼茎匠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了押袍?” 一聲冷哼從身側(cè)響起诵冒,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谊惭,沒想到半個月后汽馋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡午笛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年惭蟋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片药磺。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡告组,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出癌佩,到底是詐尸還是另有隱情木缝,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布围辙,位于F島的核電站我碟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏姚建。R本人自食惡果不足惜矫俺,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望掸冤。 院中可真熱鬧厘托,春花似錦、人聲如沸稿湿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽饺藤。三九已至包斑,卻和暖如春流礁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背罗丰。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工神帅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人丸卷。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓枕稀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親谜嫉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容