理解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

相关文章

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

MySQL 中 ROW_NUMBER() 函数最佳实践

《MySQL中ROW_NUMBER()函数最佳实践》MySQL中ROW_NUMBER()函数,作为窗口函数为每行分配唯一连续序号,区别于RANK()和DENSE_RANK(),特别适合分页、去重... 目录mysql 中 ROW_NUMBER() 函数详解一、基础语法二、核心特点三、典型应用场景1. 数据分