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. How AET fields are retrieved from backend
  2. 使用Hadoop Streaming 完成MapReduce(Python代码)
  3. Linux下的磁盘空间管理
  4. 如何成为更好的前端工程师?如何才能进入下一个阶段?
  5. (转)Android权限列表permission说明 (一)
  6. 3.3 以太网交换机
  7. cmd批处理剪切_批处理复制文件到剪切板,读取剪切板内容到目录
  8. SAP SD跨公司销售案例教程前台操作
  9. C# AD FS实现网站单点登录 Active Directory Federation Services-活动目录联合身份认证 AD域单点登录 ADFS单点登录
  10. 浏览器F12功能总结
  11. 迭代阈值分割算法(处理图像)
  12. moveit 配置关节控制器
  13. 屏蔽网通域名纠错系统
  14. 国网GIM设备三维模型要求细则 - 框架式电容器
  15. 2023最新ChatGPT商业版4.8.4破解+GPT4.0(包含3.5)+AI绘画midjourney
  16. 截获QQ数据包 截获QQ聊天记录
  17. Linux bash命令
  18. 多模态信息抽取(一)——融合知识图谱和多模态的文本分类研究(论文研读)
  19. ffmpge海康视频文件格式转换
  20. leetcode每日一道(3)最多能有多少个点位于同一直线上

热门文章

  1. 重装Ubuntu系统
  2. 用计算机研究心理,计算机使用中的自我效能感
  3. oracle 乘法表,ORACLE SQl——9*9 乘法表的实现方法
  4. 食品的特征和鸿蒙,白粥养胃吗?知道这4种食物才是养胃高手
  5. c语言数组文曲星猜数游戏编程,文曲星“猜数字”游戏的计算机模拟 —— 算法分析与实现...
  6. Shell之判断周几
  7. c语言命令笔记本电脑快捷键,实用的电脑操作技巧(附快捷键)
  8. java project 显示感叹号_项目工程上有感叹号或者差号
  9. Simon写作翻转课笔记
  10. 0基础学php燕十八,燕十八PHP公益培训 PHP基础视频教程 (60集全)