F.interpolate——数组采样操作

torch.nn.functional.interpolate(input, size=None, scale_factor=None, mode='nearest', align_corners=None, recompute_scale_factor=None)

功能:利用插值方法,对输入的张量数组进行上\下采样操作,换句话说就是科学合理地改变数组的尺寸大小,尽量保持数据完整。

输入:

  • input(Tensor):需要进行采样处理的数组。
  • size(int或序列):输出空间的大小
  • scale_factor(float或序列):空间大小的乘数
  • mode(str):用于采样的算法。'nearest'| 'linear'| 'bilinear'| 'bicubic'| 'trilinear'| 'area'。默认:'nearest'
  • align_corners(bool):在几何上,我们将输入和输出的像素视为正方形而不是点。如果设置为True,则输入和输出张量按其角像素中心点对齐,保留角像素处的值。如果设置为False,则输入和输出张量通过其角像素角点对齐,并且插值使用边缘值填充用于边界外值,使此操作在保持不变时独立于输入大小scale_factor
  • recompute_scale_facto(bool):重新计算用于插值计算的 scale_factor。当scale_factor作为参数传递时,它用于计算output_size。如果recompute_scale_factor的False或没有指定,传入的scale_factor将在插值计算中使用。否则,将根据用于插值计算的输出和输入大小计算新的scale_factor(即,如果计算的output_size显式传入,则计算将相同 )。注意当scale_factor 是浮点数,由于舍入和精度问题,重新计算的 scale_factor 可能与传入的不同。

注意:

  • 输入的张量数组里面的数据类型必须是float
  • 输入的数组维数只能是3、4或5,分别对应于时间、空间、体积采样。
  • 不对输入数组的前两个维度(批次和通道)采样,从第三个维度往后开始采样处理。
  • 输入的维度形式为:批量(batch_size)×通道(channel)×[可选深度]×[可选高度]×宽度(前两个维度具有特殊的含义,不进行采样处理)
  • sizescale_factor两个参数只能定义一个,即两种采样模式只能用一个。要么让数组放大成特定大小、要么给定特定系数,来等比放大数组。
  • 如果size或者scale_factor输入序列,则必须匹配输入的大小。如果输入四维,则它们的序列长度必须是2,如果输入是五维,则它们的序列长度必须是3。
  • 如果size输入整数x,则相当于把3、4维度放大成(x,x)大小(输入以四维为例,下面同理)。
  • 如果scale_factor输入整数x,则相当于把3、4维度都等比放大x倍。
  • mode是’linear’时输入必须是3维的;是’bicubic’时输入必须是4维的;是’trilinear’时输入必须是5维的
  • 如果align_corners被赋值,则mode必须是'linear''bilinear''bicubic''trilinear'中的一个。
  • 插值方法不同,结果就不一样,需要结合具体任务,选择合适的插值方法

补充:

一图看懂align_corners=True与False的区别,从4×4上采样成8×8。一个是按四角的像素点中心对齐,另一个是按四角的像素角点对齐。

图片转自:https://discuss.pytorch.org/t/what-we-should-use-align-corners-false/22663/9

代码案例

一般用法

import torch.nn.functional as F
import torcha=torch.arange(12,dtype=torch.float32).reshape(1,2,2,3)
b=F.interpolate(a,size=(4,4),mode='bilinear')
# 这里的(4,4)指的是将后两个维度放缩成4*4的大小
print(a)
print(b)
print('原数组尺寸:',a.shape)
print('size采样尺寸:',b.shape)

输出结果,一二维度大小不会发生变化

# 原数组
tensor([[[[ 0.,  1.,  2.],[ 3.,  4.,  5.]],[[ 6.,  7.,  8.],[ 9., 10., 11.]]]])
# 采样后的数组
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]]]])
原数组尺寸: torch.Size([1, 2, 2, 3])
size采样尺寸: torch.Size([1, 2, 4, 4])
# 规定三四维度放缩成4*4大小

sizescale_factor的区别:输入序列时

import torch.nn.functional as F
import torcha=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('原数组尺寸:',a.shape)
print('size采样尺寸:',b.shape)
print('scale_factor采样尺寸:',c.shape)

输出结果

原数组尺寸: 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倍

sizescale_factor的区别:输入整数时

import torch.nn.functional as F
import torcha=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('原数组尺寸:',a.shape)
print('size采样尺寸:',b.shape)
print('scale_factor采样尺寸:',c.shape)

输出结果

原数组尺寸: torch.Size([4, 512, 14, 14])
size采样尺寸: torch.Size([4, 512, 28, 28])
# 三四维度数组被放大成28*28
scale_factor采样尺寸: torch.Size([4, 512, 56, 56])
# 三四维度数组被放大了4倍

align_corners=True与False的区别

import torch.nn.functional as F
import torcha=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)

输出结果,具体效果会因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]]]])

扩展:

在计算机视觉中,interpolate函数常用于图像的放大(即上采样操作)。比如在细粒度识别领域中,注意力图有时候会对特征图进行裁剪操作,将有用的部分裁剪出来,裁剪后的图像往往尺寸小于原始特征图,这时候如果强制转换成原始图像大小,往往是无效的,会丢掉部分有用的信息。所以这时候就需要用到interpolate函数对其进行上采样操作,在保证图像信息不丢失的情况下,放大图像,从而放大图像的细节,有利于进一步的特征提取工作。

