【torch.nn.Fold】和【torch.nn.Unfold】

14 篇文章 13 订阅
订阅专栏
文章介绍了PyTorch库中的torch.nn.Unfold和torch.nn.Fold函数,前者用于从批量样本中提取滑动窗口(patch),后者则实现这些patch的还原。这两个函数是卷积操作的直观理解工具,展示了如何通过矩阵乘法等操作实现等效的卷积过程。
摘要由CSDN通过智能技术生成

torch.nn.Unfold

直观理解

torhc.nn.Unfold的功能: 从一个batch的样本中,提取出滑动的局部区域块patch(也就是卷积操作中的提取kernel filter对应的滑动窗口)把它按照顺序展开,得到的特征数就是通道数*卷积核的宽*卷积核的高, 下图中的L就是滑动完成后总的patch的个数
在这里插入图片描述
举个例子:

import torch
input1=torch.randn(1,3,4,6)
print(input1)
unfold1=torch.nn.Unfold(kernel_size=(2,3),stride=(2,3))
patches1=unfold1(input1)
print(patches1.shape)
print(patches1)

下图中的红框、蓝框、黄框、绿框分别是2x3的窗口按照步幅2x3滑动时得到的4个patch。每个patch的特征总数是2*3*3=18 ( 滑动窗口的高 ∗ 滑动窗口的宽 ∗ 通道数 滑动窗口的高*滑动窗口的宽*通道数 滑动窗口的高滑动窗口的宽通道数)
得到的输出patches1就是把每个patch的特征按照顺序展开,输出的大小就是(1,18,4)

在这里插入图片描述

官方文档

CLASS
torch.nn.Unfold(kernel_size, dilation=1, padding=0, stride=1)
  • 功能: 从批量输入张量中提取滑动局部块。

    假设一个batch的输入张量大小为 ( N , C , ∗ ) (N,C,*) (N,C,),其中 N N N表示batch的维度, C C C表示通道维度, ∗ * 表示任意的空间维度。该操作将输入空间维度内的每个kernel_size大小的滑动块展平到一列中, 输出的大小为 ( N , C × ∏ ( k e r n e l _ s i z e ) , L ) \left(N, C \times \prod( kernel\_size ), L\right) (N,C×(kernel_size),L), 其中 C × ∏ ( k e r n e l _ s i z e ) C \times \prod( kernel\_size) C×(kernel_size)表示每个block中包含的所有值的个数,一个block是kernel_size的面积和通道数的乘积, L L L是这样的block的个数。

    L = ∏ d ⌊  spatial_size  [ d ] + 2 × padding ⁡ [ d ] − dilation ⁡ [ d ] × ( kernel ⁡ _ size  [ d ] − 1 ) − 1 stride ⁡ [ d ] + 1 ] ,  L=\prod_d\left\lfloor\frac{\text { spatial\_size }[d]+2 \times \operatorname{padding}[d]-\operatorname{dilation}[d] \times\left(\operatorname{kernel} \_ \text {size }[d]-1\right)-1}{\operatorname{stride}[d]}+1\right] \text {, } L=dstride[d] spatial_size [d]+2×padding[d]dilation[d]×(kernel_size [d]1)1+1]

    其中 s p a t i a l _ s i z e spatial\_size spatial_size 是输入的空间维度(对应上述的*), d d d是所有的空间维度。

    因此,最后一个维度(列维度)的索引输出给出了某个块内的所有值。

    padding、stride和dilation参数指定如何检索滑动块。

    Stride控制滑块的步幅; Padding控制重塑前每个维度的点的填充数两边隐式零填充的数量。

    dilation 控制kenel 点之间的间距;也被称为à trous算法。

  • 参数

    • kernel_size(int or tuple) : 滑块的尺寸
    • dilation(int or tuple,optional): 控制邻域内元素步幅的参数。默认值:1
    • padding(int or tuple, optional) : 在输入的两侧添加隐式零填充。默认值:0
    • stride(int or tuple, optional) : 滑动块在输入空间维度中的步长。默认值:1

    如果kernel_size、dilation、padding或stride是int或长度为1的元组,它们的值将在所有空间维度上复制。

  • 形状:

    • 输入: ( N , C , ∗ ) (N,C,*) (N,C,)
    • 输出: ( N , C × ∏ ( k e r n e l _ s i z e ) , L ) \left(N, C \times \prod( kernel\_size ), L\right) (N,C×(kernel_size),L)
  • 例子

