理解Pytorch中的grid_sample函数

2024-08-27 19:44

本文主要是介绍理解Pytorch中的grid_sample函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 函数签名
    • 参数说明
    • 示意图

grid_sample是 PyTorch 提供的一个函数,用于执行采样操作,通常用于图像处理。它允许通过给定的采样坐标从输入张量中获取相应的值。采样坐标可以包含小数,这时 grid_sample 会使用插值方法计算出对应的值。

torch.nn.functional.grid_sample 是 PyTorch 中用于从输入特征图中采样的函数。它接受一个输入张量(通常是特征图)和一个包含采样点坐标的网格(grid),并在输入张量中按照网格坐标采样,生成一个新的特征图。

函数签名

torch.nn.functional.grid_sample(input, grid, mode='bilinear', padding_mode='zeros', align_corners=True)

参数说明

  1. input:
    这是一个形状为 (N, C, H_in, W_in) 的 4D 张量,其中 N 是批次大小,C 是通道数,H_inW_in 分别是输入特征图的高度和宽度。
  2. grid:
    这是一个形状为 (N, H_out, W_out, 2) 的 4D 张量,表示目标位置的网格。最后一维表示每个位置的 (x, y) 坐标,值的范围通常在 [-1, 1] 之间,其中 -1 对应左/上边界,1 对应右/下边界。
  3. mode:
    指定插值方式,有两个选项:
    • 'bilinear'(默认):使用双线性插值。
    • 'nearest':使用最近邻插值。
  4. padding_mode:
    当采样点超出输入特征图边界时指定填充方式,有三个选项:
    • 'zeros'(默认):超出边界的点填充为 0。
    • 'border':超出边界的点采用边界值填充。
    • 'reflection':超出边界的点使用对称填充。
  5. align_corners(有懂哥可以解释的更清楚一点):
    • True:采样网格的边缘点直接对齐到原始特征图的像素格上。
    • False:采样网格的边缘点直接对齐到原始特征图的像素格的角点上。

示意图

grid_sample.png

这里补充一下,grid经常会生成小数点的值,这些小数点的值是没法作为索引切片的。所以这时候插值的方法就会影响最终的结果了。

grid_sample 提供两种插值方式:

  1. mode='bilinear'

    (默认):

    • 进行双线性插值(bilinear interpolation)。当坐标包含小数时,grid_sample 会根据周围的像素值来计算出精确的采样结果。这意味着,如果采样点的坐标(即 displacement)落在像素之间,grid_sample 会根据四个相邻像素的值进行加权平均,生成插值结果。

    • 具体来说,如果采样点 (x, y) 对应的坐标在 (i, j)(i+1, j+1) 之间,双线性插值会计算如下:
      value = ( 1 − Δ x ) ( 1 − Δ y ) ⋅ V i , j + Δ x ( 1 − Δ y ) ⋅ V i + 1 , j + ( 1 − Δ x ) Δ y ⋅ V i , j + 1 + Δ x Δ y ⋅ V i + 1 , j + 1 \text{value} = (1 - \Delta x)(1 - \Delta y) \cdot V_{i,j} + \Delta x(1 - \Delta y) \cdot V_{i+1,j} + (1 - \Delta x) \Delta y \cdot V_{i,j+1} + \Delta x \Delta y \cdot V_{i+1,j+1} value=(1Δx)(1Δy)Vi,j+Δx(1Δy)Vi+1,j+(1Δx)ΔyVi,j+1+ΔxΔyVi+1,j+1
      其中, Δ x \Delta x Δx Δ y \Delta y Δy 是坐标的小数部分, V i , j V_{i,j} Vi,j 是像素值。

  2. mode='nearest'

    • 采用最近邻插值(nearest-neighbor interpolation)。如果采样坐标包含小数,grid_sample 会取最近的整数位置对应的像素值。

另外grid的取值范围是 [-1, 1],在函数内部会进行尺度的复原:

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);

这篇关于理解Pytorch中的grid_sample函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1112602

相关文章

Java8需要知道的4个函数式接口简单教程

《Java8需要知道的4个函数式接口简单教程》:本文主要介绍Java8中引入的函数式接口,包括Consumer、Supplier、Predicate和Function,以及它们的用法和特点,文中... 目录什么是函数是接口?Consumer接口定义核心特点注意事项常见用法1.基本用法2.结合andThen链

MySQL 日期时间格式化函数 DATE_FORMAT() 的使用示例详解

《MySQL日期时间格式化函数DATE_FORMAT()的使用示例详解》`DATE_FORMAT()`是MySQL中用于格式化日期时间的函数,本文详细介绍了其语法、格式化字符串的含义以及常见日期... 目录一、DATE_FORMAT()语法二、格式化字符串详解三、常见日期时间格式组合四、业务场景五、总结一、

golang panic 函数用法示例详解

《golangpanic函数用法示例详解》在Go语言中,panic用于触发不可恢复的错误,终止函数执行并逐层向上触发defer,最终若未被recover捕获,程序会崩溃,recover用于在def... 目录1. panic 的作用2. 基本用法3. recover 的使用规则4. 错误处理建议5. 常见错

从零教你安装pytorch并在pycharm中使用

《从零教你安装pytorch并在pycharm中使用》本文详细介绍了如何使用Anaconda包管理工具创建虚拟环境,并安装CUDA加速平台和PyTorch库,同时在PyCharm中配置和使用PyTor... 目录背景介绍安装Anaconda安装CUDA安装pytorch报错解决——fbgemm.dll连接p

pycharm远程连接服务器运行pytorch的过程详解

《pycharm远程连接服务器运行pytorch的过程详解》:本文主要介绍在Linux环境下使用Anaconda管理不同版本的Python环境,并通过PyCharm远程连接服务器来运行PyTorc... 目录linux部署pytorch背景介绍Anaconda安装Linux安装pytorch虚拟环境安装cu

CSS3 最强二维布局系统之Grid 网格布局

《CSS3最强二维布局系统之Grid网格布局》CS3的Grid网格布局是目前最强的二维布局系统,可以同时对列和行进行处理,将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局,本文介... 深入学习 css3 目前最强大的布局系统 Grid 网格布局Grid 网格布局的基本认识Grid 网

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加