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

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

如何通俗理解注意力机制?

1、注意力机制(Attention Mechanism)是机器学习和深度学习中一种模拟人类注意力的方法,用于提高模型在处理大量信息时的效率和效果。通俗地理解,它就像是在一堆信息中找到最重要的部分,把注意力集中在这些关键点上,从而更好地完成任务。以下是几个简单的比喻来帮助理解注意力机制: 2、寻找重点:想象一下,你在阅读一篇文章的时候,有些段落特别重要,你会特别注意这些段落,反复阅读,而对其他部分

函数式编程思想

我们经常会用到各种各样的编程思想,例如面向过程、面向对象。不过笔者在该博客简单介绍一下函数式编程思想. 如果对函数式编程思想进行概括,就是f(x) = na(x) , y=uf(x)…至于其他的编程思想,可能是y=a(x)+b(x)+c(x)…,也有可能是y=f(x)=f(x)/a + f(x)/b+f(x)/c… 面向过程的指令式编程 面向过程,简单理解就是y=a(x)+b(x)+c(x)

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中, "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时,经常听到第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及 BCNF(Boyce-Codd范式)。这些范式都旨在通过消除数据冗余和异常来优化数据库结构。然而,当我们谈到 4NF(第四范式)时,事情变得更加复杂。本文将带你深入了解 多值依赖 和 4NF,帮助你在数据库设计中消除更高级别的异常。 什么是

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87