目录

1. Tensor 与 NumPy 数组的转换

1.1 Tensor 转换为 NumPy 数组

1.2 NumPy 数组转换为 Tensor

1.3 获取单个元素的值

2. Tensor 的基本运算

2.1 生成新 Tensor 的运算

2.2 覆盖原 Tensor 的运算

2.3 阿达玛积(逐元素乘法)

2.4 矩阵乘法

3. Tensor 的形状变换

3.1 view() 方法

3.2 reshape() 方法

4. 维度变换

4.1 transpose() 方法

4.2 permute() 方法

5. 完整代码示例

6. 总结


在深度学习中,PyTorch 的 Tensor 是核心数据结构,它类似于 NumPy 的数组,但可以在 GPU 上高效运行。除了创建 Tensor,PyTorch 还提供了丰富的操作方法,包括 Tensor 与 NumPy 数组的转换、基本运算、维度变换等。今天,我们就通过一个简单的代码示例,学习这些基本操作。

1. Tensor 与 NumPy 数组的转换

PyTorch 提供了非常方便的接口,用于在 Tensor 和 NumPy 数组之间进行转换。这在实际应用中非常有用,因为 NumPy 是 Python 中处理数组的标准库。

1.1 Tensor 转换为 NumPy 数组

t1 = torch.tensor([1, 2, 3, 4, 5])
n1 = t1.numpy()
print(n1)
  • t1.numpy():将 Tensor 转换为 NumPy 数组。注意,这种转换是浅拷贝,即 NumPy 数组和 Tensor 共享内存。

1.2 NumPy 数组转换为 Tensor

t2 = torch.tensor(n1)
print(t2)
  • torch.tensor(n1):将 NumPy 数组转换为 Tensor。这种转换是深拷贝,即生成一个新的 Tensor,不共享内存。

t3 = torch.from_numpy(n1)
print(t3)
  • torch.from_numpy(n1):将 NumPy 数组转换为 Tensor。这种转换是浅拷贝,即 Tensor 和 NumPy 数组共享内存。

1.3 获取单个元素的值

t4 = torch.tensor([18])
print(t4.item())
  • t4.item():当 Tensor 只有一个元素时,可以使用 item() 获取该元素的值。

2. Tensor 的基本运算

PyTorch 提供了丰富的运算操作,包括加法、减法、乘法和除法。这些运算可以分为两类:生成新 Tensor 的操作和覆盖原 Tensor 的操作。

2.1 生成新 Tensor 的运算

t1 = torch.randint(1, 10, (3, 2))
print(t1.add(1))
  • t1.add(1):对 t1 的每个元素加 1,结果生成一个新的 Tensor。

2.2 覆盖原 Tensor 的运算

print(t1.add_(1))
  • t1.add_(1):对 t1 的每个元素加 1,结果覆盖原 Tensor。

2.3 阿达玛积(逐元素乘法)

t1 = torch.tensor([[1, 2], [3, 4]])
t2 = torch.tensor([[5, 6], [7, 8]])
t3 = t1 * t2
print(t3)
  • t1 * t2:逐元素乘法,即对应位置的元素相乘。

2.4 矩阵乘法

t1 = torch.tensor([[1, 2], [3, 4]])
t2 = torch.tensor([[5, 6], [7, 8]])
t3 = torch.matmul(t1, t2)
print(t3)
  • torch.matmul(t1, t2):矩阵乘法,符合矩阵乘法的规则。

3. Tensor 的形状变换

在深度学习中,经常需要对 Tensor 的形状进行变换,例如在卷积神经网络中调整输入数据的维度。PyTorch 提供了 view()reshape() 方法来实现这一点。

3.1 view() 方法

t1 = torch.tensor([[1, 2, 3], [4, 5, 6]])
t2 = t1.view(3, 2)
print(t2)
  • t1.view(3, 2):将 Tensor 的形状从 (2, 3) 变为 (3, 2)。注意,view() 要求 Tensor 的内存是连续的。

