【李沐深度学习笔记】数据操作实现

news2025/1/11 17:48:51

课程地址

数据操作实现p2

数据操作

首先导入PyTorch包(import torch),虽然叫PyTorch,但实际上要导入torch。

import torch

张量

张量表示的是一个数值组成的数组,这个数组可以有很多个维度。

# 生成0-11的顺序序列构成的一维数组张量(12那里是开区间,取不到)
x = torch.arange(12)
print(x)

输出结果:tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])

张量的形状和元素个数

# 访问张量的形状(一维显示长度)
print(x.shape)
# 张量中元素的个数
print(x.numel())

输出结果:
torch.Size([12])
12

改变张量的形状

将上面的张量变为3X4的矩阵形式

print(x.reshape(3,4))

输出结果:

tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])

全0和全1张量

# 定义1个3X4的张量,元素全为0
x = torch.zeros((3,4))
print(x)
# 定义1个2X3X4的张量,元素全为1
x = torch.ones((2,3,4))
print(x)

输出结果:
tensor([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
tensor([[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],

    [[1., 1., 1., 1.],
     [1., 1., 1., 1.],
     [1., 1., 1., 1.]]])

用Python的列表创建张量

# 用Python的列表创建张量(此处为2阶方阵)
x = torch.tensor([[1,2],[3,4]])
print(x)
# 打印其形状(维度)
print(x.shape)

输出结果:
tensor([[1, 2],
[3, 4]])
torch.Size([2, 2])

张量的常见运算

x1 = torch.tensor([1,1,1,3]) # 注意,张量的元素类型必须是相同的,假如这里面有浮点数,则所有元素都是浮点数
x2 = torch.tensor([0,2,0,6])
# 加法
x3 = x1 + x2
print(x3)
# 减法
x3 = x1 - x2
print(x3)
# 乘法
x3 = x1 * x2
print(x3)
# 除法
x3 = x2 / x1 # 0不能做分母
print(x3)
# 幂运算
x3 = x2 ** 2
print(x3)
# 指数函数e^x
x3 = torch.exp(x1)
print(x3)
# 开根号
x3 = torch.sqrt(x1)
print(x3)

运行结果:
tensor([1, 3, 1, 9])
tensor([ 1, -1, 1, -3])
tensor([ 0, 2, 0, 18])
tensor([0., 2., 0., 2.])
tensor([ 0, 4, 0, 36])
tensor([ 2.7183, 2.7183, 2.7183, 20.0855])
tensor([1.0000, 1.0000, 1.0000, 1.7321])

连结张量

# 按1到11的序列,并转换为3X4的矩阵,指定元素类型是32位浮点数
X = torch.arange(12, dtype=torch.float32).reshape(3,4)
Y = torch.tensor([[9,2,1,0],[3,1,0,2],[1,1,1,1]])
print("X=")
print(X)
print("Y=")
print(Y)
# 按行合并,dim参数设置为0
X1 = torch.cat((X,Y),dim=0)
print("dim=0:")
print(X1)
# 按列合并,dim参数设置为1
X1 = torch.cat((X,Y),dim=1)
print("dim=1:")
print(X1)

运行结果:
X=
tensor([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.]])
Y=
tensor([[9, 2, 1, 0],
[3, 1, 0, 2],
[1, 1, 1, 1]])
dim=0:
tensor([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[ 9., 2., 1., 0.],
[ 3., 1., 0., 2.],
[ 1., 1., 1., 1.]])
dim=1:
tensor([[ 0., 1., 2., 3., 9., 2., 1., 0.],
[ 4., 5., 6., 7., 3., 1., 0., 2.],
[ 8., 9., 10., 11., 1., 1., 1., 1.]])

通过逻辑运算符构建二维张量

  • 判断两个维度和形状一致的张量是否相等,将对应位置元素是否相等的布尔值构建成一个元素全为布尔值的二维张量
a = torch.tensor([[1,2],[3,4]])
b = torch.tensor([[1,3],[2,4]])
print(a==b)

运行结果:
tensor([[ True, False],
[False, True]])

求和

# 对张量中所有元素求和,生成的是一个元素的张量(不是数字类型)
a = torch.tensor([[1,2],[3,4],[5,6]])
print(a.sum())

运行结果:
tensor(21)

广播机制

【问】什么是PyTorch的广播机制?
【chatGPT回答】在PyTorch中,广播机制是指在进行张量(Tensor)操作时,自动调整不同形状的张量,使它们能够按照一定规则进行元素级别的运算。
广播机制的主要目的是为了简化张量操作的代码编写过程,减少不必要的复制和内存消耗,并且增加代码的可读性。
当我们对两个形状不同的张量进行元素级别的运算时,广播机制会自动调整其中一个形状,使其与另一个张量的形状相匹配,从而使两个张量能够进行元素级别的运算。
具体来说,广播机制遵循以下规则:

  • 如果两个张量的维度数不同,将较低维度的张量进行扩展,直到维度匹配。这通常是通过在维度较小的张量前面添加大小为1的维度来实现的。
  • 如果两个张量在某个维度上的大小不一致,但其中一个张量的大小为1,那么可以通过复制该张量的数据来扩展其大小以匹配另一个张量。
  • 如果两个张量在某个维度上的大小都不一致,并且都不为1,则不能进行广播,会引发形状不匹配的错误。

通过广播机制,我们可以方便地对不同形状的张量进行元素级别的运算,而不需要手动调整张量的形状。这种灵活性使得我们可以更加高效地进行各种张量操作,如加法、减法、乘法等,而无需显式地复制和扩展张量。
总之,PyTorch中的广播机制允许我们在处理不同形状的张量时,自动调整其形状,使其能够进行元素级别的运算,从而简化了张量操作的编写过程。

# 广播机制测试
a = torch.tensor([[1],[1],[0]])
b = torch.tensor([[1,2]])
print(a+b)

运行结果:
tensor([[2, 3],
[2, 3],
[1, 2]])
​这里解释一下,由于a的列数与b的行数相等,所以可以将a的列数扩展复制成b的列数,将b的行数扩展复制成a的行数
a = [ 1 1 0 ] , b = [ 1 , 2 ] a = \begin{bmatrix}1 \\1 \\0 \end{bmatrix},b=[1,2] a= 110 ,b=[1,2],则按照广播机制,则将其扩展成:
a ∗ = [ 1 1 1 1 0 0 ] , b ∗ = [ 1 2 1 2 1 2 ] , ∴ a ∗ + b ∗ = [ 2 3 2 3 1 2 ] a_{*}=\begin{bmatrix} 1&1 \\ 1&1 \\0 &0 \end{bmatrix},b_{*}=\begin{bmatrix} 1&2 \\ 1&2 \\ 1&2 \end{bmatrix},\therefore a_{*}+b_{*}=\begin{bmatrix} 2&3 \\ 2&3 \\ 1&2 \end{bmatrix} a= 110110 ,b= 111222 a+b= 221332
倘若二者的行维度和列维度根本没有一个是相等的,则报错:

# 报错
a = torch.tensor([[1,2],[3,4]]) # 2*2
b = torch.tensor([[1,2,3],[4,5,6],[7,8,9]]) # 3*3
print(a+b)

报错结果:

元素访问

X = torch.tensor([[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,0]])
print(X)
# 访问最后一个元素(也就是[7,8,9]这个嵌套在里面的向量)
print(X[-1])
# 访问第2个到第4个元素(二维张量,每个元素是一个一维张量),左闭右开区间
print(X[1:4])

运行结果:
tensor([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12],
[13, 14, 15],
[16, 17, 18],
[19, 20, 0]])
tensor([19, 20, 0])
tensor([[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])

写入张量

X = torch.tensor([[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,0]])
print(X)
# 访问第3行第2列(下标从0开始)
print(X[2,1])
# 修改第1行第3列元素的值
X[0,2] = 100
print(X)

运行结果:
tensor([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12],
[13, 14, 15],
[16, 17, 18],
[19, 20, 0]])
tensor(8)
tensor([[ 1, 2, 100],
[ 4, 5, 6],
[ 7, 8, 9],
[ 10, 11, 12],
[ 13, 14, 15],
[ 16, 17, 18],
[ 19, 20, 0]])

