PyTorch(二)张量

#c 总结 张量总结

该文档主要熟悉了「张量」的概念,理解了「张量」在深度学习中扮演的重要角色,如何判断代码中哪些属于张量。其次熟悉了张量的「四种初始化」,以及「张量属性」,「张量操作」

1 张量概念

#d 张量

「张量(Tensor)」是一个数学概念,在物理学和工程学中也有广泛应用。在计算机科学和深度学习领域,张量是一个「多维数组」,用于表示数据的一种结构。它是标量、向量和矩阵的高维推广。在深度学习框架中,如TensorFlow和PyTorch,张量是基本的「数据结构」,用于「表示」和「处理数据」。张量作为深度学习和数值计算的基石,其引入极大地推动了这些领域的发展,使得模型的开发和训练变得更加高效和简化。

主要属性:

  1. 维度(Dimensionality):张量具有一个或多个维度,这些维度决定了张量的形状。例如,一个标量(单个数字)是0维张量,一个向量(数字列表)是1维张量,一个矩阵(数字表格)是2维张量,以此类推。
  2. 形状(Shape):张量的形状由其各个维度的大小决定。形状可以表示为一个维度大小的列表,例如,一个3x3的矩阵的形状是(3, 3),一个4x4x4的立方体张量的形状是(4, 4, 4)
  3. 数据类型(Data Type):张量中的元素通常具有相同的数据类型,如整数、浮点数等。在深度学习框架中,指定张量的数据类型是常见的做法,以确保计算的准确性和效率。
  4. 可操作性(Operability):张量支持多种数学和科学运算,这些运算可以在其元素上并行执行。例如,可以对张量进行加法、乘法、矩阵乘法等操作。

张量的创造解决的问题:

  1. 统一数据表示:张量提供了一种统一的方法来表示不同维度的数据,包括标量(0维张量)、向量(1维张量)、矩阵(2维张量)以及更高维度的数组。这种统一性使得数据处理和算法实现更加标准化和简化。

  2. 高效的数据操作:深度学习和数值计算库针对张量操作进行了优化,包括在GPU和TPU等硬件加速器上的并行计算。这使得处理大规模数据和复杂模型变得更加高效。

  3. 支持复杂的数学运算:在深度学习中,需要进行大量的矩阵运算、微分运算等。张量及其操作提供了执行这些复杂运算的基础,支持自动微分等高级功能,简化了模型的开发和训练过程。

没有张量的影响:

  1. 数据表示不统一:在没有张量的情况下,不同维度的数据需要使用不同的数据结构来表示,如标量使用单个数字,向量使用数组,矩阵使用二维数组等。这会增加数据处理的复杂性,降低代码的通用性和可读性。

  2. 计算效率降低:缺乏统一且优化的数据结构和计算框架,意味着无法充分利用硬件加速器的能力,处理大规模数据和复杂模型的效率会大大降低。

  3. 模型开发和训练更加困难:没有张量和相应的操作,实现和训练深度学习模型将变得更加复杂和低效。特别是在进行梯度计算、反向传播等操作时,缺乏自动微分功能会使得开发者需要手动计算和实现这些复杂的数学运算。

#e 彩色图像数据集 张量

假设我们有一个彩色图像数据集,每张图像的分辨率为28x28像素,且图像为RGB格式(即有红、绿、蓝三个颜色通道)。如果我们有100张这样的图像,我们可以使用一个4维张量来表示这个数据集,其形状为(100, 3, 28, 28)

  • 第一维表示图像的数量(100张图像)。
  • 第二维表示颜色通道(3个通道:红、绿、蓝)。
  • 第三维和第四维分别表示图像的高度和宽度(28x28像素)。
import torch# 假设images_data是一个形状为(100, 3, 28, 28)的4维数组,代表100张28x28像素的RGB图像
images_data = torch.rand(100, 3, 28, 28)

#e 一本书 张量

我们可以把一本书视为一个三维张量。

  • 第一维是页数,假设这本书有200页。
  • 第二维是每页的行数,假设每页有30行。
  • 第三维是每行的字符数,假设每行有60个字符。

这样,我们可以用一个形状为(200, 30, 60)的张量来表示这本书的结构。每个元素在这个张量中代表了书中的一个字符的位置(哪一页、哪一行、哪一个字符位置)。

#c 作用 张量的作用

在PyTorch框架中,「张量」被用来表示「模型的输入输出」以及「模型的参数」。「张量」与「NumPy的多维数组(ndarray)」类似,不同之处在于张量可以运行在GPU或其他硬件加速器上。实际上,张量和NumPy数组往往可以共享相同的底层内存(CPU状态下),这消除了复制数据的需要)。张量还针对自动微分进行了优化。

