pytorch中张量变换函数

在PyTorch中view(), transpose()permute() 函数都是用于改变张量(Tensor)维度结构的,但它们的作用和使用场景有所不同。

  1. torch.view()
    • 功能:该函数用于将一个张量重塑为新的形状,但它必须保持原有元素数量不变。它主要用于改变张量的维度布局,而不仅仅是交换维度。
    • 用法:通常用于简化或展开张量的维度,例如将三维张量展平成一维或二维。
import torchbatch = 3
seq_size = 2
embed = 8
torch.random.manual_seed(123)
x = torch.randint(25, (batch, seq_size, embed)).float()
print(x)
# tensor([[[ 7., 14.,  2., 10.,  5., 17., 11.,  7.],
#          [24.,  4., 11., 21., 16., 21., 12., 24.]],
#
#         [[14.,  1., 13.,  5.,  0., 16.,  5., 22.],
#          [ 9.,  2., 21.,  6., 15.,  1., 16., 15.]],
#
#         [[23.,  4.,  4., 16.,  1., 18.,  0., 20.],
#          [ 9.,  1.,  1.,  7., 13., 21., 12., 12.]]])# 将后两维度张量展平,将每一词的词嵌入按行连接
z = x.view(batch, -1)
print(z)
# tensor([[7., 14., 2., 10., 5., 17., 11., 7., 24., 4., 11., 21., 16., 21., 12., 24.],
#         [14., 1., 13., 5., 0., 16., 5., 22., 9., 2., 21., 6., 15., 1., 16., 15.],
#         [23., 4., 4., 16., 1., 18., 0., 20., 9., 1., 1., 7., 13., 21., 12., 12.]])# transformer中多头注意力机制常用,把最后一维词嵌入的维度进行两次切割
# 切割出来多余的那部分做为batch放在第一个维度上
y = x.view(batch * 2, -1, embed // 2)
print(y)
# tensor([[[ 7., 14.,  2., 10.],
#          [ 5., 17., 11.,  7.]],
#
#         [[24.,  4., 11., 21.],
#          [16., 21., 12., 24.]],
#
#         [[14.,  1., 13.,  5.],
#          [ 0., 16.,  5., 22.]],
#
#         [[ 9.,  2., 21.,  6.],
#          [15.,  1., 16., 15.]],
#
#         [[23.,  4.,  4., 16.],
#          [ 1., 18.,  0., 20.]],
#
#         [[ 9.,  1.,  1.,  7.],
#          [13., 21., 12., 12.]]])
  1. torch.transpose()
    • 功能:该函数用于交换两个指定的维度(转置),其中给定轴上的元素被互换。
    • 用法:传入两个指定的参数维度且参数循序无关
import torchbatch = 3
seq_size = 2
embed = 8
torch.random.manual_seed(123)
x = torch.randint(25, (batch, seq_size, embed)).float()
print(x)
# tensor([[[ 7., 14.,  2., 10.,  5., 17., 11.,  7.],
#          [24.,  4., 11., 21., 16., 21., 12., 24.]],
#
#         [[14.,  1., 13.,  5.,  0., 16.,  5., 22.],
#          [ 9.,  2., 21.,  6., 15.,  1., 16., 15.]],
#
#         [[23.,  4.,  4., 16.,  1., 18.,  0., 20.],
#          [ 9.,  1.,  1.,  7., 13., 21., 12., 12.]]])# 将后两维交换(转置),将每一词的词嵌入按列展示
z = x.transpose(1, 2)  # 等价 x.transpose(2, 1)
print(z)
# tensor([[[ 7., 24.],
#          [14.,  4.],
#          [ 2., 11.],
#          [10., 21.],
#          [ 5., 16.],
#          [17., 21.],
#          [11., 12.],
#          [ 7., 24.]],
#
#         [[14.,  9.],
#          [ 1.,  2.],
#          [13., 21.],
#          [ 5.,  6.],
#          [ 0., 15.],
#          [16.,  1.],
#          [ 5., 16.],
#          [22., 15.]],
#
#         [[23.,  9.],
#          [ 4.,  1.],
#          [ 4.,  1.],
#          [16.,  7.],
#          [ 1., 13.],
#          [18., 21.],
#          [ 0., 12.],
#          [20., 12.]]])
  1. torch.permute()
    • 功能:该函数允许一次性重新排列多个维度,理解成transpose的扩展。
    • 用法:传入张量的所有维度,可以同时交换任意两个及以上的维度。
import torchbatch = 3
seq_size = 2
embed = 8
torch.random.manual_seed(123)
x = torch.randint(25, (batch, seq_size, embed)).float()
print(x)
# tensor([[[ 7., 14.,  2., 10.,  5., 17., 11.,  7.],
#          [24.,  4., 11., 21., 16., 21., 12., 24.]],
#
#         [[14.,  1., 13.,  5.,  0., 16.,  5., 22.],
#          [ 9.,  2., 21.,  6., 15.,  1., 16., 15.]],
#
#         [[23.,  4.,  4., 16.,  1., 18.,  0., 20.],
#          [ 9.,  1.,  1.,  7., 13., 21., 12., 12.]]])# 将后两维重新排序
# 注意这样是报错x.permute(2, 1)或者permute(1, 2, 1)都是非法的
z = x.permute(0, 2, 1)  # 等价 x.transpose(2, 1),
# print(z)# 如果我们想要三个维度都交换transpose是做不到的
# 至于有什么实际意义就不讨论了
y = x.permute(2, 1, 0)
print(y)
# tensor([[[ 7., 14., 23.],
#          [24.,  9.,  9.]],
#
#         [[14.,  1.,  4.],
#          [ 4.,  2.,  1.]],
#
#         [[ 2., 13.,  4.],
#          [11., 21.,  1.]],
#
#         [[10.,  5., 16.],
#          [21.,  6.,  7.]],
#
#         [[ 5.,  0.,  1.],
#          [16., 15., 13.]],
#
#         [[17., 16., 18.],
#          [21.,  1., 21.]],
#
#         [[11.,  5.,  0.],
#          [12., 16., 12.]],
#
#         [[ 7., 22., 20.],
#          [24., 15., 12.]]])
  1. torch.unsqueeze()
    • 功能:增加一个新的维度。
    • 用法:增加维度指定的位置。
import torchseq_size = 2
embed = 8
torch.random.manual_seed(123)
x = torch.randint(25, (seq_size, embed)).float()
print(x)
# tensor([[ 7., 14.,  2., 10.,  5., 17., 11.,  7.],
#         [24.,  4., 11., 21., 16., 21., 12., 24.]])z = x.unsqueeze(0)  # 等价 torch.unsqueeze(x, dim=0)
print(z)
# tensor([[[ 7., 14.,  2., 10.,  5., 17., 11.,  7.],
#          [24.,  4., 11., 21., 16., 21., 12., 24.]]])

总结:

  • view() 更侧重于保持数据不变的前提下改变张量的维度形状,常用于展平、重塑等操作。

  • transpose() 是特定的维度交换操作,只涉及两个维度的变换。

  • permute() 则提供了更灵活的维度重排功能,可以处理多维度情况下的整体维度顺序调整。

  • unsqueeze() 指定位置增加张量维度。

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

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

相关文章

【MASM汇编语言快速入门】8086MASM汇编深入理解指令对标志位的影响

8086MASM汇编深入理解指令对标志位的影响 文章目录 8086MASM汇编深入理解指令对标志位的影响0. 指令对标志位影响1. 指令对标志位影响速查表2. flags标志寄存器: 标志位含义解读flags1. 状态标志cf, pf, af, zf, sf, of2. 控制标志df, if, tf 详解:1. 传送指令2. 算…

如何在IDEA 中设置背景图片

在IDEA 中设置背景图片,可以按照以下步骤操作: 1、打开 IntelliJ IDEA 软件,进入代码编辑主界面。 点击编辑窗口上方的“File”菜单项。 2、在下拉子菜单中,选择“Settings”选项(如果你使用的是 macOS,可…

AUTOSAR汽车电子嵌入式编程精讲300篇-车载 CAN 总线延时特性分析及优化(续)

目录 3.1.2 通信错误恢复时间 3.2 延时指标研究 3.2.1 总线 Burst 情况 3.2.2 抖动

vue3子父组件之间的调用

子组件&#xff1a; capacityIndex.vue 父组件&#xff1a; index.vue A.子组件获取父组件属性 1.在父组件中引用子组件 import capacityIndex from "./capacityIndex"; <capacityIndex :tankInfo"tankInfo" :deviceNameInfo"deviceNameInfo…

Spark-Scala语言实战(1)

在之前的文章中&#xff0c;我们学习了如何在Linux安装Spark以及Scala&#xff0c;想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 Spark及Scala的安装https:/…

【智能算法】保姆级教程-如何使用CEC测试集,以及如何定义自己的优化问题

目录 1.准备工作2.使用CEC2005测试集3.自定义优化问题-无约束问题4.自定义优化问题-有约束问题5.代码实现 1.准备工作 一个CEC2005测试集 一个测试智能算法&#xff0c;比如麻雀搜索算法SSA 2.使用CEC2005测试集 以CEC2005测试集函数F7为例&#xff1a; 3.自定义优化问题…

solr/ES 分词插件Jcseg设置自定义词库

步骤&#xff1a; 1、找到配置文件jcseg-core/target/classes/jcseg.properties修改配置&#xff1a; 下载地址: https://gitee.com/lionsoul/jcseg#5-如何自定义使用词库 lexicon.path {jar.dir}/../custom-word 设置lexicon路径&#xff0c;我们这个配置可以自定义&#xf…

python非常优秀的图结构处理框架

核心特点 多样性: 支持创建多种类型的图,如无向图、有向图、多重图等。 灵活性: 易于扩展和定制,支持自定义节点和边的属性。 易用性: 提供大量的算法和绘图工具,便于网络分析和可视化。 最佳实践 安装 Networkx: pip install networkx功能一:创建和操作图 标题:基础…

计算机网络-概述

文章目录 1.2 因特网概述1.2.1 网络、互连网&#xff08;互联网&#xff09;和因特网1.2.2 因特网发展的三个阶段1.2.4 因特网的组成 1.3 三种交换方式1.3.1 电路交换1.3.2 分组交换1.3.3 报文交换1.3.4 三种方式对比 1.4 计算机网络的定义1.5 计算机网络的性能指标1.5.1 速率1…

antd5 虚拟列表原理(rc-virtual-list)

github:https://github.com/react-component/virtual-list rc-virtual-list 版本 3.11.4(2024-02-01) 版本&#xff1a;virtual-list-3.11.4 Development npm install npm start open http://localhost:8000/List 组件接收 Props PropDescriptionTypeDefaultchildrenRender …

精读《手写 JSON Parser》

1 引言 JSON.parse 是浏览器内置的 API&#xff0c;但如果面试官让你实现一个怎么办&#xff1f;好在有人已经帮忙做了这件事&#xff0c;本周我们一起精读这篇 JSON Parser with Javascript 文章吧&#xff0c;再温习一遍大学时编译原理相关知识。 2 概述 & 精读 要解析…

(55)按身高排序

文章目录 每日一言1. 题目2. 解题思路2.1 使用冒泡排序2.2 使用qsort函数 3. 代码3.1 使用冒泡排序3.2 使用qsort函数 结语 每日一言 无论种子散落在何处&#xff0c;都会长出一棵树&#xff0c;向着天空&#xff0c;挣扎生长。 1. 题目 题目链接&#xff1a;按身高排序 给你…

【机器学习】分类模型的评价方法

&#x1f33b;个人主页&#xff1a;相洋同学 &#x1f947;学习在于行动、总结和坚持&#xff0c;共勉&#xff01; #学习笔记# 目录 一、混淆矩阵&#xff08;Confusion Matrix&#xff09; 二、评估指标&#xff08;Evaluation metrics&#xff09; 1.正确率(accuracy) …

R统计学3 - 数据分析入门问题41-60

往期R统计学文章: R统计学1 - 基础操作入门问题1-20 R统计学2 - 数据分析入门问题21-40 41. R 语言如何做双坐标图? # 创建模拟数据 year <- 2014:2024 gdp <- data.frame(year, GDP = sort(rnorm(11, 1000, 100))) ur <- data.frame(year, UR = rnorm(11, 5, 1…

计算机网络(7)----应用层

目录 一.应用层的基本概念 1.应用层的基本概述 2.网络应用模型 &#xff08;1&#xff09;客户/服务器模型 &#xff08;2&#xff09;P2P模型 二.应用程序相关 1.DNS系统 &#xff08;1&#xff09;域名与域名服务器 &#xff08;2&#xff09;域名解析过程&#xff…

2024 第一届VCTF 纳新赛 Web方向 题解WP

hackjs 题目描述&#xff1a;A baby oldjs, just warm up. 附件给源码 const express require(express) const fs require(fs) var bodyParser require(body-parser); const app express() app.use(bodyParser.urlencoded({extended: true })); app.use(bodyParser.json…

Python自动化测试之使用pytest-mock模拟用户输入

假如有这样一段代码要测试&#xff1a; # hello.py def welcome() -> str:name input("Whats your name? ").strip()if not name:return Welcome to Guangdong~return fHi, {name}. You are welcome! 测试代码可以这样写&#xff1a; # test_hello.py # pip …

CI/CD实战-git工具使用 1

版本控制系统 本地版本控制系统 集中化的版本控制系统 分布式版本控制系统 git官网文档&#xff1a;https://git-scm.com/book/zh/v2 Git 有三种状态&#xff1a;已提交&#xff08;committed&#xff09;、已修改&#xff08;modified&#xff09; 和 已暂存&#xff08;sta…

嵌入式硬件设计(一)|利用 NodeMCU-ESP8266 开发板和继电器结合APP“点灯•blinker”制作Wi-Fi智能开关(附有关硬件详细资料)

概述 本文主要讲述利用 NodeMCU-ESP8266 开发板和继电器通过手机 APP “ 点灯 • Blinker ” 制作一款能够由手机控制的WiFi 智能开关&#xff0c;从而实现智能物联。NodeMCU 是基于 Lua 的开源固件&#xff0c;ESP8266-NodeMCU是一个开源硬件开发板&#xff0c;支持WiFi功能&a…

二维数组_计算矩阵边缘元素之和

任务描述 输入一个整数矩阵&#xff0c;计算位于矩阵边缘的元素之和。所谓矩阵边缘的元素&#xff0c;就是第一行和最后一行的元素以及第一列和最后一列的元素。 输入格式: 第一行分别为矩阵的行数m和列数n&#xff08;m < 100&#xff0c;n < 100&#xff09;&#x…