为多个元素赋相同的值

X = torch.tensor([[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,0]])
print(X)
# 给第2行到第5行中的第2列到第3列赋值(注意左闭右开)
X[1:6,1:3]=-1
print(X)
# 给第2行到第5行全赋值为-2,不管列,直接写成" : ",不管行也是同理
X[1:6,:]=-2
print(X)

运行结果:
tensor([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12],
[13, 14, 15],
[16, 17, 18],
[19, 20, 0]])
tensor([[ 1, 2, 3],
[ 4, -1, -1],
[ 7, -1, -1],
[10, -1, -1],
[13, -1, -1],
[16, -1, -1],
[19, 20, 0]])
tensor([[ 1, 2, 3],
[-2, -2, -2],
[-2, -2, -2],
[-2, -2, -2],
[-2, -2, -2],
[-2, -2, -2],
[19, 20, 0]])

运行一些操作可能会导致为新结果分配内存

  • Python中id类似C语言中的指针,通过id的变化可以窥探内存是否分配
# 运行一些操作可能会导致为新结果分配内存
X = torch.ones(3,3)
Y = torch.zeros(3,3)
before = id(Y)
Y = X + Y
print(before == id(Y))

运行结果:
False

执行原地操作

  • 直接用[:]赋值不会增加内存,是原地操作