2 张量初始化

#c 说明 初始化多样

张量的初始化有许多的方式。

#e 四种创建例子 初始化多样

#1.数据直接创建
data = [[1, 2],[3, 4]]
x_data = torch.tensor(data)#2.从numpy数组创建
np_array = np.array(data)
x_np = torch.from_numpy(np_array)#3.从另一个张量创建
x_ones = torch.ones_like(x_data)#保留x_data的属性
print(f"Ones Tensor: \n {x_ones} \n")
'''
Ones Tensor: tensor([[1, 1],[1, 1]]) 
'''x_rand = torch.rand_like(x_data, dtype=torch.float)#覆盖数据类型
print(f"Random Tensor: \n {x_rand} \n")
'''
Random Tensor: tensor([[0.3233, 0.8274],[0.6734, 0.7567]]) 
'''#4.使用随机或常量值创建
shape = (2,3,)#2行3列
rand_tensor = torch.rand(shape)#随机张量
ones_tensor = torch.ones(shape)#全1张量
zeros_tensor = torch.zeros(shape)#全0张量
print(f"Random Tensor: \n {rand_tensor} \n")
print(f"Ones Tensor: \n {ones_tensor} \n")
print(f"Zeros Tensor: \n {zeros_tensor}")
'''
Random Tensor:tensor([[0.8509, 0.5273, 0.0969],[0.0020, 0.7490, 0.3388]])Ones Tensor:tensor([[1., 1., 1.],[1., 1., 1.]])Zeros Tensor:tensor([[0., 0., 0.],[0., 0., 0.]])
'''

3 张量属性

#c 说明 属性说明

「张量」的属性描述了它们的「形状(shape)」、「数据类型(datatype)」以及它们「存储的设备(device)」。

#e 属性例子

tensor = torch.rand(3,4)
print(f"Shape of tensor: {tensor.shape}")
print(f"Datatype of tensor: {tensor.dtype}")
print(f"Device tensor is stored on: {tensor.device}")
'''
Shape of tensor: torch.Size([3, 4])
Datatype of tensor: torch.float32
Device tensor is stored on: cpu
'''

4 张量操作

#c 说明 张量操作

  1. 方法多:有100多种张量操作,包括算术运算、线性代数、矩阵操作(转置、索引、切片)、抽样等。torch — PyTorch 2.3 documentation

  2. GPU运行:这些操作都可以在GPU上运行(通常比在CPU上运行速度快)。

  3. 移动条件:默认情况下,张量是在CPU上创建的。我们需要使用.to方法显式地将张量移动到GPU上(在检查GPU可用性之后)。然而,将数据从CPU传输到GPU需要一定的时间和资源,因此在设计计算流程时,需要考虑到这一点,以避免频繁的数据传输,从而优化性能。

#e 移动到GPU 张量操作

if torch.cuda.is_available():tensor = tensor.to("cuda")

#e 索引与切片 张量操作

tensor = torch.ones(4,4)
print('First row: ', tensor[0])#索引访问第一行
print('First column: ', tensor[:, 0])#切片和索引组合,:表示维度上的所有元素,0表示第二维度的第一个元素(第一列)
print('Last column:', tensor[..., -1])#...表示选取所有前面的维度,-1表示最后一个元素(最后一列)
tensor[:,1] = 0#切片和索引组合,将第二列的所有元素赋值为0
print(tensor)
'''
First row:  tensor([1., 1., 1., 1.])
First column:  tensor([1., 1., 1., 1.])
Last column: tensor([1., 1., 1., 1.])
tensor([[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.]])

#e 张量连接 张量操作

t1 = torch.cat([tensor, tensor, tensor], dim=1)#按列连接,dim=0按行连接
print(t1)
'''
tensor([[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.]])
'''

#e 算数运算 张量操作

#1 矩阵乘法
y1 = tensor @ tensor.T#矩阵乘法,tensor.T表示转置
y2 = tensor.matmul(tensor.T)#矩阵乘法,等价于@
y3 = torch.rand_like(tensor)#随机张量
torch.matmul(tensor, tensor.T, out=y3)#矩阵乘法,指定输出,out=y3表示将结果存储在y3中
print(y3)
'''
tensor([[3., 3., 3., 3.],[3., 3., 3., 3.],[3., 3., 3., 3.],[3., 3., 3., 3.]])
'''
#2 元素级乘法
z1 = tensor * tensor#元素级乘法
z2 = torch.mul(tensor, tensor)#元素级乘法,等价于*
z3 = torch.rand_like(tensor)
torch.mul(tensor, tensor, out=z3)#元素级乘法,指定输出
print(z3)
'''
tensor([[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.]])