官方文档

torch.nn.functional.interpolate:https://pytorch.org/docs/stable/generated/torch.nn.functional.interpolate.html?highlight=interpolate#torch.nn.functional.interpolate

点个赞支持一下吧

F.interpolate——数组采样操作相关推荐

  1. js 的数组怎么push一个对象. Js数组的操作push,pop,shift,unshift JavaScrip

    js 的数组怎么push一个对象. Js数组的操作push,pop,shift,unshift JavaScrip push()函数用于向当前数组的添加一个或多个元素,并返回新的数组长度.新的元素将会 ...

  2. ARM汇编和C语言混合编程中数组的数组的操作

    ARM汇编和C语言混合编程中数组的数组的操作 此示例描述a数组中的元素累加的结果,c和b交换的实例: 代码块 例如: #include <stdio.h>int main (int arg ...

  3. 黑马程序员_数组的操作

    ----------------------------------------------------------------------------- android培训.java培训.期待与您交 ...

  4. PHP多维数组元素操作类

    我的框架里面一个多维数组元素操作类,主要用于读取数组中配置数据,可以通过字符串节点的方式:a.b.c 来获取和设置元素,以及多维数组的覆盖,有需求的可以参考下吧! <?php /*** Crea ...

  5. js截取数组的操作 - Kaiqisan

    js截取数组的操作 hey みんなさんこんにちはKaiqisanと申します.一つの学生プログラマーである-,今天来讲一下截取数组的操作.由于我在项目的实践中总是会用到这个方法但是经常会忘记这些方法的时 ...

  6. java数组如何pop_Js数组的操作push,pop,shift,unshift等方法详细介绍

    js中针对数组操作的方法还是比较多的,今天突然想到来总结一下,也算是温故而知新吧.不过不会针对每个方法进行讲解,我只是选择其中的一些来讲. 首先来讲一下push和pop方法,这两个方法只会对数组从尾部 ...

  7. C# 指定格式的字符串截成一维数组(二维数组)的操作类

    指定格式的字符串截成一维数组(二维数组)的操作类 做项目时经常会遇到将"1,3,a,b,d"截成一维数组或将"1,a;2,b;3,c;4,d"截成二维数组.虽然 ...

  8. JAVA-初步认识-第五章-数组-常见操作-最值

    一. 最值 数组的操作是对数组中的元素进行操作,有时需要对元素的位置重新进行安排,有时仅需要提供题目需要的那个数据. 在视频没有讲解怎么做之前,我先提供一个思路.得出最值肯定是一个一个地比较出来的,这 ...

  9. 【C 语言】字符串操作 ( 使用 数组下标 操作字符串 | 使用 char * 指针 操作字符串 )

    文章目录 一.使用 数组下标 或 指针 操作字符串 1.使用 数组下标 操作字符串 2.使用 char * 指针 操作字符串 二.代码示例 一.使用 数组下标 或 指针 操作字符串 1.使用 数组下标 ...

  10. Java数组常见操作

    Java数组常见操作 文章目录 Java数组常见操作 7.0 数组的遍历 1.使用foreach循环访问数组中每个元素. 2.使用简单的for循环(多层循环嵌套)来遍历数组. 7.1 数组长度 7.2 ...

最新文章

  1. 华为硬件笔试 通用器件知识2_华为硬件笔试题(最新版)
  2. One Day-XML:XSLT
  3. Android中dispatchTouchEvent, onInterceptTouchEvent, onTouchEvent的理解
  4. SVN服务器与客户端的配置
  5. 《图解HTTP》读书笔记--第8章 确认访问用户身份的认证
  6. Python学习总结15:时间模块datetime time calendar (二)
  7. 程序猿 自己所擅长的还是码代码 请远离 业务。
  8. Buddy分配器之释放一页
  9. 身份证实名认证java后台代码
  10. se服务器系统,使用CloneZilla服务器版克隆Linux系统(CloneZilla SE)
  11. OSChina 周二乱弹 ——女孩在身上纹了个四叶草
  12. 转-快找个程序员做老公吧
  13. 利用gpu加速神经网络算法,外接gpu 训练神经网络
  14. 运筹说 第29期 | 对偶理论与灵敏度分析—影子价格
  15. 爬虫四步曲大神一步一步来教你,使用python抓取网页数据并储存
  16. 提问之前我们应该做些什么 -Leo读提问的智慧 1
  17. BZOJ1707 : [Usaco2007 Nov]tanning分配防晒霜
  18. JS:判断是否是移动端
  19. 植物大战僵尸花园花盆种类
  20. 武汉大学计算机学院深造率,2017中国名牌大学深造率排行榜:清华大学54.2%高居榜首...

热门文章

  1. SEDANSPOT Detecting Anomalies in Edge Streams阅读记录
  2. Delphi 2010控件安装
  3. NUC8 i5beh 黑苹果macOS Monterey 12.3.1安装教程
  4. Nuc做文件服务器,Intel NUC 安装Windows Server 2016 图解教程
  5. linux编辑框软键盘自动弹出,带输入框的Dialog自动弹出软键盘
  6. win10 更新1803版本后删除自带微软拼音的方法
  7. 在windows服务器部署mysql,局域网内操作
  8. 为什么苹果手机拍照会模糊?一起来看手机维修师如何解决
  9. matlab里comb用法,comb - 操作字符串的利器
  10. 短信通知接口json报文开发设计总结