PyTorch碎片:F.pad的图文透彻理解

PyTorch碎片:F.pad的图文透彻理解1.F.pad函数定义F.pad是pytorch内置的tensor扩充函数,便于对数据集图像或中间层特征进行维度扩充,下面是pytorch官方给出的函数定义。torch.nn.functional.pad(input,pad,mode=’constant’,value=0)函数变量说明:input需要扩充的tensor,可以是图像数据,抑或是特征矩阵数据pad扩充维度,用…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

1. F.pad函数定义

F.pad是pytorch内置的tensor扩充函数,便于对数据集图像或中间层特征进行维度扩充,下面是pytorch官方给出的函数定义。

torch.nn.functional.pad(input, pad, mode='constant', value=0)

函数变量说明:

  • input
    需要扩充的tensor,可以是图像数据,抑或是特征矩阵数据
  • pad
    扩充维度,用于预先定义出某维度上的扩充参数
  • mode
    扩充方法,’constant‘, ‘reflect’ or ‘replicate’三种模式,分别表示常量,反射,复制
  • value
    扩充时指定补充值,但是value只在mode=’constant’有效,即使用value填充在扩充出的新维度位置,而在’reflect’和’replicate’模式下,value不可赋值

2. F.pad透彻理解

为了方便从可视角度上分析F.pad的实际效果,首先给出空值矩阵,并且为了能够让宁能复现效果,实际代码全部给出,并最小化解释复杂度。

import torch
import torch.nn.functional as F

t4d = torch.empty(1, 3, 5, 3)

其中t4d中维度分别表示(batchsize, channel, height, width),为了透彻理解扩充参数pad的定义和实际效果,从随后的小节中我将逐层提高扩充的复杂度,建议跟我的思路来。

2.1 最后一维的扩充

为了便于理解,只观察输入矩阵t4d的最后两维,即一个5行3列的矩阵, 如图1
图1 原始矩阵
如果F.pad中第二个参数pad只定义两个参数,表示只对输入矩阵的最后一个维度进行扩充,不会对前两个维度造成任何影响,所以此处直接忽略前两个维度。

p1d = (1, 2)
t1 = F.pad(t4d, p1d, 'constant', 1)

先输出看一下t1的维度变化:

>>> print('原始矩阵大小为:', t4d.shape)
''' 原始矩阵大小为:torch.Size([1, 3, 5, 3]) '''
>>> print('t1矩阵大小为:', t1.shape)
''' t1矩阵大小为:torch.Size([1, 3, 5, 6]) '''

接下来,从可视化的角度分析一下,原始矩阵全为0值,扩充维度全部用1值填充,这样易于理解。
图2 t1d扩充效果
从图2可以明显看出,左侧扩充了1列,右侧扩充了2列,即原始矩阵大小从5×3扩充到5×6,则p1d的参数设置意义为

p1d = (1, 2)
# p1d = (左边填充数, 右边填充数)

此外,在实际项目中,为了保持代码的可扩展性,按下面定义,也可以获取同样的效果。

p1d_ = (1, 2, 0, 0)
t1 = F.pad(t4d, p1d_, 'constant', 1)

2.2 两维扩充

# p1d = (1, 2) # 与p1d做对比
p2d = (1, 2, 3, 4)
t2 = F.pad(t4d, p2d, 'constant', 2)

同样的,先分析下原始矩阵的维度变化情况:

>>> print('原始矩阵大小为:', t4d.shape)
''' 原始矩阵大小为:torch.Size([1, 3, 5, 3]) '''
>>> print('t2矩阵大小为:', t2.shape)
''' t2矩阵大小为:torch.Size([1, 3, 12, 6]) '''

这里给出的是两维的扩充代码,为了便于理解,看一下实际的扩充效果,如图3
图3 t2d扩充效果
看图实际一目了然,对左侧扩充了1列,右侧扩充了2列,上边扩充了3行,下边扩充了4行。也就是说,前两个参数对最后一个维度有效,后两个参数对倒数第二维有效。接下来就可以看一下p2d参数的实际意义:

p2d = (1, 2, 3, 4)
# p2d = (左边填充数, 右边填充数, 上边填充数, 下边填充数)

2.3 三维扩充

