網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
什么是上采樣
上采樣,在深度學(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中常用的來表示max pooling的逆操作。這是從2013年紐約大學(xué)Matthew D. Zeiler和Rob Fergus發(fā)表的《Visualizing and Understanding Convolutional Networks》中引用的:因?yàn)閙ax pooling不可逆,因此使用近似的方式來反轉(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)行上\下采樣操作,換句話說就是科學(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,則輸入和輸出張量通過其角像素的角點(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或沒有指定,傳入的scale_factor將在插值計(jì)算中使用。否則,將根據(jù)用于插值計(jì)算的輸出和輸入大小計(jì)算新的scale_factor(即,如果計(jì)算的output_size顯式傳入,則計(jì)算將相同 )。注意當(dāng)scale_factor 是浮點(diǎn)數(shù),由于舍入和精度問題,重新計(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ù),來等比放大數(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ī)視覺中,interpolate函數(shù)常用于圖像的放大(即上采樣操作)。比如在細(xì)粒度識(shí)別領(lǐng)域中,注意力圖有時(shí)候會(huì)對(duì)特征圖進(jìn)行裁剪操作,將有用的部分裁剪出來,裁剪后的圖像往往尺寸小于原始特征圖,這時(shí)候如果強(qiáng)制轉(zhuǎn)換成原始圖像大小,往往是無效的,會(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é)
原文鏈接:https://blog.csdn.net/qq_50001789/article/details/120297401
相關(guān)推薦
- 2024-01-13 git從某一個(gè)commit新建分支進(jìn)行開發(fā)
- 2022-07-24 .Net創(chuàng)建型設(shè)計(jì)模式之建造者、生成器模式(Builder)_基礎(chǔ)應(yīng)用
- 2022-12-10 C語(yǔ)言中使用qsort函數(shù)對(duì)自定義結(jié)構(gòu)體數(shù)組進(jìn)行排序_C 語(yǔ)言
- 2022-10-07 Android?Gradle?三方依賴管理詳解_Android
- 2022-01-13 使用element插件中Descriptions遇到的坑
- 2022-06-10 C++?STL?中的數(shù)值算法示例講解_C 語(yǔ)言
- 2022-08-29 Python+SeaTable實(shí)現(xiàn)計(jì)算兩個(gè)日期間的工作日天數(shù)_python
- 2023-10-24 ElementUI日期選擇器DatePicker限制所選時(shí)間范圍(例如限制前后時(shí)長(zhǎng)不超一個(gè)月)的實(shí)現(xiàn)
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支