pytorch随机采样,
最近使用了上采样和下采样操作,在pytorch中使用interpolate可以轻松完成。下面这篇文章主要介绍Pytorch的上采样函数中F.interpolate数组采样操作的相关信息,有需要的可以参考一下。
00-1010什么是上采样F.interpolate——数组采样操作输入:注:补充:代码用例的一般用法size和scale_factor的区别:输入序列时size和scale_factor的区别:align_corners的区别=输入整数时True和False展开:摘要
目录
上采样,在深度学习的框架下,可以简单理解为任何可以让你的图像变得分辨率更高的技术。最简单的方法是重采样和插值:将输入图像重新缩放到所需的大小,计算每个点的像素,并使用双线性插值等插值方法对剩余的点进行插值。
Unpooling在CNN中常用来表示max pooling的反向操作。这是引自2013年纽约大学的马修d泽勒和罗布弗格斯发表的《Visualizing and Understanding Convolutional Networks》:由于max pooling是不可逆的,所以在max pooling操作之前用一种近似的方式来逆转原来的情况;
什么是上采样
torch . nn . functional . interpolate(input,size=None,scale_factor=None,mode=nearest ,align_corners=None,recompute_scale_factor=None)
功能:利用插值的方法,对输入的张量数组进行上/下采样,换句话说就是科学合理地改变数组的大小,尽量保持数据的完整。
F.interpolate——数组采样操作
输入(张量):要采样的数组。Size(int或sequence):输出空间的大小scale_factor(float或sequence):空间大小模式的乘数(str):用于采样的算法。最近的 线性 双线性 双三次 三线性 面积 .default: nearest align _ corners(bool):几何上,我们将输入和输出像素视为正方形而不是点。如果设定为True,输入和输出张量将根据其角点像素的中心点对齐,并保留角点像素的值。如果设置为False,输入和输出张量将通过其角点像素的角点对齐,插值将边缘值填充用于边界值,从而在输入大小scale_factor保持不变时使此操作独立于输入大小scale _ factor。re compute _ scale _ fact(bool):重新计算用于插值计算的scale_factor。当scale_factor作为参数传递时,它用于计算output_size。如果recompute_scale_factor为False或未指定,则传入的scale_factor将用于插值计算。否则,将根据用于插值计算的输出和输入大小计算新的scale_factor(即,如果计算的output_size被显式传入,计算将是相同的)。请注意,当scale_factor是浮点数时,由于舍入和精度问题,重新计算的scale_factor可能与传入的scale _ factor不同。
输入:
输入的张量数组中的数据类型必须是float。输入数组的维数只能是3、4或5,分别对应时间、空间和体积采样。输入数组的前两个维度(批次和通道)不进行采样,采样过程从第三个维度开始。输入维度表单是batch (batch_siz
e)×通道(channel)×[可选深度]×[可选高度]×宽度(前两个维度具有特殊的含义,不进行采样处理)
补充:
一图看懂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 Fimport torch
a=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大小
size与scale_factor的区别:输入序列时
import torch.nn.functional as Fimport 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(原数组尺寸:,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倍
size与scale_factor的区别:输入整数时
import torch.nn.functional as Fimport 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(原数组尺寸:,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 Fimport 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)
输出结果,具体效果会因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
总结
到此这篇关于Pytorch上下采样函数之F.interpolate数组采样操作的文章就介绍到这了,更多相关PytorchF.interpolate数组采样内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。