# p1d = (1, 2) # 与p1d做对比
# p2d = (1, 2, 3, 4) # 与p2d做对比
p3d = (1, 2, 3, 4, 5, 6)
t3 = F.pad(t4d, p3d, 'constant', 3)

仍然先分析下原始矩阵的维度变化情况:

>>> print('原始矩阵大小为:', t4d.shape)
''' 原始矩阵大小为:torch.Size([1, 3, 5, 3]) '''
>>> print('t3矩阵大小为:', t3.shape)
''' t3矩阵大小为:torch.Size([1, 14, 12, 6]) '''

从可视化角度分析,如图4所示。
图4 t3的维度变化
根据p3d = (1, 2, 3, 4, 5, 6)中,前4个参数完成了在高和宽维度上的扩张,后两个参数则完成了对通道维度上的扩充。接下来就可以看一下p3d参数的实际意义:

p3d = (1, 2, 3, 4, 5, 6)
# p3d = (左边填充数, 右边填充数, 上边填充数, 下边填充数, 前边填充数,后边填充数)

3. 小结

这回小节,简单用一个图完美表述F.pad()的应用。
图5 总结

微信公众号搜索 pytorch_star ,搜集的很多AI资料,会有用的!

交个朋友,来吧!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/170288.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月13日 上午10:16
下一篇 2022年8月13日 上午10:16


相关推荐

  • RC有源滤波器之带通滤波器(四)

    RC有源滤波器之带通滤波器(四)记录一下,方便以后翻阅~过去的滤波器都是由R、L、C等无源元件组成,称为无源滤波器。现在的滤波器大都是由R、C元件与有源器件(如运算放大器)组成,称为RC有源滤波器。常见滤波器类型有低通滤波器、高通滤波器、带通滤波器、带阻滤波器、全通滤波器等。RC有源带通滤波器带通滤波器允许某一频率范围内的信号通过,衰减或抑制此频率范围以外的频率信号。理想带通滤波器的模频特性如下图所示,Wc2和Wc1分别为上下截止频率。RC有源带通滤波器器电路如下图所示:电压传输函数为:其模:…

    2022年6月7日
    49
  • 使用云主机一键部署OpenClaw(Clawdbot/Moltbot)

    使用云主机一键部署OpenClaw(Clawdbot/Moltbot)

    2026年3月13日
    2
  • Mac Quicktime 录屏带声音[通俗易懂]

    Mac Quicktime 录屏带声音[通俗易懂]最近有录屏的需求,但是Mac大多数录屏软件都收费,之前用Windows时用EV录屏,免费好用,可惜没有Mac版。Mac自带的QuickTime软件虽然能录屏,但是不能录制声音,很苦恼。直到我发现了SoundFlower软件。1、下载安装soundflower给个链接:http://mysoft.6h5.cn/Soundflower-2.0b2.dmg安…

    2022年5月3日
    96
  • 怎么看java源代码

    怎么看java源代码妈的 开发快 7 年了 源代码一致不知道怎么看 由于自己不是计算机专业的 必要后只是简单的 java 培训了下 没有很好的编程功底 导致遇到很多问题 没有找到正确的处理方式 也怪自己懒 3 天打网两天晒鱼 自己就是那种遇到问题 解决了事的那种人 当然以前工作的确也太忙了 外包项目一直做 知道的挺多了 但是都不精 本着完成任务了事的态度 没有积累 看源代码基本上就是使用 crtl t 找进入 jar 包看下 但是如

    2026年3月18日
    3
  • 微信小程序解析富文本标签[通俗易懂]

    微信小程序解析富文本标签[通俗易懂]wxParse方法我踩雷了微信官方文档有个更为便捷的标签<rich-textnodes=”{{}}”></rich-text>

    2022年8月18日
    17
  • .NET(c#) 移动APP开发平台 – Smobiler(1)

    .NET(c#) 移动APP开发平台 – Smobiler(1)如果说基于.net的移动开发平台,目前比较流行的可能是xamarin了,不过除了这个,还有一个比xamarin更好用的国内的.net移动开发平台,smobiler,不用学习另外一套开发模式或者搭建复杂的开发环境,smobiler能够让大家像开发传统windows一样去开发移动应用,那么列举一下这个平台的特点。1. 基于VisualStudio的可视化开发。如同开发传统Windows平台一样的…

    2022年5月6日
    170

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号