Pytorch上下采樣函數(shù)之F.interpolate數(shù)組采樣操作詳解
什么是上采樣
上采樣,在深度學(xué)習(xí)框架中,可以簡(jiǎn)單的理解為任何可以讓你的圖像變成更高分辨率的技術(shù)。 最簡(jiǎn)單的方式是重采樣和插值:將輸入圖片input image進(jìn)行rescale到一個(gè)想要的尺寸,而且計(jì)算每個(gè)點(diǎn)的像素點(diǎn),使用如雙線性插值bilinear等插值方法對(duì)其余點(diǎn)進(jìn)行插值。
Unpooling是在CNN中常用的來(lái)表示max pooling的逆操作。這是從2013年紐約大學(xué)Matthew D. Zeiler和Rob Fergus發(fā)表的《Visualizing and Understanding Convolutional Networks》中引用的:因?yàn)閙ax pooling不可逆,因此使用近似的方式來(lái)反轉(zhuǎn)得到max pooling操作之前的原始情況;
F.interpolate——數(shù)組采樣操作
torch.nn.functional.interpolate(input, size=None, scale_factor=None, mode='nearest', align_corners=None, recompute_scale_factor=None)
功能:利用插值方法,對(duì)輸入的張量數(shù)組進(jìn)行上\下采樣操作,換句話說(shuō)就是科學(xué)合理地改變數(shù)組的尺寸大小,盡量保持?jǐn)?shù)據(jù)完整。
輸入:
- input(Tensor):需要進(jìn)行采樣處理的數(shù)組。
- size(int或序列):輸出空間的大小
- scale_factor(float或序列):空間大小的乘數(shù)
- mode(str):用于采樣的算法。'nearest'| 'linear'| 'bilinear'| 'bicubic'| 'trilinear'| 'area'。默認(rèn):'nearest'
- align_corners(bool):在幾何上,我們將輸入和輸出的像素視為正方形而不是點(diǎn)。如果設(shè)置為True,則輸入和輸出張量按其角像素的中心點(diǎn)對(duì)齊,保留角像素處的值。如果設(shè)置為False,則輸入和輸出張量通過(guò)其角像素的角點(diǎn)對(duì)齊,并且插值使用邊緣值填充用于邊界外值,使此操作在保持不變時(shí)獨(dú)立于輸入大小scale_factor。
- recompute_scale_facto(bool):重新計(jì)算用于插值計(jì)算的 scale_factor。當(dāng)scale_factor作為參數(shù)傳遞時(shí),它用于計(jì)算output_size。如果recompute_scale_factor的False或沒(méi)有指定,傳入的scale_factor將在插值計(jì)算中使用。否則,將根據(jù)用于插值計(jì)算的輸出和輸入大小計(jì)算新的scale_factor(即,如果計(jì)算的output_size顯式傳入,則計(jì)算將相同 )。注意當(dāng)scale_factor 是浮點(diǎn)數(shù),由于舍入和精度問(wèn)題,重新計(jì)算的 scale_factor 可能與傳入的不同。
注意:
- 輸入的張量數(shù)組里面的數(shù)據(jù)類型必須是float。
- 輸入的數(shù)組維數(shù)只能是3、4或5,分別對(duì)應(yīng)于時(shí)間、空間、體積采樣。
- 不對(duì)輸入數(shù)組的前兩個(gè)維度(批次和通道)采樣,從第三個(gè)維度往后開始采樣處理。
- 輸入的維度形式為:批量(batch_size)×通道(channel)×[可選深度]×[可選高度]×寬度(前兩個(gè)維度具有特殊的含義,不進(jìn)行采樣處理)
- size與scale_factor兩個(gè)參數(shù)只能定義一個(gè),即兩種采樣模式只能用一個(gè)。要么讓數(shù)組放大成特定大小、要么給定特定系數(shù),來(lái)等比放大數(shù)組。
- 如果size或者scale_factor輸入序列,則必須匹配輸入的大小。如果輸入四維,則它們的序列長(zhǎng)度必須是2,如果輸入是五維,則它們的序列長(zhǎng)度必須是3。
- 如果size輸入整數(shù)x,則相當(dāng)于把3、4維度放大成(x,x)大小(輸入以四維為例,下面同理)。
- 如果scale_factor輸入整數(shù)x,則相當(dāng)于把3、4維度都等比放大x倍。
- mode是’linear’時(shí)輸入必須是3維的;是’bicubic’時(shí)輸入必須是4維的;是’trilinear’時(shí)輸入必須是5維的
- 如果align_corners被賦值,則mode必須是'linear','bilinear','bicubic'或'trilinear'中的一個(gè)。
- 插值方法不同,結(jié)果就不一樣,需要結(jié)合具體任務(wù),選擇合適的插值方法。
補(bǔ)充:
一圖看懂a(chǎn)lign_corners=True與False的區(qū)別,從4×4上采樣成8×8。一個(gè)是按四角的像素點(diǎn)中心對(duì)齊,另一個(gè)是按四角的像素角點(diǎn)對(duì)齊。
圖片轉(zhuǎn)自:https://discuss.pytorch.org/t/what-we-should-use-align-corners-false/22663/9
代碼案例
一般用法
import torch.nn.functional as F import torch a=torch.arange(12,dtype=torch.float32).reshape(1,2,2,3) b=F.interpolate(a,size=(4,4),mode='bilinear') # 這里的(4,4)指的是將后兩個(gè)維度放縮成4*4的大小 print(a) print(b) print('原數(shù)組尺寸:',a.shape) print('size采樣尺寸:',b.shape)
輸出結(jié)果,一二維度大小不會(huì)發(fā)生變化
# 原數(shù)組
tensor([[[[ 0., 1., 2.],
[ 3., 4., 5.]],[[ 6., 7., 8.],
[ 9., 10., 11.]]]])
# 采樣后的數(shù)組
tensor([[[[ 0.0000, 0.6250, 1.3750, 2.0000],
[ 0.7500, 1.3750, 2.1250, 2.7500],
[ 2.2500, 2.8750, 3.6250, 4.2500],
[ 3.0000, 3.6250, 4.3750, 5.0000]],[[ 6.0000, 6.6250, 7.3750, 8.0000],
[ 6.7500, 7.3750, 8.1250, 8.7500],
[ 8.2500, 8.8750, 9.6250, 10.2500],
[ 9.0000, 9.6250, 10.3750, 11.0000]]]])
原數(shù)組尺寸: torch.Size([1, 2, 2, 3])
size采樣尺寸: torch.Size([1, 2, 4, 4])
# 規(guī)定三四維度放縮成4*4大小
size與scale_factor的區(qū)別:輸入序列時(shí)
import torch.nn.functional as F import torch a=torch.arange(4*512*14*14,dtype=torch.float32).reshape(4,512,14,14) b=F.interpolate(a,size=(28,56),mode='bilinear') c=F.interpolate(a,scale_factor=(4,8),mode='bilinear') print('原數(shù)組尺寸:',a.shape) print('size采樣尺寸:',b.shape) print('scale_factor采樣尺寸:',c.shape)
輸出結(jié)果
原數(shù)組尺寸: torch.Size([4, 512, 14, 14])
size采樣尺寸: torch.Size([4, 512, 28, 56])
# 第三維度放大成28,第四維度放大成56
scale_factor采樣尺寸: torch.Size([4, 512, 56, 112])
# 第三維度放大4倍,第四維度放8倍
size與scale_factor的區(qū)別:輸入整數(shù)時(shí)
import torch.nn.functional as F import torch a=torch.arange(4*512*14*14,dtype=torch.float32).reshape(4,512,14,14) b=F.interpolate(a,size=28,mode='bilinear') c=F.interpolate(a,scale_factor=4,mode='bilinear') print('原數(shù)組尺寸:',a.shape) print('size采樣尺寸:',b.shape) print('scale_factor采樣尺寸:',c.shape)
輸出結(jié)果
原數(shù)組尺寸: torch.Size([4, 512, 14, 14])
size采樣尺寸: torch.Size([4, 512, 28, 28])
# 三四維度數(shù)組被放大成28*28
scale_factor采樣尺寸: torch.Size([4, 512, 56, 56])
# 三四維度數(shù)組被放大了4倍
align_corners=True與False的區(qū)別
import torch.nn.functional as F import torch a=torch.arange(18,dtype=torch.float32).reshape(1,2,3,3) b=F.interpolate(a,size=(4,4),mode='bicubic',align_corners=True) c=F.interpolate(a,size=(4,4),mode='bicubic',align_corners=False) print(a) print(b) print(c)
輸出結(jié)果,具體效果會(huì)因mode插值方法而異
tensor([[[[ 0., 1., 2.],
[ 3., 4., 5.],
[ 6., 7., 8.]],[[ 9., 10., 11.],
[12., 13., 14.],
[15., 16., 17.]]]])
# align_corners=True
tensor([[[[ 0.0000, 0.5741, 1.4259, 2.0000],
[ 1.7222, 2.2963, 3.1481, 3.7222],
[ 4.2778, 4.8519, 5.7037, 6.2778],
[ 6.0000, 6.5741, 7.4259, 8.0000]],[[ 9.0000, 9.5741, 10.4259, 11.0000],
[10.7222, 11.2963, 12.1481, 12.7222],
[13.2778, 13.8519, 14.7037, 15.2778],
[15.0000, 15.5741, 16.4259, 17.0000]]]])
# align_corners=False
tensor([[[[-0.2871, 0.3145, 1.2549, 1.8564],
[ 1.5176, 2.1191, 3.0596, 3.6611],
[ 4.3389, 4.9404, 5.8809, 6.4824],
[ 6.1436, 6.7451, 7.6855, 8.2871]],[[ 8.7129, 9.3145, 10.2549, 10.8564],
[10.5176, 11.1191, 12.0596, 12.6611],
[13.3389, 13.9404, 14.8809, 15.4824],
[15.1436, 15.7451, 16.6855, 17.2871]]]])
擴(kuò)展:
在計(jì)算機(jī)視覺(jué)中,interpolate函數(shù)常用于圖像的放大(即上采樣操作)。比如在細(xì)粒度識(shí)別領(lǐng)域中,注意力圖有時(shí)候會(huì)對(duì)特征圖進(jìn)行裁剪操作,將有用的部分裁剪出來(lái),裁剪后的圖像往往尺寸小于原始特征圖,這時(shí)候如果強(qiáng)制轉(zhuǎn)換成原始圖像大小,往往是無(wú)效的,會(huì)丟掉部分有用的信息。所以這時(shí)候就需要用到interpolate函數(shù)對(duì)其進(jìn)行上采樣操作,在保證圖像信息不丟失的情況下,放大圖像,從而放大圖像的細(xì)節(jié),有利于進(jìn)一步的特征提取工作。
官方文檔
torch.nn.functional.interpolate:https://pytorch.org/docs/stable/generated/torch.nn.functional.interpolate.html?highlight=interpolate#torch.nn.functional.interpolate
總結(jié)
到此這篇關(guān)于Pytorch上下采樣函數(shù)之F.interpolate數(shù)組采樣操作的文章就介紹到這了,更多相關(guān)Pytorch F.interpolate數(shù)組采樣內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python編程語(yǔ)言的35個(gè)與眾不同之處(語(yǔ)言特征和使用技巧)
這篇文章主要介紹了Python編程語(yǔ)言的35個(gè)與眾不同之處,Python編程語(yǔ)言的語(yǔ)言特征和使用技巧,需要的朋友可以參考下2014-07-07畫pytorch模型圖,以及參數(shù)計(jì)算的方法
今天小編就為大家分享一篇畫pytorch模型圖,以及參數(shù)計(jì)算的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08使用keras實(shí)現(xiàn)Precise, Recall, F1-socre方式
這篇文章主要介紹了使用keras實(shí)現(xiàn)Precise, Recall, F1-socre方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06