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

文章目录

  • torch.nn.Unfold
    • 直观理解
    • 官方文档
  • toch.nn.Fold
    • 直观理解
    • 官方文档

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])

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

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

相关文章

Qt做警告处理界面

解决的问题: 做上位机时,多有检测仪器状态,事实显示警告,错误等状态,笔者就是需要显示各种仪器状态,做显示,后做出处理逻辑 Axure设计图: 需求:更新状态,根…

ValueError:The following settings are not supported :{‘username‘: ‘neo4j“}

py2neo版本不同所导致的问题,下面我通过一段代码说明该问题。 import py2neoif py2neo.__version__ 4.3.0:graph Graph(http://localhost:7474, username config.neo4j_username, password config.neo4j_password) elif py2neo.__version__ 2021.2.3:graph G…

国产密码算法

国密算法 总体介绍 国密即国家密码局认定的国产密码算法。主要有 SM1,SM2,SM3,SM4。密钥长度和分组长度均为 128 位。 SM1对称密码 SM1 算法是分组密码算法,分组长度为128位,密钥长度都为 128 比特,算法安…

flask-----信号

安装: flask中的信号使用的是一个第三方插件,叫做blinker。通过pip list看一下,如果没有安装,通过以下命令即可安装blinker: pip install blinker flask其中有内置的信号 template_rendered _signals.signal(temp…

命令模式(Command)

命令模式是一种行为设计模式,可将一个请求封装为一个对象,用不同的请求将方法参数化,从而实现延迟请求执行或将其放入队列中或记录请求日志,以及支持可撤销操作。其别名为动作(Action)模式或事务(Transaction)模式。 Command is …

直播平台的秘密武器:揭秘流行直播实时美颜SDK的背后技术

近年来,随着社交媒体和直播平台的崛起,实时美颜成为了许多用户在分享自己生活的过程中的一项重要需求。无论是个人的自拍照片,还是主播在直播中的形象展示,美颜效果都直接影响着观众的视觉感受。而支撑这种实时美颜效果背后的技术…

python sqlalchemy 动态设置表名__tablename__,一个model对应多个table

我们在上一篇中说明了,如何在.net core的efcore中动态设置表名。 本文讲述如何在sqlalchemy中动态设置表名,使多个table可以对应到一个model 表如下 code example from sqlalchemy import create_engine,Column,BigInteger,String from sqlalchemy.ext…

Pandaer的iPhone手机壳

哇塞,Pandaer的设计太棒了!手机壳的花样多到让我眼花缭乱,好多系列设计都很有意思,让人有集齐的冲动。我最近入手了几个iPhone的手机壳,它有亮色和透明的款式,亮色的壳内部也是亮的,因为手机壳全…

数组相关练习

数组练习 将数组转化成字符串数组拷贝求数组元素的平均值查找数组中指定元素(顺序查找)二分查找冒泡排序数组逆序 将数组转化成字符串 import java.util.Arrays;public class Text1 {public static void main(String[] args) {int[] arr {5, 6, 4, 2};System.out.println(Arr…

学习gRPC (三)

测试gRPC例子 编写proto文件实现服务端代码实现客户端代码 通过gRPC 已经编译并且安装好之后,就可以在源码目录下找到example 文件夹下来试用gRPC 提供的例子。 在这里我使用VS2022来打开仓库目录下example/cpp/helloworld目录 编写proto文件 下面是我改写的exa…

gazebo 导入从blender导出的dae等文件

背景: gazebo 模型库里的模型在我需要完成的任务中不够用,还是得从 solidworks、3DMax, blender这种建模软件里面在手动画一些,或者去他们的库里面在挖一挖。 目录 1 blender 1-1 blender 相关links 1-2 install 2 gazebo导入模型 2-1 g…

LayUI之入门

目录 1.什么是layui 2.layui、easyui与bootstrap的对比 有趣的对比方式,嘿嘿嘿.... easyuijqueryhtml4(用来做后台的管理界面) 半老徐娘 bootstrapjqueryhtml5 美女 拜金 layui 清纯少女 2.1 layui和bootstrap对比(这两个都属…

【EI复现】梯级水光互补系统最大化可消纳电量期望短期优化调度模型(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Multimodal Learning with Transformer: A Survey

Transformer多模态学习 Abstract1 INTRODUCTION2 BACKGROUND2.1 Multimodal Learning (MML)2.2 Transformers: a Brief History and Milestones2.3 Multimodal Big Data 3 TRANSFORMERS: A GEOMETRICALLY TOPOLOGICAL PERSPECTIVE3.1 Vanilla Transformer3.1.1 Input Tokenizat…

旷视科技AIoT软硬一体化走向深处,生态和大模型成为“两翼”?

齐奏AI交响曲的当下,赛道玩家各自精彩。其中,被称作AI四小龙的商汤科技、云从科技、依图科技、旷视科技已成长为业内标杆,并积极追赶新浪潮。无论是涌向二级市场还是布局最新风口大模型,AI四小龙谁都不甘其后。 以深耕AIoT软硬一…

C++:基于浅拷贝/深拷贝对模拟string类的一些优化

文章目录 string类和日期类浅拷贝/深拷贝对于上述代码的深拷贝写法正常版本和优化版本写时拷贝 string类和日期类 前面我们已经实现了string类和日期类,这两个类有没有想过它们有什么不同? 其实答案很明显,不同的地方在于string类中涉及到内…

黑马点评学习笔记2

黑马点评学习笔记 1.缓存穿透1.1 缓存穿透是什么?1.2缓存穿透的解决方案1.2.1 缓存空对象1.2.2 布隆过滤1.2.3 其他解决方案 2.缓存雪崩2.1 缓存雪崩是什么?2.2 缓存雪崩的解决方案 3.缓存击穿3.1缓存击穿是什么?3.2缓存击穿的解决方案3.2.1互…

idea添加翻译插件并配置有道翻译

1、安装Translation插件 2、 创建有道云应用 有道智云控制台 3、设置idea 4、效果(选中文本右键翻译,默认快捷键CtrlShiftY)

篇二十二:解释器模式:处理语言语法

篇二十二:"解释器模式:处理语言语法" 开始本篇文章之前先推荐一个好用的学习工具,AIRIght,借助于AI助手工具,学习事半功倍。欢迎访问:http://airight.fun/。 另外有2本不错的关于设计模式的资料…

CentOS安装Postgresql

PG基本安装步骤 安装postgresql: sudo yum install postgresql-server初始化数据库:安装完毕后,需要初始化数据库并创建初始用户: sudo postgresql-setup initdb启动和停止服务: sudo systemctl start postgresql sudo…