探究grid_sample函数

news/2024/11/16 10:35:06/文章来源:https://www.cnblogs.com/huaibovip/p/18351853

一、函数介绍

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

  • 对于4D输入,input维度为 \((N,C,H_{in},W_{in})\), grid维度为 \((N,H_{out},W_{out},2)\) ,则output维度为 \((N,C,H_{out},W_{out})\)

  • 对于5D输入,input维度为 \((N,C,D_{in},H_{in},W_{in})\), grid维度为 \((N,D_{out},H_{out},W_{out},3)\) ,则output维度为 \((N,C,D_{out},H_{out},W_{out})\)

  • gird储存着用于在输入特征图上进行元素采样的坐标偏移量。grid的元素值通常在 \(\left [-1, 1 \right ]\) 之间, \(\left (-1, -1 \right )\) 表示取输入特征图左上角的元素, \(\left (1, 1 \right )\) 表示取输入特征图右下角的元素。

二、示例代码

import torch
import torch.nn.functional as F# 定义一个 4x4 的输入张量
input_tensor = torch.tensor([[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12],[13, 14, 15, 16],
], dtype=torch.float).view(1, 1, 4, 4)# 定义采样点,归一化坐标在 [-1, 1] 范围内
# 这里使用小数坐标进行采样
grid = torch.tensor([[[[-0.5, -0.5], [0.5, -0.5]],[[-0.5, 0.5], [0.5, 0.5]]]], dtype=torch.float)# 使用 F.grid_sample 进行采样
output = F.grid_sample(input_tensor, grid, align_corners=True)print(output)

补充知识:

1.性插值法(linear interpolation)