unfold = nn.Unfold(kernel_size=(2, 3))
input = torch.randn(2, 5, 3, 4)
output = unfold(input)
# each patch contains 30 values (2x3=6 vectors, each of 5 channels)
# 4 blocks (2x3 kernels) in total in the 3x4 input
output.size()

# Convolution is equivalent with Unfold + Matrix Multiplication + Fold (or view to output shape)
inp = torch.randn(1, 3, 10, 12)
w = torch.randn(2, 3, 4, 5)
inp_unf = torch.nn.functional.unfold(inp, (4, 5))
out_unf = inp_unf.transpose(1, 2).matmul(w.view(w.size(0), -1).t()).transpose(1, 2)
out = torch.nn.functional.fold(out_unf, (7, 8), (1, 1))
# or equivalently (and avoiding a copy),
# out = out_unf.view(1, 2, 7, 8)
(torch.nn.functional.conv2d(inp, w) - out).abs().max()

toch.nn.Fold

直观理解

toch.nn.Fold 就是torch.nn.Unfold的逆操作,将提取出的滑动局部区域块还原成batch的张量形式。
在这里插入图片描述
举个例子:我们把上面输出的patches 通过具有相同大小的卷积核以及步幅进行Flod操作,得到的input_restoreinput1 相同,说明Fold和UnFold互为逆操作。

fold1=torch.nn.Fold(output_size=(4,6),kernel_size=(2,3),stride=(2,3))
input_restore=fold1(patches1)
print(input_restore.shape)
print(input_restore==input1)
print(input_restore)

在这里插入图片描述

官方文档

CLASS
torch.nn.Fold(output_size, kernel_size, dilation=1, padding=0, stride=1)
  • 功能:

和Unfold相反,将提取出的滑动局部区域块还原成batch的张量形式。

  • 参数
    • output_size(int or tuple) : 输出的空间维度的形状
    • kernel_size(int or tuple) : 滑块的尺寸
    • dilation(int or tuple,optional): 控制邻域内元素步幅的参数。默认值:1
    • padding(int or tuple, optional) : 在输入的两侧添加隐式零填充。默认值:0
    • stride(int or tuple, optional) : 滑动块在输入空间维度中的步长。默认值:1
  • 形状
    • 输入: ( N , C × ∏ (  kernel_size  ) , L ) \left(N, C \times \prod(\text { kernel\_size }), L\right) (N,C×( kernel_size ),L) 或者 ( C × ∏ (  kernel_size  ) , L ) \left( C \times \prod(\text { kernel\_size }), L\right) (C×( kernel_size ),L)
    • 输出: ( N , C ,  output_size  [ 0 ] ,  output_size  [ 1 ] , … ) (N, C, \text { output\_size }[0], \text { output\_size }[1], \ldots) (N,C, output_size [0], output_size [1],) ( N , C ,  output_size  [ 0 ] ,  output_size  [ 1 ] , … ) (N, C, \text { output\_size }[0], \text { output\_size }[1], \ldots) (N,C, output_size [0], output_size [1],)
  • 例子