3.2 reshape() 方法

t1 = torch.tensor([[1, 2, 3], [4, 5, 6]])
t3 = t1.reshape(3, 2)
print(t3)
  • t1.reshape(3, 2):与 view() 类似,但 reshape() 不要求内存是连续的。

4. 维度变换

在处理多维数据时,经常需要对 Tensor 的维度进行变换,例如在处理图像数据时交换通道维度。

4.1 transpose() 方法

t1 = torch.randint(1, 20, (3, 4, 5))
t2 = torch.transpose(t1, 0, 1)
print(t2)
  • torch.transpose(t1, 0, 1):交换 Tensor 的第 0 维和第 1 维。

4.2 permute() 方法

t3 = t1.permute(1, 0, 2)
print(t3)
  • t1.permute(1, 0, 2):可以同时交换多个维度,非常灵活。

5. 完整代码示例

import torchdef test01():t1 = torch.tensor([1,2,3,4,5])# numpy():将tensor转换为numpy数组,浅拷贝:如果要深拷贝,需要使用copy()# tensor():将numpy数组转换为tensor,深拷贝# from_numpy():将numpy数组转换为tensor,浅拷贝n1 = t1.numpy()print(n1)t2 = torch.tensor(n1)print(t2)t3 = torch.from_numpy(n1)print(t3)# item():当tensor只有一个元素时,使用item()获取该元素的值# t4 = torch.tensor(18)t4 = torch.tensor([18])print(t4)print(t4.item())# t5 = torch.tensor([18],device='cuda')# print(t5.item())def test02():torch.manual_seed(0)# tensor运算# add, sub , mul, div等,计算结果会生成新的tensor# add_, sub_, mul_, div_等,计算结果会覆盖原来的tensort1 = torch.randint(1 , 10, (3, 2))print(t1)print(t1.add(1))print(t1)print(t1.add_(1))print(t1)'''
阿达码积:两个矩阵对应位置相乘,得到一个新的矩阵
Cij = Aij * Bij
运算符号: mul或者*
矩阵运算:(m,p) * (p,n) = (m,n)
'''
def test03():t1 = torch.tensor([1,2],[3,4])t2 = torch.tensor([5,6],[7,8])t3 = t1 * t2print(t3)'''
view():改变tensor的形状,不改变tensor的数据,内存是连续的
reshape():改变tensor的形状,不改变tensor的数据,内存不连续
'''def test04():t1 = torch.tensor([1,2,3],[4,5,6])print(t1.is_contiguous())t2 = t1.view(3, 2)print(t2.is_contiguous())t3 = t1.t()print(t3)print(t3.is_contiguous())t4 = t3.view(2, 3)print(t4.is_contiguous())'''
维度变换
transpose():转置,交换张量的两个维度, 只能交换两个维度
permute(input,dims):维度变换,可以交换多个维度
'''
def test05():t1 = torch.randint(1, 20, (3, 4, 5))print(t1)t2 = torch.transpose(t1, 0, 1)print(t2)print(t2.is_contiguous())t3 = t1.permute(t1, (1, 0, 2))print(t3)print(t3.shape)if __name__ == '__main__':# test01()# test02()# test03()# test04()test05()

6. 总结

通过这篇文章,我们学习了 PyTorch 中 Tensor 的基本操作,包括:

  • 如何在 Tensor 和 NumPy 数组之间进行转换。

  • 如何进行基本的数学运算。

  • 如何改变 Tensor 的形状。

  • 如何对 Tensor 的维度进行变换。

这些操作是深度学习的基础,希望这篇文章能帮助你更好地理解和使用 PyTorch!

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

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

相关文章

CompletableFuture使用详解(Super Detailed)

一、 CompletableFuture介绍 多线程开发一般使用Runnable,Callable,Thread,FutureTask,ThreadPoolExecutor,但也有不近如意的地方 Thread Runnable:执行异步任务,没有返回结果。 Thread Calla…

开源 Arkts 鸿蒙应用 开发(六)数据持久--文件和首选项存储

文章的目的为了记录使用Arkts 进行Harmony app 开发学习的经历。本职为嵌入式软件开发,公司安排开发app,临时学习,完成app的开发。开发流程和要点有些记忆模糊,赶紧记录,防止忘记。 相关链接: 开源 Arkts …

【Bluedroid】蓝牙协议栈控制器能力解析与核心功能配置机制(decode_controller_support)

本文围绕Bluedroid蓝牙协议栈中控制器能力解析与核心功能配置的关键代码展开,详细阐述蓝牙协议栈如何通过解析控制器硬件能力,构建 SCO/eSCO、ACL 数据包类型支持掩码,配置链路策略、安全服务、查询与扫描模式等核心功能。这些机制确保协议栈…

小架构step系列07:查找日志配置文件

1 概述 日志这里采用logback,其为springboot默认的日志工具。其整体已经被springboot封装得比较好了,扔个配置文件到classpath里就能够使用。 但在实际使用中,日志配置文件有可能需要进行改动,比如日志的打印级别,平…

一文讲清楚React Hooks

文章目录一文讲清楚React Hooks一、什么是 React Hooks?二、常用基础 Hooks2.1 useState:状态管理基本用法特点2.2 useEffect:副作用处理基本用法依赖数组说明2.3 useContext:上下文共享基本用法特点三、其他常用 Hooks3.1 useRed…

Apache http 强制 https

1. 修改一下文件配置 sudo nano /etc/apache2/sites-enabled/000-default.conf<VirtualHost *:80>ServerName hongweizhu.comServerAlias www.hongweizhu.comServerAdmin webmasterlocalhostDocumentRoot /var/www/html# 强制重定向到HTTPSRewriteEngine OnRewriteCond …

【读代码】GLM-4.1V-Thinking:开源多模态推理模型的创新实践

一、基本介绍 1.1 项目背景 GLM-4.1V-Thinking是清华大学KEG实验室推出的新一代开源视觉语言模型,基于GLM-4-9B-0414基础模型构建。该项目通过引入"思维范式"和强化学习课程采样(RLCS)技术,显著提升了模型在复杂任务中的推理能力。其创新点包括: 64k超长上下文…

从代码生成到智能运维的革命性变革

AI大模型重塑软件开发&#xff1a;从代码生成到智能运维的革命性变革 希望对大家有一定的帮助&#xff0c;进行参考 目录AI大模型重塑软件开发&#xff1a;从代码生成到智能运维的革命性变革 希望对大家有一定的帮助&#xff0c;进行参考一、范式转移&#xff1a;软件开发进入&…

豆包编写Java程序小试

今天下载了一本第四版电气工程师手册&#xff0c;非常棒的一本书&#xff0c;在给PDF添加目录的时候&#xff0c;由于目录有将近60页&#xff0c;使用老马开发的PdgCntEditor有点卡顿&#xff0c;不过补充下&#xff0c;老马这个PdgCntEditor还是非常好的。所以我决定用Java编一…

SpringBoot整合腾讯云新一代行为验证码

一 产品介绍 腾讯云官方介绍链接 腾讯云新一代行为验证码&#xff08;Captcha&#xff09;&#xff0c;基于十道安全防护策略&#xff0c;为网页、App、小程序开发者打造立体、全面的人机验证。在保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时&…

SenseGlove新一代外骨骼力反馈手套Rembrand来袭!亚毫米级手部动捕+指尖触觉力采集+5Dof主动力反馈多模态

在远程机器人操作领域&#xff0c;精准的触觉感知与灵活的动作控制始终是核心需求。SenseGlove 新推出的 Rembrandt 力反馈外骨骼数据手套&#xff0c;以先进技术为支撑&#xff0c;为远程操控人形机器人手部提供了无缝解决方案&#xff0c;让操作更精准、更高效。值得一提的是…

Linux 信号机制:操作系统的“紧急电话”系统

想象一下&#xff0c;你正在电脑前专心工作&#xff0c;突然手机响了——这是一个通知&#xff0c;要求你立即处理一件新事情&#xff08;比如接电话&#xff09;。 Linux 系统中的信号&#xff08;Signal&#xff09;​​ 机制&#xff0c;本质上就是操作系统内核或进程之间用…

论文略读:Prefix-Tuning: Optimizing Continuous Prompts for Generation

2021 ACL固定预训练LM&#xff0c;为LM添加可训练&#xff0c;任务特定的前缀这样就可以为不同任务保存不同的前缀这种前缀可以看成连续可微的soft prompt&#xff0c;相比于离散的token&#xff0c;更好优化&#xff0c;效果更好训练的时候只需要更新prefix部分的参数&#xf…

CSS基础选择器、文本属性、引入方式及Chorme调试工具

CSS基础 1.1 CSS简介 CSS 是层叠样式表 ( Cascading Style Sheets ) 的简称. 有时我们也会称之为 CSS 样式表或级联样式表。 CSS 是也是一种标记语言 CSS 主要用于设置 HTML 页面中的文本内容&#xff08;字体、大小、对齐方式等&#xff09;、图片的外形&#xff08;宽高、边…

RabbitMQ 高级特性之事务

1. 简介与 MySQL、Redis 一样&#xff0c;RabbitMQ 也支持事务。事务中的消息&#xff0c;要么全都发送成功&#xff0c;要么全部发送失败&#xff0c;不会出现一部分成功一部分失败的情况。2. 使用事务发送消息spring 中使用 RabbitMQ 开启事务需要两步&#xff1a;第一步&…

iframe 的同源限制与反爬机制的冲突

一、事件背景A域名接入了动态防护&#xff08;Bot 防护、反爬虫机制&#xff09;&#xff0c;同时第三方业务B域名通过内嵌iframe的方式调用了A域名下的一个链接。二、动态防护介绍&#xff1a;动态防护&#xff08;也称为 Bot 防护、反爬虫机制&#xff09;是网站为了防止自动…

Rust 的 Copy 语义:深入浅出指南

在 Rust 中&#xff0c;Copy 是一个关键的特性&#xff0c;它定义了类型的复制行为。理解 Copy 语义对于掌握 Rust 的所有权系统和编写高效代码至关重要。一、核心概念&#xff1a;Copy vs Move特性Copy 类型非 Copy 类型 (Move)赋值行为按位复制 (bitwise copy)所有权转移 (ow…

Qt的信号与槽(二)

Qt的信号与槽&#xff08;二&#xff09;1.自定义槽2.通过图形化界面来生成自定义槽3.自定义信号3.信号和槽带参数4.参数数量5.connect函数的设计&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f;&#x1f31f; &#x1f680;&#x1f680;系列专栏&#xf…

Java研学-MongoDB(三)

三 文档相关 7 文档统计查询① 语法&#xff1a; // 精确统计文档数 慢 准 dahuang> db.xiaohuang.countDocuments({条件}) 4 // 粗略统计文档数 快 大致准 dahuang> db.xiaohuang.estimatedDocumentCount({条件}) 4② 例子&#xff1a; // 精确统计文档数 name为奔波儿灞…

TCP协议格式与连接释放

TCP报文段格式 TCP虽然是面向字节流的&#xff0c;但TCP传送带数据单元确是报文段。TCP报文段分为首部和数据段部分&#xff0c;而TCP的全部功能体现在它在首部中各字段的作用。因此&#xff0c;只有弄清TCP首部各字段的作用才能掌握TCP的工作原理。 TCP报文段首部的前20字节是…