假设我们已知坐标 ((x0, y0) 与 (x1, y1),要得到 [x0, x1] 区间内某一位置 x 在直线上的值。根据图中所示,我们得到

\[\frac{y-y_0}{x-x_0} = \frac{y_1 - y_0}{x_1 - x_0} \]

由于 x 值已知,所以可以从公式得到 y 的值

\[y=y_{0}+\left(x-x_{0}\right) \frac{y_{1}-y_{0}}{x_{1}-x_{0}}=y_{0}+\frac{\left(x-x_{0}\right) y_{1}-\left(x-x_{0}\right) y_{0}}{x_{1}-x_{0}} \]

2.双线性插值法(bilinear interpolation)

在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。

如坐标图所示,用横纵坐标代表图像像素的位置,f(x,y)代表该像素点(x,y)的彩色值或灰度值。

假设我们已知函数f(x,y)Q11 = (x1, y1)Q12 = (x1, y2), Q21 = (x2, y1) 以及 Q22 = (x2, y2) 四个点的值

若想得到未知函数f(x,y)在点P=(x, y)的值,首先在 x 方向进行线性插值,得到

\[f(x,y_{1})\approx\frac{x_{2}-x}{x_{2}-x_{1}}f(Q_{11})+\frac{x-x_{1}}{x_{2}-x_{1}}f(Q_{21}),\\f(x,y_{2})\approx\frac{x_{2}-x}{x_{2}-x_{1}}f(Q_{12})+\frac{x-x_{1}}{x_{2}-x_{1}}f(Q_{22}). \]

然后在 y 方向进行线性插值,得到

\[f(P)\approx\frac{y_2-y}{y_2-y_1}f(R_1)+\frac{y-y_1}{y_2-y_1}f(R_2). \]

这样就得到所要的结果 f(x, y)

\[\begin{aligned} f(x,y) \approx\frac{y_{2}-y}{y_{2}-y_{1}}f(x,y_{1})+\frac{y-y_{1}}{y_{2}-y_{1}}f(x,y_{2}) \\ =\frac{1}{(x_{2}-x_{1})(y_{2}-y_{1})}[ x_{2}-x\quad x-x_{1} ]{\begin{bmatrix}f(Q_{11})&f(Q_{12})\\f(Q_{21})&f(Q_{22})\end{bmatrix}}{\begin{bmatrix}y_{2}-y\\y-y_{1}\end{bmatrix}}. \end{aligned} \]

2.1 单位正方形
如果选择一个坐标系统使得 f 的四个已知点坐标分别为 (0, 0)、(0, 1)、(1, 0) 和 (1, 1),那么插值公式就可以化简为

\[f(x,y)\approx f(0,0)\left(1-x\right)(1-y)+f(1,0)x(1-y)+f(0,1)\left(1-x\right)y+f(1,1)xy. \]

或者用矩阵运算表示为

\[f(x,y)\approx[\begin{matrix}{1-x}&{x}\\\end{matrix}]\biggl[\begin{matrix}{f(0,0)}&{f(0,1)}\\{f(1,0)}&{f(1,1)}\\\end{matrix}\biggr]\biggl[\begin{matrix}{1-y}\\{y}\\\end{matrix}\biggr] \]

2.2 非线性
双线性插值的结果不是线性的,它是两个线性函数的积。在单位正方形上,双线性插值可以记作

\[f(x,y)=\sum_{i=0}^1\sum_{j=0}^1a_{ij}x^iy^j=a_{00}+a_{10}x+a_{01}y+a_{11}xy \]

常数的数目(4个)对应于给定的 f 的数据点数目

\[\begin{aligned} &a_{00} =f(0,0), \\ &a_{10} =f(1,0)-f(0,0), \\ &a_{01} =f(0,1)-f(0,0), \\ &a_{11} =f(1,1)+f(0,0)-\big(f(1,0)+f(0,1)\big). \end{aligned}\]

双线性插值的结果与插值的顺序无关。首先进行 y 方向的插值,然后进行 x 方向的插值,所得到的结果是一样的。双线性插值的一个显然的三维空间延伸是三线性插值。

参考文章:

  1. 一文彻底弄懂 PyTorch 的 F.grid_sample
  2. PyTorch中grid_sample的使用方法
  3. 通俗易懂】详解torch.nn.functional.grid_sample函数:可实现对特征图的水平/垂直翻转
  4. 双线性插值(Bilinear Interpolation) 原理、存在的问题及其解决方案、OpenCV代码实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/780656.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

036.CI4框架CodeIgniter,VUE+CI4互通,VUE通过伪静态地址访问,内容为调用的CI4的API

CI4和VUE前端代码,可以看我在https://www.cnblogs.com/tianpan2019写的前2篇运行CI4能正常打开 使用npm run dev 也可以正常打开VUE 根据https://www.cnblogs.com/tianpan2019前1篇把根目录设置成CI4的publi目录 把伪静态内容也写上,内容如下:location / { if (!-e $reques…

2024年1000个计算机毕业设计项目源码(源码+论文【万字】)

【计算机毕设项目】2025级100个热门项目推荐 (前后端Web项目) 以下项目选题适合计算机专业大部分专业,技术栈主要为:Java语言,SpringBoot+Vue框架,MySQL数据库以下项目选题适合计算机专业大部分专业,技术栈主要为:Java语言,SpringBoot+Vue框架,MySQL数据库 ①后台免费获…

035.CI4框架CodeIgniter,安装前端VUE并执行

安装node22.5 选择路径 安装完成 装好后使用cmd查看node -v和 npm -v,看一下就知道有没有装好了 nodejs的安装目录,需要完全授权才可以,不然后面会报错 在网站的根目录,打开Powershell 显示权限不足的错误 管理员模式打开系统的Powershell 输入set-ExecutionPolicy RemoteS…

7月编程心得

7 月份非常忙碌,想系统性的写一篇文章,好几次不知道如何下手,后来想想还不如顺其自然,写一点自己的学习心得体会。 这篇文章,聊聊 7月份笔者的编程心得 ,希望对大家有所帮助。 1 IntelliJ IDEA 社区版 工欲善其事,必先利其器。 笔者的 Mac 电脑安装了 IntelliJ IDEA Ult…

三分钟对可视化表单设计器开源优点做简单介绍

为了帮助大家了解可视化表单设计器开源的多个优势特点,本文将为大家做一个系统介绍。想要实现流程化办公,需要了解低代码技术平台、可视化表单设计器开源在现代化办公中的作用和价值。为了帮助大家了解可视化表单设计器开源的多个优势特点,本文将为大家做一个系统介绍。 要了…

校园集市小程序开发-系统架构与Django后端

引子: 烂尾就烂尾吧,大不了以后自己创业。唉,也算给自己一个警戒。E-R模型接口设计数据模型设计 基本模型放在models.py中 class School(models.Model):id = models.AutoField(primary_key=True)name = models.CharField(max_length=100, verbose_name=学校名称) # 学校校区 …

基于MPPT最大功率跟踪算法的光伏并网发电系统simulink仿真

1.课题概述基于MPPT最大功率跟踪算法的光伏并网发电系统simulink仿真,包括PV模型建模(不使用simulink自带的PV模块,根据公式进行建模),MPPT最大功率控制器,PI控制器,锁相环,逆变器等等。输出系统的收敛曲线。2.系统仿真结果 上面三个波形分别表示光伏并网输出的Ipv,Upv和…

如何选择最适合你的免费项目管理软件

国内外主流的10款免费项目管理软件对比:PingCode、Worktile、Teambition、Tower、Tapd、Asana、Trello、Wrike、Basecamp、ClickUp、Monday.com。在众多项目管理工具中,找到一个既免费又能满足你专业需求的软件似乎是一项挑战。市场上免费和付费工具琳琅满目,但很多小型团队…

limu|P8-9|线性回归、softmax回归

线性回归模型:\(y = Xw + b + \epsilon\) 1、如何衡量模型质量?loss function损失函数——量化实际值和预测值之间的差距 可证:在高斯噪声的假设下,线性模型的最大似然估计 等价于 最小化均方误差(MSE)。证明在另一篇里写过:https://www.cnblogs.com/xjl-ultrasound/p/1…

学习笔记-图灵完备、图灵机与Brainfuck

前言 本文是近日对图灵完备的学习所做的笔记,如有错误还请指正. 本文包含以下内容: 1.什么是图灵机?什么是图灵完备?什么是Brianfuck? 2.对图灵机的简单模拟. 3.使用Brianfuck模拟一个简单的图灵机. 图灵机? Alan Mathison Turing在1937年提出了一个通用计算设备的猜想.他猜…

帝国cms怎么整站迁移

帝国CMS整站迁移指南第一步:备份数据使用帝国CMS自带的备份功能,对网站数据进行完整备份,包括数据库、目录和文件。第二步:导入新数据库在新的服务器上,创建一个新的数据库,并导入之前备份的数据库。第三步:修改配置文件和数据库连接参数修改 config/config.php 和 data…

织梦dedecms怎么上传本地视频

如何使用 Dedecms 上传本地视频步骤 1:准备视频文件确保视频文件格式符合 Dedecms 支持的格式(例如 MP4、FLV、AVI)。 确定视频文件的存储位置,最好保存在本地电脑上。 步骤 2:打开 Dedecms 管理后台输入管理员账号密码登录 Dedecms 管理后台。 步骤 3:创建新的视频分类在…