>>> fold = nn.Fold(output_size=(4, 5), kernel_size=(2, 2))
>>> input = torch.randn(1, 3 * 2 * 2, 12)
>>> output = fold(input)
>>> output.size()
torch.Size([1, 3, 4, 5])
PyTorch里面的torch.nn.Parameter()详解
09-18
总结来说,`torch.nn.Parameter()`在PyTorch中扮演着至关重要的角色,它使得我们可以方便地创建、管理和优化模型的参数。通过将张量转化为`nn.Parameter`,我们可以确保这些参数在训练期间被正确地更新,这对于构建...
「详解」torch.nn.Foldtorch.nn.Unfold操作
m0_53259482的博客
01-19 871
torch.nn.Unfold按照官方的说法,既从一个batch的样本中,提取出滑动的局部区域块,也就是卷积操作中的提取kernel filter对应的滑动窗口。由上可知,torch.nn.Unfold的参数跟nn.Conv2d的参数很相似,即,kernel_size(卷积核的尺寸),dilation(空洞大小),padding(填充大小)和stride(步长)
深度学习入门-08
最新发布
qhqlnannan的专栏
08-27 995
基于小土堆学习。
pytorch中的nn.Unfold()函数和fold(函数详解
qq_37937847的博客
04-13 1万+
文章目录1.nn.Unfold()函数2.nn.Fold()函数 1.nn.Unfold()函数 描述:pytorch中的nn.Unfold()函数,在图像处理领域,经常需要用到卷积操作,但是有时我们只需要在图片上进行滑动的窗口操作,将图片切割成patch,而不需要进行卷积核和图片值的卷积乘法操作。这是就需要用到nn.Unfold()函数,该函数是从一个batch图片中,提取出滑动的局部区域块,也就是卷积操作中的提取kernel filter对应的滑动窗口。 torch.nn.Unfold(kernel_s
torch.nn.Unfold()详细解释
A3630623的专栏
10-07 4983
torch.nn.Unfold(kernel_size, dilation=1, padding=0, stride=1) 功能:从一个批次的输入张量中提取出滑动的局部区域块。(Extracts sliding local blocks from a batched input tensor.) 参数: kernel_size(intortuple) – 滑块的大小 stride(intortuple,optional) – 滑块的步长(the stride of the sliding blo..
PyTorch基础(13)-- torch.nn.Unfold()方法
奋斗の博客
05-13 4375
一、方法详解 方法 torch.nn.Unfold(kernel_size, dilation=1, padding=0, stride=1) parameters kernel_size (int or tuple) – 滑动窗口的size stride (int or tuple, optional) – 空间维度上滑动的步长,默认步长为1 padding (int or tuple, optional) – implicit zero padding to be added
基础学习——nn.Unfold 批量切片、F.conv2d 指定卷积核二维卷积操作、nn.Conv2d卷积层
Chaoy6565的博客
12-05 1119
nn.Unfold 批量切片、F.conv2d 指定卷积核二维卷积。这是我最近遇到的一个问题,对图片每个像素点进行遍历,并且对每个像素点所在的33区域进行数据计算,最开始我是用for来写的,因为for循环是一个框一个框的遍历计算,速度很慢,电脑计算量也没有上去。为了解决这个问题,我百度了很多次,摸索出了以下方法,用nn.Unfold 批量切片,再用矩阵计算所对应的33区域,最后用F.conv2d 指定卷积核二维卷积进行数据整合。大致思路就是这样。
Pytorchtorch.nn的损失函数
12-21
在本文中,我们将深入探讨三个常用的二分类和多标签分类损失函数:`torch.nn.BCELoss`、`nn.BCEWithLogitsLoss`和`torch.nn.MultiLabelSoftMarginLoss`。 ### 一、`torch.nn.BCELoss(weight=None, size_average=...
pytorch1.0中torch.nn.Conv2d用法详解
09-18
总的来说,`torch.nn.Conv2d`在PyTorch中扮演着至关重要的角色,它与其他函数如`F.relu`和`F.max_pool2d`结合,构建了深度学习模型的基础架构。理解其工作原理和参数设置对于有效地设计和训练神经网络至关重要。
Pythorch中torch.nn.LSTM()参数详解
04-27
Pythorch中torch.nn.LSTM()参数详解;Pythorch中torch.nn.LSTM()参数详解;Pythorch中torch.nn.LSTM()参数详解;Pythorch中torch.nn.LSTM()参数详解;Pythorch中torch.nn.LSTM()参数详解;Pythorch中torch.nn.LSTM()...
滑动窗口提取特征-torch.unfold的应用
weixin_41377325的博客
12-30 5526
        假设我们希望提取一个矩阵每一个点上3*3窗口的均值或其他特征,直接使用循环的方法速度太慢,在pytorch中可以利用torch.unfold函数大大简化这个流程。         首先简单说明torch.unfold函数,其作用是按照选定的尺寸与步长来切分矩阵。举个例子,原始输入为H=4,W=5的矩阵12345678910111213
torch.nn.Unfold直观理解
qq_39624083的博客
12-06 780
然后将在所有 3 个通道上得到的 3 个行向量,进行横向拼接,得到维度为 [1, 27] 的行向量。③ 依次将卷积核按照从左到右,从上往下的顺序,按照步长 1 进行滑动,每个滑动的区域经过步骤 ② 中处理后都能得到一个维度为 [1, 27] 的行向量,共得到 6 个维度为 [1, 27],然后纵向堆叠成维度为 [6, 27] 的矩阵。③ 对于在每个通道上分别得到的第一个滑窗区域,分别进行 reshape 成行向量,然后把在所有通道上得到的行向量,进行横向拼接,得到新的行向量。
PyTorch应用实战一:实现卷积操作
兔子王
10-03 1552
卷积操作是指两个函数f和g之间的一种数学运算,它在信号处理、图像处理、机器学习等领域中广泛应用。f∗gn∑m−∞∞fmgn−mf∗gnm−∞∑∞​fmgn−m其中,fff和ggg是离散函数,∗∗表示卷积操作,nnn是离散的变量。卷积操作可以看作是将函数ggg沿着nnn轴翻转,然后平移,每次和函数fff相乘并求和,最后得到一个新的函数。这种操作可以实现信号的滤波、特征提取等功能,是数字信号处理中非常重要的基础操作。
Pytroch nn.Unfold() 与 nn.Fold()图码详解
欢迎关注,共同进步!
05-02 5547
`Unfold()`与`Fold()`一般成对出现。用途有:1. 代替卷积计算;2. 图片patch化。 nn.Fold()是 nn.Unfold() 函数的逆操作。 (参数相同、滑动窗口没有重叠的情况下,可以完全恢复【真互逆】。滑动窗口有重叠情况下不能恢复到Unfold的输入)
torch.unfold
zhihui1232的博客
10-17 195
类似于空洞的概念,如果将输入换成3×5×5就换过来了。例如:输入数据为3×3×3的矩阵,使用该函数。以上为输如,将size设为3,看输出。若将参数替换为kernel=2。
pytorch中的torch.nn.Unfoldtorch.nn.Fold
热门推荐
春笋的博客
06-11 2万+
pytorch中的torch.nn.Unfoldtorch.nn.Fold目的Unfold 目的 平时使用卷积操作时,既卷积核滑动窗口操作,对于pytorch,以二维图像为例,调用nn.Conv2d就能完成对输入(feature maps)的卷积操作。 但有时,maybe要探究卷积核对应的某一channel的单个窗口的卷积操作,或显式地进行卷积操作。此时,就需要nn.Unfoldnn.Fold。前段时间引起较大争议的BagNet(Bag of local feature net)的分块卷积操作既由此函数
torch F.unfold()举例
Teng的博客
06-22 1164
import torch import torch.nn as nn import torch.nn.functional as F if __name__ == '__main__': x = torch.randn(1, 3, 5, 5) print(x) output = F.unfold(x, [3, 3], padding=1) print(output, output.size())tensor([[[[ 0.6355, -1.7449, -0.1417, 2.
torch.unflod与torch.nn.unfold用法
qq_35215756的博客
06-21 740
和。类似于函数类也用于沿着指定维度滑动提取窗口并将每个窗口展平。与函数不同的是,是一个可学习的层,可以作为神经网络的一部分进行训练。torch.nn.Unfold (以及底层的 torch.unfold) 不支持 torch.LongTensor 类型的数据。它们主要用于处理图像等浮点型数据。将张量沿着指定维度滑动提取窗口,并将每个窗口展平成向量,形成一个新的张量。这在卷积操作的实现中特别有用。在这个例子中,我们在维度 2 (高度) 上以大小为 2、步长为 1 的窗口滑动提取数据,并将每个窗口展平。
写文章

热门文章

  • YOLOv8详解 【网络结构+代码+实操】 255050
  • 数据库课程设计 论坛系统—— 系统详细设计说明书 76579
  • NuSences 数据集解析以及 nuScenes devkit 的使用 28134
  • Mamba 基础讲解【SSM,LSSL,S4,S5,Mamba】 27581
  • Mamba复现与代码解读 24724

分类专栏

  • 大模型和多模态 6篇
  • python基础 16篇
  • 深度学习基础 13篇
  • 深度学习框架 14篇
  • 计算机视觉基础 3篇
  • 2D目标检测 10篇
  • 3d目标检测 22篇
  • OpenCV 13篇
  • 图像增强 7篇
  • ROS机器人 7篇
  • 前端开发
  • 网站搭建 2篇
  • 微信小程序 5篇
  • 安卓开发 8篇
  • Django 6篇
  • Vue 1篇
  • 工具 3篇
  • CS本科课程
  • 操作系统 7篇
  • 数据结构 15篇
  • 计算机网络 6篇
  • 数据库 16篇
  • 计算机体系结构 7篇
  • 大数据 5篇
  • 编译原理 1篇
  • 汇编与接口技术 7篇
  • 程序设计模式 1篇
  • 高性能计算 4篇
  • 数学基础 3篇
  • 数学建模 1篇
  • 英语 3篇
  • 算法 4篇

最新评论

  • Mamba复现与代码解读

    m0_56468597: 博主,我在使用这个代码替代源文件中的selectivescan后一训练输出就变成nan请问是为什么呢

  • Mamba复现与代码解读

    锦鲤程序猿: B,C,delta为啥是直接split得到的,原文不是说通过linear()之后维度变化嘛

  • Mamba复现与代码解读

    jhihio: 搜hf国内镜像源

  • 操作系统实验(3)—— 典型同步问题模拟处理编程设计与实现

    Husangsang: 更新了一下编译器就好了

  • 操作系统实验(3)—— 典型同步问题模拟处理编程设计与实现

    Husangsang: 请问为什么包含了mutex头文件,还是报错,显示mutex没有声明表情包

最新文章

  • Diffusion Model, Stable Diffusion, Stable Diffusion XL 详解
  • DenseCLIP论文讲解
  • BLIP和BLIP2 论文讲解
2024年6篇
2023年28篇
2022年127篇
2021年50篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zyw2002

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家乌鲁木齐玻璃钢雕塑制作广州玻璃钢卡通雕塑摆件洛阳卡通玻璃钢雕塑公司盐城玻璃钢龙雕塑设计云南高质量玻璃钢雕塑供应商玻璃钢人物雕塑喷绘梧州玻璃钢花盆厂家许昌室外不锈钢玻璃钢彩绘雕塑玻璃钢雕塑外星人造形吉林佛像玻璃钢雕塑优势frp玻璃钢雕塑河北玻璃钢园林雕塑四川佛像玻璃钢雕塑销售电话武汉玻璃钢雕塑价格南昌创意玻璃钢雕塑批发江苏水果玻璃钢雕塑定制淮南学校玻璃钢雕塑价位湛江商场美陈雕塑安国玻璃钢浮雕人物山水雕塑水泥雕塑玻璃钢雕塑清远小巧的玻璃钢雕塑辽阳园林玻璃钢雕塑定做蜕变雕塑玻璃钢仿铜健身房张掖玻璃钢卡通雕塑多少钱商场美陈布置的重要绍兴玻璃钢花盆哪里买福州商场卡通雕塑美陈山东玻璃钢商场美陈雕塑新密锻铜玻璃钢雕塑上饶大型玻璃钢雕塑批发香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化