X = torch.ones(3,3)
Y = torch.zeros(3,3)
print("id(X)="+str(id(X)))
X[:]=Y
print("id(X)="+str(id(X)))

运行结果:
id(X)=2411897114928
id(X)=2411897114928
可以看到id是一样的(虽然每个人运行的id可能不同)
说明变量X所占的内存区域是一样的

如果在后续计算中没有重复使用,我们也可以使用X[ : ] = X +Y或X+= Y来减少操作的内存开销。

X = torch.ones(3,3)
Y = torch.zeros(3,3)
before = id(X)
X[:] = X + Y
print(before == id(X))

运行结果:
True

转换为NumPy张量

# 将tensor转为numpy张量,再转回来
X = torch.ones(3,3)
A = X.numpy()
B = torch.tensor(A)
print(type(A))
print(type(B))

运行结果:

<class ‘numpy.ndarray’>
<class ‘torch.Tensor’>

将大小为1的张量转换为Python标量

# a是PyTorch中的张量
# a.item()对应的是numpy浮点数
# float(a)对应Python中的浮点数
# int(a)对应Python中的整数
a = torch.tensor([3.5])
print(a,a.item(),float(a),int(a))

运行结果:
tensor([3.5000]) 3.5 3.5 3

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

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

相关文章

海康威视热成像实时测温java - 23版

在20年写了一篇实时测温demo博客&#xff0c;看来帮了不少人。今天刚好又有需求&#xff0c;需要采温。也碰到了不少问题&#xff0c;特此记录 1、环境 摄像头&#xff1a;海康 型号&#xff1a;DS-2TD2528T-7/Q 序列&#xff1a;EA0406775 服务器&#xff1a;winServer J…

Leetcode168. Excel表列名称

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题解&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 代码如下&#xff1a; class Solution {public String convertToTitle(int columnNumber) {StringBuild…

【无公网IP】安装Wnmp并结合内网穿透,实现灵活可靠的外网访问内网服务!

文章目录 前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 WNMP是Windows系统下的绿色NginxMysqlPHP环境集成套件包&#xff0c;安装完成后即可得到一个Nginx MyS…

pytorch迁移学习训练图像分类

pytorch迁移学习训练图像分类 一、环境配置二、迁移学习关键代码三、完整代码四、结果对比 代码和图片等资源均来源于哔哩哔哩up主&#xff1a;同济子豪兄 讲解视频&#xff1a;Pytorch迁移学习训练自己的图像分类模型 一、环境配置 1&#xff0c;安装所需的包 pip install …

工业检测 ocr

