PyTorch中g(shù)rid_sample的使用及說明
關(guān)于grid_sample的使用
grid_sample底層是應(yīng)用雙線性插值,把輸入的tensor轉(zhuǎn)換為指定大小。
那它和interpolate有啥區(qū)別呢?
interpolate是規(guī)則采樣(uniform),但是grid_sample的轉(zhuǎn)換方式,內(nèi)部采點(diǎn)的方式并不是規(guī)則的,是一種更為靈活的方式。
torch.nn.functional.grid_sample(input, grid, mode=‘bilinear', padding_mode=‘zeros')
input:輸入tensor, shape為 [N, C, H_in, W_in]grid:一個(gè)field flow, shape為[N, H_out, W_out, 2],最后一個(gè)維度是每個(gè)grid(H_out_i, W_out_i)在input的哪個(gè)位置的鄰域去采點(diǎn)。數(shù)值范圍被歸一化到[-1,1]。
下面將介紹具體的例子
import torch from torch.nn import functional as F inp = torch.ones(1, 1, 4, 4) # 目的是得到一個(gè) 長寬為20的tensor out_h = 20 out_w = 20 # grid的生成方式等價(jià)于用mesh_grid new_h = torch.linspace(-1, 1, out_h).view(-1, 1).repeat(1, out_w) new_w = torch.linspace(-1, 1, out_w).repeat(out_h, 1) grid = torch.cat((new_h.unsqueeze(2), new_w.unsqueeze(2)), dim=2) grid = grid.unsqueeze(0) outp = F.grid_sample(inp, grid=grid, mode='bilinear') print(outp.shape) #torch.Size([1, 1, 20, 20])
在上面的例子中,我們將一個(gè)大小為4x4的tensor 轉(zhuǎn)換為了一個(gè)20x20的。
grid的大小指定了輸出大小,每個(gè)grid的位置是一個(gè)(x,y)坐標(biāo),其值來自于:輸入input的(x,y)中 的四鄰域插值得到的。

圖片來自于SFnet(eccv2020)。flow field是grid, low_resolution是input, high resolution是output。
至于grid的值是控制在-1,1的。那如何對應(yīng)在input上呢。
這個(gè)來看一下pytorch的底層源碼。
第66行到71行,獲取到了grid的x和y,之后對其做了新的變換,變到input的坐標(biāo)系下了。
IW和IH是input的寬和高。
real ix = THTensor_fastGet4d(grid, n, h, w, 0);
real iy = THTensor_fastGet4d(grid, n, h, w, 1);
// normalize ix, iy from [-1, 1] to [0, IH-1] & [0, IW-1]
ix = ((ix + 1) / 2) * (IW-1);
iy = ((iy + 1) / 2) * (IH-1);torch.nn.functional.grid_sample() 注意點(diǎn)
用法: 主要用于采樣,一般是使用bilinear根據(jù)grid的坐標(biāo)采樣
F.grid_sample(img, grid, align_corners=True)
img是采樣的空間,grid是生成的網(wǎng)格坐標(biāo)。grid通常由torch.meshgrid()生成,且要映射到(-1,1)之間,如:
dx = torch.linspace(-1,1, 9) dy = torch.linspace(-1, 1,7) coords = torch.stack(torch.meshgrid(dy, dx), axis=-1) ? #[dy*dx*2]
輸入輸出情況:
假如是4D 的input:
img.shape : [B,C,H_in,W_in] grid.shape: [B,H_out,W_out,2] out: [B,C,H_out,W_out]
細(xì)節(jié)
1.為什么meshgrid生成坐標(biāo)的時(shí)候,stack成coords時(shí)需要逆序(第一層是y,第二層是x)?
Ans:采樣的時(shí)候,在img上取點(diǎn),坐標(biāo)是根據(jù)grid來的,grid[:,:,0]是W維度的坐標(biāo),grid[:,:,1]是H維度的坐標(biāo),所以這個(gè)地方需要注意,是反過來的
2.grid的形狀僅僅影響output的形狀,直接決定取點(diǎn)的還是坐標(biāo),所以尤其要注意grid坐標(biāo)疊。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解pyppeteer(python版puppeteer)基本使用
這篇文章主要介紹了詳解pyppeteer(python版puppeteer)基本使用 ,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
導(dǎo)致python中import錯(cuò)誤的原因是什么
在本篇文章里小編給大家整理了關(guān)于python的import錯(cuò)誤原因以及相關(guān)內(nèi)容,需要的朋友們可以學(xué)習(xí)下。2020-07-07
Python連接PostgreSQL數(shù)據(jù)庫并查詢數(shù)據(jù)的詳細(xì)指南
在現(xiàn)代軟件開發(fā)中,數(shù)據(jù)庫是存儲和檢索數(shù)據(jù)的核心組件,PostgreSQ是一個(gè)功能強(qiáng)大的開源對象關(guān)系數(shù)據(jù)庫系統(tǒng),它以其穩(wěn)定性、強(qiáng)大的功能和靈活性而聞名,Python作為一種流行的編程語言,與PostgreSQL的結(jié)合使用非常廣泛,本文介紹了Python連接PostgreSQL數(shù)據(jù)庫并查詢數(shù)據(jù)2024-12-12
python正則表達(dá)式修復(fù)網(wǎng)站文章字體不統(tǒng)一的解決方法
python正則表達(dá)式修復(fù)網(wǎng)站文章字體不統(tǒng)一的解決方法,需要的朋友可以參考一下2013-02-02
關(guān)于Python正則表達(dá)式 findall函數(shù)問題詳解
在寫正則表達(dá)式的時(shí)候總會遇到不少的問題,本文講述了Python正則表達(dá)式中 findall()函數(shù)和多個(gè)表達(dá)式元組相遇的時(shí)候會出現(xiàn)的問題2018-03-03