#e 单元素张量 张量操作

'''
如果有一个单元素张量,例如通过将张量的所有值聚合为一个值,可以使用 item() 方法将其转换为Python数值。
'''
agg = tensor.sum()#聚合
agg_item = agg.item()
print(agg_item, type(agg_item))
'''
12.0 <class 'float'>
'''

#e 就地操作 张量操作

'''
就地操作 将结果存储到操作数中的操作称为就地操作。它们以 _ 后缀表示。例如:x.copy_(y), x.t_(),将会改变 x。
“就地操作可以节省一些内存,但在计算导数时可能会因为立即失去历史信息而出现问题。因此,不鼓励使用它们。”在深度学习中,就地操作虽然可以减少内存的使用,但它们可能会对自动微分造成影响。
由于就地操作会改变张量的状态,这可能会导致梯度计算时无法追踪到之前的值,因为原始的输入状态已经被覆盖了。
这在需要计算梯度和进行反向传播的深度学习模型训练中是不利的,因此通常建议避免在这些情况下使用就地操作。'''
print(tensor, "\n")
tensor.add_(5)#加5
print(tensor)
'''
tensor([[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.]])tensor([[6., 5., 6., 6.],[6., 5., 6., 6.],[6., 5., 6., 6.],[6., 5., 6., 6.]])
'''

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

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

相关文章

解决Visual Studio Code在Ubuntu上崩溃的问题

解决Visual Studio Code在Ubuntu上崩溃的问题 我正在使用Ubuntu系统&#xff0c;每次打开Visual Studio Code时&#xff0c;只能短暂打开一秒钟&#xff0c;然后就会崩溃。当通过终端使用code --verbose命令启动Visual Studio Code时&#xff0c;出现以下错误信息&#xff1a;…

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验7 虚拟局域网VLAN

一、实验目的 1.学习如何划分VLAN&#xff1b; 2.验证划分VLAN的作用&#xff1b; 3.学习如何用命令行创建VLAN&#xff0c;将端口划分到VLAN&#xff0c;设置端口类型。 二、实验要求 1.使用Cisco Packet Tracer仿真平台&#xff1b; 2.观看B站湖科大教书匠仿真实验视频&am…

mysql、pg的sql请求处理流程

mysql的sql请求处理流程 连接器 客户端发起 SQL 查询请求时,首先会经过连接器模块。连接器模块负责管理客户端与服务器端之间的 TCP/IP 连接。它会验证用户身份,如果认证通过,就建立连接并分配相应的线程资源。 授权器 连接成功后,授权器模块会根据用户权限,检查当前用户是…

cmake和Make的安装及配置

cmake和Make的安装及配置 安装 make 工具的步骤取决于你使用的操作系统。以下是不同操作系统上安装 make 工具的指南: 在 Linux 上安装 make 对于大多数 Linux 发行版,可以使用包管理器来安装 make。以下是一些常见的 Linux 发行版的安装命令: Ubuntu/Debian sh 复制代码…

3d中模型显示黑色给不了材质---模大狮模型网

如果3D模型显示黑色&#xff0c;而且无法给它添加材质&#xff0c;可能有以下几种原因&#xff1a; 一&#xff1a;模型没有UV贴图 UV贴图是3D模型表面纹理的一种方式&#xff0c;如果模型没有正确的UV贴图&#xff0c;渲染时可能会显示黑色。在大多数3D建模软件中&#xff0c…

Docker常见面试题整理

文章目录 1. Docker 是什么&#xff1f;它解决了什么问题&#xff1f;2. Docker 和虚拟机&#xff08;VM&#xff09;的区别是什么&#xff1f;3、Docker三个核心概念4、如何构建一个 Docker 镜像&#xff1f;5、如何将一个 Docker 容器连接到多个网络&#xff1f;6、Docker Co…

Flink nc -l -p 监听端口测试