采用OpenCV和深度学习的钢印识别_菲斯奇的博客-CSDN博客采用OpenCV和深度学习的钢印识别[这个帖子标题党了很久&#xff0c;大概9月初立贴&#xff0c;本来以为比较好做&#xff0c;后来有事情耽搁了&#xff0c;直到现在才有了一些拿得出手的东西。肯定不会太监的。好&#xf…

RL 暂态电路与磁能

前言 RL 电路是一个电阻 R 和 自感线圈 L 组成的 RL 电路&#xff0c;在连接或者接通电源U 的时候&#xff0c;由于自感电动势的作用&#xff0c;电路中的电流不会瞬间改变&#xff0c;而是一个连续的渐变的过程&#xff0c;通常这个时间很短暂&#xff0c;所以被称为暂态过程…

MySQL 面试题——MySQL 基础

目录 1.什么是 MySQL&#xff1f;有什么优点&#xff1f;2.MySQL 中的 DDL 与 DML 是分别指什么&#xff1f;3.✨数据类型 varchar 与 char 有什么区别&#xff1f;4.数据类型 BLOB 与 TEXT 有什么区别&#xff1f;5.DATETIME 和 TIMESTAMP 的异同&#xff1f;6.✨MySQL 中 IN …

xss-labs实操

文章目录 1.Level2.Level23.Level34.Level45.Level56.Level67.Level78.Level89.Level910.Level1011.Level1112.Level1213.Level13 1.Level 无过滤法 2.Level2 “>闭合 “>&submit搜索 通过观察发现alert里的引号没了&#xff0c;是不是被过滤了呢 因为如果该语句类…

leetcode:69. x 的平方根

一、题目 函数原型&#xff1a;int mySqrt(int x) 二、思路 利用二分查找思想&#xff0c;在0与x区间进行查找。 设置左边界 left &#xff08;初始值为0&#xff09;&#xff0c;右边界 right&#xff08;初始值为x&#xff09;和中值 mid &#xff08;值为区间的中间值&#…

VCP-DCV VMware vSphere:安装、配置和管理[V8.x]

VMware官方授权合作活动&#xff0c;全国招生&#xff01; VCP-DCV VMware vSphere&#xff1a;安装、配置和管理[V8.x] 课程名称&#xff1a;VMware vSphere安装、配置和管理[V8.x] 培训课时&#xff1a;40课时 培训天数&#xff1a;5天 课程介绍&#xff1a;本课程重点讲…

MySQL优化技巧:提升数据库性能

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

盐碱地改良通用技术 铁尾砂改良学习

声明 本文是学习GB-T 42828.1-2023 盐碱地改良通用技术 第1部分&#xff1a;铁尾砂改良. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件描述了铁尾砂改良盐碱地技术的技术原理&#xff0c;规定了技术要求、田间管理和效果评价。 本文…

计算机d3dx9_43.dll丢失怎么解决,简单的5个解决方法分享

在当今这个高度依赖计算机技术的时代&#xff0c;我们的生活和工作都离不开各种软件的支持。然而&#xff0c;有时候我们可能会遇到一些棘手的问题&#xff0c;比如计算机中的某个dll文件丢失&#xff0c;导致程序无法正常运行。最近&#xff0c;我就遇到了这样一个问题&#x…

无涯教程-JavaScript - TRANSPOSE函数

描述 TRANSPOSE函数将单元格的垂直范围作为水平范围返回,反之亦然。必须将TRANSPOSE函数作为数组公式输入,该范围必须具有与行范围和列范围相同的行和列数。 您可以使用TRANSPOSE在工作表上移动数组或范围的垂直和水平方向。 语法 TRANSPOSE (array)键入函数后,按CTRL SHI…

【计算机视觉】Vision Transformers算法介绍合集(二)

文章目录 一、Transformer in Transformer二、Bottleneck Transformer三、Pyramid Vision Transformer v2四、Class-Attention in Image Transformers五、Co-Scale Conv-attentional Image Transformer六、XCiT七、Focal Transformers八、CrossViT九、ConViT十、CrossTransform…

【C++】map,set简单操作的封装实现(利用红黑树)

文章目录 一、STL中set与map的源码二、 红黑树结点的意义三、仿函数的妙用四、set&#xff0c;map定义迭代器的区别五、map&#xff0c;set迭代器的基本操作&#xff1a;1.begin&#xff08;&#xff09; end&#xff08;&#xff09;2.operator3.operator-- 六、迭代器拷贝构造…

A Framework to Evaluate Fusion Methods for Multimodal Emotion Recognition

题目A Framework to Evaluate Fusion Methods for Multimodal Emotion Recognition译题一种评估多模态情感识别融合方法的框架时间2022年仅用于记录学习&#xff0c;不作为商用 一种评估多模态情感识别融合方法的框架 摘要&#xff1a;情绪识别的多模态方法考虑了预测情绪的几…

2023/9/17周报

摘要 本周阅读了两篇论文&#xff0c;其一为一种基于空气质量时频域特征提取的hybrid预测方法&#xff0c;另一篇为基于烛台与视觉几何群模型的 PM2.5 变化趋势特征提取与分类预测方法。在第一篇文章中&#xff0c;通过小波变化&#xff0c;对数据进行分频&#xff0c;并设计了…

详解3dMax中渲染线框的两种简单方法

在3dMax中渲染线框是你在某个时候想要完成的事情&#xff0c;例如为了演示分解步骤&#xff0c;或是仅仅为了在模型上创建线框覆盖的独特效果。为三维模型渲染线框最常见的原因是能够在模型上显示干净的拓扑。这篇文章将带你了解在3dMax中渲染三维模型线框的两种最常见、最简单…

太炫酷,3分钟学会,视频倒放技能

一&#xff0c;视频倒放 视频倒放是一种有趣的视频编辑技术&#xff0c;可以为您的视频带来一些特殊的效果。通过倒放视频&#xff0c;您可以实现以下效果&#xff08;如果有其它需要的软件和技术&#xff0c;可以私信小编&#xff1b;更多精彩可关注微信公众号&#xff1a;黑…