PyTorch中grid_sample的使用及说明

 更新时间:2023年02月01日 09:15:52   作者:咆哮的阿杰  
这篇文章主要介绍了PyTorch中grid_sample的使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

关于grid_sample的使用

grid_sample底层是应用双线性插值,把输入的tensor转换为指定大小。

那它和interpolate有啥区别呢?

interpolate是规则采样(uniform),但是grid_sample的转换方式,内部采点的方式并不是规则的,是一种更为灵活的方式。

torch.nn.functional.grid_sample(input, grid, mode=‘bilinear', padding_mode=‘zeros')
  • input:输入tensor, shape为 [N, C, H_in, W_in]
  • grid:一个field flow, shape为[N, H_out, W_out, 2],最后一个维度是每个grid(H_out_i, W_out_i)在input的哪个位置的邻域去采点。数值范围被归一化到[-1,1]。

下面将介绍具体的例子

import torch
from torch.nn import functional as F


inp = torch.ones(1, 1, 4, 4)

# 目的是得到一个 长宽为20的tensor
out_h = 20
out_w = 20
 # grid的生成方式等价于用mesh_grid
new_h = torch.linspace(-1, 1, out_h).view(-1, 1).repeat(1, out_w)
new_w = torch.linspace(-1, 1, out_w).repeat(out_h, 1)
grid = torch.cat((new_h.unsqueeze(2), new_w.unsqueeze(2)), dim=2)
grid = grid.unsqueeze(0)

outp = F.grid_sample(inp, grid=grid, mode='bilinear')
print(outp.shape)  #torch.Size([1, 1, 20, 20])

在上面的例子中,我们将一个大小为4x4的tensor 转换为了一个20x20的。

grid的大小指定了输出大小,每个grid的位置是一个(x,y)坐标,其值来自于:输入input的(x,y)中 的四邻域插值得到的。

在这里插入图片描述

图片来自于SFnet(eccv2020)。flow field是grid, low_resolution是input, high resolution是output。

至于grid的值是控制在-1,1的。那如何对应在input上呢。

这个来看一下pytorch的底层源码。

第66行到71行,获取到了grid的x和y,之后对其做了新的变换,变到input的坐标系下了。

IW和IH是input的宽和高。

        real ix = THTensor_fastGet4d(grid, n, h, w, 0);
        real iy = THTensor_fastGet4d(grid, n, h, w, 1);

        // normalize ix, iy from [-1, 1] to [0, IH-1] & [0, IW-1]
        ix = ((ix + 1) / 2) * (IW-1);
        iy = ((iy + 1) / 2) * (IH-1);

torch.nn.functional.grid_sample() 注意点

用法: 主要用于采样,一般是使用bilinear根据grid的坐标采样

F.grid_sample(img, grid, align_corners=True)
  • img是采样的空间,grid是生成的网格坐标。
  • grid通常由torch.meshgrid()生成,且要映射到(-1,1)之间,如:
dx = torch.linspace(-1,1, 9)
dy = torch.linspace(-1, 1,7)
coords = torch.stack(torch.meshgrid(dy, dx), axis=-1)   #[dy*dx*2]

输入输出情况:

假如是4D 的input:

img.shape : [B,C,H_in,W_in]
grid.shape: [B,H_out,W_out,2]
out: [B,C,H_out,W_out]

细节

1.为什么meshgrid生成坐标的时候,stack成coords时需要逆序(第一层是y,第二层是x)?

Ans:采样的时候,在img上取点,坐标是根据grid来的,grid[:,:,0]是W维度的坐标,grid[:,:,1]是H维度的坐标,所以这个地方需要注意,是反过来的

2.grid的形状仅仅影响output的形状,直接决定取点的还是坐标,所以尤其要注意grid坐标叠。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python协程asyncio模块的演变及高级用法

    Python协程asyncio模块的演变及高级用法

    网上很多关于Python协程asyncio模块的教程都是基于老版Python的, 本文将以对比方式展示新老Python版本下协程的写法有什么不同并总结了asyncio的一些高级用法, 包括如何获取协程任务执行结果,gather和wait方法的区别以及如何给任务添加回调函数。
    2021-05-05
  • 用Python判断奇偶数示例

    用Python判断奇偶数示例

    大家好,本篇文章主要讲的是用Python判断奇偶数示例,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • Python 使用PIL.Image制作运动小人的动态图思路详解

    Python 使用PIL.Image制作运动小人的动态图思路详解

    这篇文章主要介绍了Python 使用PIL.Image制作一个运动小人的动态图,制作过程也很简单,只需要把图片拆分成12等分,每帧大小:67x165;连续读取和播放就会形成动态图像,需要的朋友可以参考下
    2021-10-10
  • python常用模块详解

    python常用模块详解

    今天小编就为大家分享一篇关于举例讲解Python常用模块,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2021-10-10
  • 使用python的pandas为你的股票绘制趋势图

    使用python的pandas为你的股票绘制趋势图

    这篇文章主要介绍了通过python为你的股票绘制趋势图,动手写个小程序, 把股票趋势每天早上发到邮箱里,用 python 的 pandas, matplotlib 写起来很容易, 几十行代码搞定。,需要的朋友可以参考下
    2019-06-06
  • python实现批量移动文件

    python实现批量移动文件

    这篇文章主要为大家详细介绍了python实现批量移动文件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • python replace 空格数据处理的实现

    python replace 空格数据处理的实现

    本文主要介绍了python replace 空格数据处理的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Python应用自动化部署工具Fabric原理及使用解析

    Python应用自动化部署工具Fabric原理及使用解析

    这篇文章主要介绍了Python应用自动化部署工具Fabric原理及使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • python Dataframe 合并与去重详情

    python Dataframe 合并与去重详情

    这篇文章主要介绍了python Dataframe 合并与去重详情,文章围绕主题展开详细的内容介绍,具有一定参考价值,需要的朋友可以参考一下
    2022-08-08
  • python实现搜索本地文件信息写入文件的方法

    python实现搜索本地文件信息写入文件的方法

    这篇文章主要介绍了python实现搜索本地文件信息写入文件的方法,涉及Python针对文件的遍历及属性操作相关技巧,需要的朋友可以参考下
    2016-02-02

最新评论