1、9999端口未占用 netstat -apn|grep 99992、消息发送端 nc -l -k -p 9999 {"user":"ming","url":"www.baidu1.com", "timestamp":1200L, "score":1} {"user":"xiaohu","url":…

GIT 合拼

合拼有多种方式&#xff1a; 1&#xff09;合拼分支&#xff1a; git merge [source-branch] 2&#xff09;合拼提交 &#xff1a; git cherry-pick [commit-hash] 3&#xff09;合拼单个文件&#xff1a; git checkout [source-branch] – [file] 以上合拼&#xff0c;比如将分…

qml:一个基础的界面设计

文章目录 1、文章说明2、效果图3、重要代码说明3.1 组件切换开关下拉框矩形卡片 3.2 窗口最大化后组件全部居中3.3 菜单栏3.4 Repeater实现重复8行3.5 图片加载直接加载图片文本转图片FluentUI中可供选择的图标 1、文章说明 qt6.5.3 qml写的一个界面配置设计软件&#xff0c;目…

docker in docker 连私有仓库时报错 https

背景 jenkins 是使用 docker 方式部署的, 在 jenkins中又配置了 docker 的命令, 使用的宿主机的 docker 环境, 在jenkins 中执行 docker 相关命令的时候报错 jenkinse0e7b943b6e4:/$ docker login -u admin -p Harbor12345 172.16.100.15:80 WARNING! Using --password via t…

小白科普篇:详解Java对象的强引用、软引用、弱引用和虚引用

在Java中&#xff0c;有四种类型的引用&#xff0c;它们定义了对象被垃圾收集器(GC)处理的不同时机。这四种引用分别是&#xff1a; 强引用&#xff08;Strong Reference&#xff09;软引用&#xff08;Soft Reference&#xff09;弱引用&#xff08;Weak Reference&#xff0…

算法设计与分析:动态规划法求扔鸡蛋问题 C++

目录 一、实验目的 二、问题描述 三、实验要求 四、算法思想和实验结果 1、动态规划法原理&#xff1a; 2、解决方法&#xff1a; 2.1 方法一&#xff1a;常规动态规划 2.1.1 算法思想&#xff1a; 2.1.2 时间复杂度分析 2.1.3 时间效率分析 2.2 方法二&#xff1a;动态规划加…

Java面试题:解释Java的类加载过程,包括加载、链接和初始化阶段

Java的类加载过程是将类从其二进制表示&#xff08;通常是一个 .class 文件&#xff09;加载到JVM中并准备使用的过程。这个过程分为三个主要阶段&#xff1a;加载&#xff08;Loading&#xff09;、链接&#xff08;Linking&#xff09;和初始化&#xff08;Initialization&am…

python数据分析-糖尿病数据集数据分析预测

一、研究背景和意义 糖尿病是美国最普遍的慢性病之一&#xff0c;每年影响数百万美国人&#xff0c;并对经济造成重大的经济负担。糖尿病是一种严重的慢性疾病&#xff0c;其中个体失去有效调节血液中葡萄糖水平的能力&#xff0c;并可能导致生活质量和预期寿命下降。。。。 …

若依框架集成微信支付

1. 添加微信支付相关依赖 <!-- 微信支付 --> <dependency><groupId>com.github.wxpay</groupId><artifactId>wxpay-sdk</artifactId><version>0.0.3</version> </dependency> <dependency><groupId>com.gi…

微信小程序开发---自定义底部tabBar

自定义tabBar注意事项&#xff1a; 在自定义 tabBar 模式下 &#xff0c;为了保证低版本兼容以及区分哪些页面是 tab 页&#xff0c;app.json文件中 tabBar 的相关配置项需完整声明&#xff0c;但这些字段不会作用于自定义 tabBar 的渲染。所有 tabBar 的样式都由该自定义组件…

x86 汇编中的 “lock“ 指令详解

在深入理解 “lock” 指令之前&#xff0c;我们先来看一下 Qt 源代码中的一段 x86 汇编代码&#xff1a; q_atomic_increment:movl 4(%esp), %ecxlock incl (%ecx)mov $0,%eaxsetne %alret.align 4,0x90.type q_atomic_increment,function.size q_atomic_increment,.-q_atom…

网工常见面试题

1-10题 1.介绍TCP/IP四层、五层模型作用及每层包含的协议 TCP/IP四层模型 应用层&#xff1a; 作用&#xff1a;直接与应用程序交互&#xff0c;定义了应用程序如何通过网络发送数据。包含协议&#xff1a;HTTP&#xff08;网页浏览&#xff09;、FTP&#xff08;文件传输&…

Linux学习笔记:前言与操作系统的初识【1】

前言 为什么学习Linux 作为当下最流行的操作系统之一&#xff0c;学会如何使用和操作Linux操作系统也就是每位计算机学者的看家必备技能了。其次呢&#xff0c;本人受Linux的创始人林纳斯的影响太深了&#xff0c;觉得这个人太了不起了&#xff0c;而且人家大学里就自研开发出…

javascript的toFixed()以及使用

toFixed() 是 JavaScript 中数字类型&#xff08;Number&#xff09;的一个方法&#xff0c;用来将数字转换为指定小数位数的字符串表示形式。 使用方式和示例&#xff1a; let num 123.45678; let fixedNum num.toFixed(2); console.log(fixedNum); // 输出 "123.46&qu…