深度学习(3)---PyTorch中的张量

news2024/12/25 9:45:36

文章目录

  • 一、张量简介与创建
    • 1.1 简介
    • 1.2 张量的创建
  • 二、张量的操作
    • 2.1 张量的拼接与切分
    • 2.2 张量索引
  • 三、张量的数学运算


一、张量简介与创建

1.1 简介

 1. 张量是一个多维数组,它是标量、向量、矩阵的高维拓展。

在这里插入图片描述
 2. 在张量的定义中,方括号用于表示张量的形状。例如,torch.tensor([[1, 2, 3], [4, 5, 6]]) 定义了一个2x3的二维张量,其中方括号 [[…], […]] 表示该张量有2行3列。 例如,torch.tensor([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]) 定义了一个2x2x3的三维张量,其中方括号 [[[…, …], […, …]], [[…, …], […, …]]] 表示该张量有2个2x3的矩阵。

 3. PyTorch中的张量(Tensor)和数组(Array)之间存在一些关键区别。尽管它们在许多方面都很相似,但在一些重要的方面也有所不同。以下是它们之间的主要区别:

  • 底层库:PyTorch的张量是基于PyTorch库的,而数组通常是基于NumPy库的。这是两者之间的主要区别。
  • 动态计算图:PyTorch的张量支持动态计算图,这意味着可以在运行时动态构建、修改和执行计算图。这使得PyTorch非常适合于构建复杂的神经网络和其他动态计算任务。数组则不支持动态计算图。
  • GPU加速:PyTorch的张量可以方便地在CPU和GPU之间移动,以便利用GPU加速计算。这使得PyTorch非常适合于大规模数据处理和深度学习任务。数组也可以通过NumPy的库函数在GPU上运行,但不如PyTorch方便。
  • 自动求导:PyTorch的张量支持自动求导功能,可以自动计算函数的梯度。这使得PyTorch非常适合于深度学习和优化任务。数组本身不支持自动求导,但可以通过NumPy的库函数手动计算梯度。
  • 操作和函数:PyTorch的张量和NumPy的数组都提供了大量的操作和函数,用于执行各种数学运算、统计分析等。然而,PyTorch的张量还提供了一些专门用于深度学习的函数和操作,如卷积、池化等。

 4. 张量中的8个属性:

  • data:存储的实际数据,是一个多维数组。
  • dtype:张量中元素的数据类型,如torch.float32、torch.int64等。
  • shape:张量的形状,表示每个维度的大小。它是一个元组,例如(3, 256, 832)。
  • device:张量所在的设备,可以是CPU或GPU。
  • requires_grad:一个布尔值,表示是否需要计算梯度。如果设置为True,则PyTorch将记录该张量的操作历史,以便在反向传播时自动计算梯度。
  • grad:张量的梯度,形状与data一致。它存储了关于张量的梯度信息,用于反向传播和优化。
  • grad_fn:创建该张量时所用的函数(Function)。它记录了创建张量的操作历史,是自动求导的关键。
  • is_leaf:一个布尔值,表示该张量是否是叶子节点。叶子节点是指在计算图中没有依赖其他张量的节点。对于叶子节点,反向传播结束时其梯度仍会保存,非叶子节点的梯度会被释放,以节省内存。

在这里插入图片描述

1.2 张量的创建

 1. 直接创建:

import torch
# 定义一个标量张量
x = torch.tensor(5)
print(x)

# 定义一个一维张量(向量)
y = torch.tensor([1, 2, 3, 4, 5])
print(y)
# 定义一个二维张量(矩阵)
z = torch.tensor([[1, 2, 3], [4, 5, 6]])
print(z)

# 定义一个高维张量
w = torch.tensor([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
print(w)

 2. 依据数值创建:

arr = np.array([1, 2, 3, 4, 5])
print(arr)
x = torch.tensor(arr)
print(x)

 3. torch.arange用于创建一个包含等间隔数值的一维张量(tensor)。注意:数值区间是[start, end)。

import torch  
  
# 创建一个从 0 到 9 的一维张量,步长为 1  
a = torch.arange(0, 10)  
print(a)  
# 输出:tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])  
  
# 创建一个从 1 到 10 的一维张量,步长为 2  
b = torch.arange(1, 10, step=2)  
print(b)  
# 输出:tensor([1, 3, 5, 7, 9])

 4. torch.linspace用于创建一个包含等间隔数值的一维张量(tensor)。与torch.arange不同的是,torch.linspace` 指定了序列中数值的个数,而不是步长。

import torch  
  
# 创建一个从 0 到 1 的一维张量,包含 10 个数值  
a = torch.linspace(0, 1, steps=10)  
print(a)  
# 输出:tensor([0.0000, 0.1111, 0.2222, 0.3333, 0.4444, 0.5556, 0.6667, 0.7778, 0.8889, 1.0000])

 5. torch.normal用于生成服从正态分布(高斯分布)的张量。其中每个元素都是从给定均值和标准差的正态分布中随机采样得到的。它可以用于生成随机数、模拟数据等。它的用法是:torch.normal(mean, std, size)

  • mean:正态分布的均值。
  • std:正态分布的标准差。
  • size:生成张量的形状。
import torch  
  
# 生成一个形状为 (3, 3) 的张量,服从均值为 0、标准差为 1 的正态分布  
a = torch.normal(0, 1, size=(3, 3))  
print(a)

#输出如下:
tensor([[ 0.6692, -0.6885, -0.3282],  
        [-1.0229,  0.2951,  1.3966],  
        [ 0.2123, -0.6048,  0.9535]])

 6. torch.randn用于生成服从标准正态分布(均值为 0,标准差为 1)的张量。torch.randn函数返回一个指定形状的张量,其中每个元素都是从标准正态分布中随机采样得到的。它可以用于生成随机数、模拟数据等。与torch.normal不同的是,torch.randn默认生成的是标准正态分布的张量,而torch.normal可以指定均值和标准差。

import torch  
  
# 生成一个形状为 (3, 3) 的张量,服从标准正态分布  
a = torch.randn(3, 3)  
print(a)

二、张量的操作

2.1 张量的拼接与切分

 1. torch.cat()用于将多个张量按照指定的维度连接成一个新的张量。它的用法是:torch.cat(tensors, dim=0)

  • tensors:一个包含多个张量的序列或元组。
  • dim:连接的维度,默认为 0,表示在第 0 维上进行连接。
import torch  
  
# 创建两个形状为 (3, 4) 的张量  
a = torch.tensor([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])  
b = torch.tensor([[13, 14, 15, 16], [17, 18, 19, 20], [21, 22, 23, 24]])  
  
# 在第 0 维上连接两个张量  
c = torch.cat((a, b), dim=0)  
print(c)

#输出为:
tensor([[ 1,  2,  3,  4],  
        [ 5,  6,  7,  8],  
        [ 9, 10, 11, 12],  
        [13, 14, 15, 16],  
        [17, 18, 19, 20],  
        [21, 22, 23, 24]])

 2. torch.stack()用于将多个张量沿着新的维度进行堆叠。它的用法是:torch.stack(seq, dim=0)注意torch.stack()函数要求所有被堆叠的张量的形状必须相同。

  • 将 seq 序列中的每个张量视为一行,构建一个新的二维张量(即矩阵),其中第 i 行对应于第 i 个张量。
  • 在指定的 dim 维度上对这些行进行堆叠,从而得到一个新的张量。
import torch  
  
# 创建两个形状为 (3,) 的张量  
a = torch.tensor([1, 2, 3])  
b = torch.tensor([4, 5, 6])  
  
# 在第 0 维上堆叠两个张量  
c = torch.stack((a, b), dim=0)  
print(c)

#输出为:
tensor([[1, 2, 3],  
        [4, 5, 6]])

 3. torch.chunk()用于将张量拆分成多个块。它的用法是:torch.chunk(input, chunks, dim=0)

  • input:要拆分的输入张量。
  • chunks:拆分后的块数。
  • dim:要进行拆分的维度,默认为0(第 0 维)。

 函数会将输入张量在指定的维度上均匀拆分成 chunks 个块,并返回一个包含这些块的元组。每个块的形状是将输入张量的形状在第 dim 维上分割成 chunks 个相等的部分而得到的。

import torch  
  
# 创建一个形状为 (6,) 的张量  
x = torch.tensor([1, 2, 3, 4, 5, 6])  
  
# 在第 0 维上拆分成 3 个块  
chunks = torch.chunk(x, 3)  
  
# 打印拆分后的块  
for i, chunk in enumerate(chunks):  
    print(f"Chunk {i}: {chunk}")

#输出为:
Chunk 0: tensor([1, 2])  
Chunk 1: tensor([3, 4])  
Chunk 2: tensor([5, 6])

 4. torch.split()用于将张量拆分成多个块,与torch.chunk()类似。它的用法是:torch.split(tensor, split_size, dim=0)

  • tensor:要拆分的输入张量。
  • split_size:每个块的大小。
  • dim:要进行拆分的维度,默认为0(第 0 维)。
import torch  
  
# 创建一个形状为 (8, 3) 的张量  
x = torch.randn(8, 3)  
  
# 在第 0 维上拆分成大小为 2 的块  
splits = torch.split(x, 2, dim=0)  
  
# 打印拆分后的块  
for i, split in enumerate(splits):  
    print(f"Split {i}: {split.shape}")

#输出为:
Split 0: torch.Size([2, 3])  
Split 1: torch.Size([2, 3])  
Split 2: torch.Size([2, 3])  
Split 3: torch.Size([2, 3])

 在这个示例中,我们创建了一个形状为 (8, 3) 的张量 x。然后,我们使用 torch.split(x, 2, dim=0) 在第 0 维上将其拆分成大小为 2 的块。最后,我们打印了每个块的形状。可以看到,输入张量被均匀拆分成了 4 个大小为 (2, 3) 的块。

2.2 张量索引

 1. torch.index_select()用于沿着指定维度对张量进行索引。它返回一个新的张量,该张量是按照给定的索引从源张量中选择的元素构成的。它的用法是:torch.index_select(input, dim, index)

  • input:源张量,即要进行索引操作的张量。
  • dim:要进行索引的维度。
  • index:包含索引值的张量。索引值必须是非负整数,且不超过源张量在指定维度上的大小。
import torch  
  
# 创建一个 3x3 的张量  
x = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])  
  
# 选择第 0 行(索引为 0)和第 2 行(索引为 2)  
indices = torch.tensor([0, 2])  
  
# 沿着维度 0(即行)进行索引选择  
selected = torch.index_select(x, 0, indices)  
  
print(selected)

#输出为:
tensor([[1, 2, 3],  
        [7, 8, 9]])

在这个例子中,我们首先创建了一个 3x3 的张量 x。然后,我们指定要选择的行的索引,即第 0 行和第 2 行。最后,我们调用torch.index_select()函数,指定要索引的维度为 0(即行),并传入源张量和索引张量。函数返回一个新的张量,其中包含了选择的行。

 2. torch.masked_select()用于根据掩码张量从源张量中选择元素。它返回一个新的张量(返回值:一维张量),该张量包含源张量中对应掩码值为 True 的元素。它的用法是:torch.masked_select(input, mask)

  • input:源张量,即要进行选择的张量。
  • mask:掩码张量,具有与源张量相同的形状,并包含布尔值。True 表示选择对应的元素,False 表示不选择。
import torch  
  
# 创建一个 3x3 的张量  
x = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])  
  
# 创建一个掩码张量,选择大于 4 的元素  
mask = x > 4  
  
# 根据掩码选择元素  
selected = torch.masked_select(x, mask)  
  
print(selected)

#输出为:
tensor([5, 6, 7, 8, 9])

 在这个例子中,我们首先创建了一个 3x3 的张量 x。然后,我们创建一个掩码张量 mask,其中大于 4 的元素被标记为 True。最后,我们调用 torch.masked_select() 函数,传入源张量和掩码张量。函数返回一个新的张量,其中包含了源张量中对应掩码值为 True 的元素。

三、张量的数学运算

 1. torch.reshape()用于改变张量的形状。它返回一个新的张量,该张量与原始张量共享数据,但具有不同的形状。它的用法是:torch.reshape(input, shape)

  • input:要进行形状改变的原始张量。
  • shape:新的形状,表示为一个整数列表或元组。新的形状必须与原始张量中的元素总数相同。
import torch  
  
# 创建一个形状为 [2, 3] 的张量  
x = torch.tensor([[1, 2, 3], [4, 5, 6]])  
  
# 改变形状为 [3, 2]  
reshaped = torch.reshape(x, [3, 2])  
  
print(reshaped)

#输出为:
tensor([[1, 2],  
        [3, 4],  
        [5, 6]])

 在这个例子中,我们首先创建了一个形状为 [2, 3] 的张量 x。然后,我们调用 torch.reshape() 函数,将 x 的形状改变为 [3, 2]。函数返回一个新的张量 reshaped,它与 x 共享数据,但具有不同的形状。

 2. torch.transpose()用于交换张量中的两个维度。它返回一个新的张量,其中指定的两个维度互换位置。它的用法是:torch.transpose(input, dim0, dim1)

  • input:要进行维度交换的原始张量。
  • dim0:要交换的第一个维度的索引。
  • dim1:要交换的第二个维度的索引。
import torch

# 创建一个形状为 [2, 3, 4] 的张量
x = torch.randn(2, 3, 4)
print(x)
# 交换第 0 和第 1 个维度  
y = torch.transpose(x, 0, 1)
print(y)

print(y.shape)  # 输出:torch.Size([3, 2, 4])

 在这个例子中,我们首先创建了一个形状为 [2, 3, 4] 的张量 x。然后,我们调用 torch.transpose() 函数,将 x 中的第 0 和第 1 个维度交换。函数返回一个新的张量 y,其中第 0 和第 1 个维度互换位置,形状变为 [3, 2, 4]。

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

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

相关文章

智慧公厕是什么?

随着城市化进程的不断加速,公共厕所作为城市基础设施之一,也在不断进行着前所未有的变革。智慧公厕作为新一代的公共厕所形式,旨在提供更便捷、舒适、卫生的使用体验,不仅仅是个人使用需求的满足,更是城市文明程度和城…

山西电力市场日前价格预测【2023-10-05】

日前价格预测 预测说明: 如上图所示,预测明日(2023-10-05)山西电力市场全天平均日前电价为363.87元/MWh。其中,最高日前电价为649.89元/MWh,预计出现在18: 45。最低日前电价为291.58元/MWh,预计…

实验三十四、串联型稳压电路参数的选择

一、题目 电路如图1所示。已知输入电压为 50 Hz 50\,\textrm{Hz} 50Hz 的正弦交流电,来源于电源变压器副边;输出电压调节范围为 5 ∼ 20 V 5\sim20\,\textrm V 5∼20V,满载为 0.5 A 0.5\,\textrm A 0.5A; C 3 C_3 C3​ 为消振…

【itext7】使用itext7将多个PDF文件、图片合并成一个PDF文件,图片旋转、图片缩放

这篇文章,主要介绍使用itext7将多个PDF文件、图片合并成一个PDF文件,图片旋转、图片缩放。 目录 一、itext7合并PDF 1.1、引入依赖 1.2、合并PDF介绍 1.3、采用字节数组方式读取PDF文件 1.4、合并多个PDF文件 1.5、合并图片到PDF文件 1.6、旋转图…

LVGL_基础控件label

LVGL_基础控件label 1、创建一个基础对象 /* 创建一个基础对象 label */ lv_obj_t * label lv_label_create(lv_scr_act()); // 创建一个label部件(对象),他的父对象是活动屏幕对象2、设置显示内容 char * text "www.100ask.net"; // 要显示的文字 /* 展示文…

K8S网络原理

文章目录 一、Kubernetes网络模型设计原则IP-per-Pod模型 二、Kubernetes的网络实现容器到容器的通信Pod之间的通信同一个Node内Pod之间的通信不同Node上Pod之间的通信 CNI网络模型CNM模型CNI模型在Kubernetes中使用网络插件 开源的网络组件FlannelFlannel实现图Flannel特点 Op…

视频批量剪辑工具,自定义视频速率,批量剪辑工具助力创意无限”

在视频制作的世界里,每一个细节都至关重要。今天,让我们来探索一项强大且创新的功能——自定义视频速率。利用它,你可以轻松地调整视频播放速度,赋予你的作品独特的个性和风格。 首先第一步,我们要打开好简单批量智剪…

智慧公厕有什么?

智慧公厕作为一种新形态的公共厕所,把智慧化的技术融入到公共厕所的日常使用与管理当中,赋予公共厕所更良好的信息化、数字化、科技化、联网化。 那么,智慧公厕有什么?本文从设施、技术、服务三方面进行快速了解。 首先&#xf…

vue实现轮播图详解

vue实现轮播图详解 目录 vue实现轮播图详解1 引言2 vue实现轮播图2.1 Vant组件引入2.1.1 vant组件引入2.2.2 使用van-swipe组件 2.2 vue代码实现2.2.1 功能需求2.2.2 实现思路2.2.3 代码实现2.2.4 实现效果 3 总结 1 引言 在互联网日渐内卷的情况下,越来越注重用户…

【重拾C语言】四、循环程序设计(后判断条件循环、先判断条件循环、多重循环;典例:计算平均成绩、打印素数、百钱百鸡问题)

目录 前言 四、循环程序设计 4.1 计算平均成绩——循环程序 4.1.1 后判断条件的循环 a. 语法 b. 典例 4.1.2 先判断条件的循环 a. 语法 b. 典例 4.1.3 for语句 a. 语法 b. 典例 4.2 计算全班每人平均成绩—多重循环 4.2.1 打印100以内素数 4.2.2 百钱百…

批量png图片格式转eps格式

问题描述: 在利用Latex排版论文格式时,当插入图片的格式要求为eps格式 ,当然也适用于其它文件格式转换 解决方法: 推荐一格好用的免费在线格式转换工具:https://cdkm.com/cn/ 操作步骤: step1:打开网址 ste…

Access注入---Cookie注入

Access注入----Cookie注入Access数据库(微软) 逐渐淘汰 (没有库的概念,是表的集合)Access没有系统自带库Cookie注入(头注入HEAD注入的)php中产生Cookie注入的可能性小,但ASP产生Cook…

CCF CSP认证 历年题目自练Day21

题目一 试题编号: 201909-1 试题名称: 小明种苹果 时间限制: 2.0s 内存限制: 512.0MB 题目分析(个人理解) 先看输入,第一行输入苹果的棵树n和每一次掉的苹果数m还是先如何存的问题&#xf…

船用法兰铸钢止回阀

声明 本文是学习GB-T 586-2015 船用法兰铸钢止回阀. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了法兰连接尺寸和密封面按 CB/T 4196、GB/T 2501 的船用法兰铸钢止回阀(以下简 称止回阀)的分类和标记、要求、试验方法、检验规…

计算机竞赛 行人重识别(person reid) - 机器视觉 深度学习 opencv python

文章目录 0 前言1 技术背景2 技术介绍3 重识别技术实现3.1 数据集3.2 Person REID3.2.1 算法原理3.2.2 算法流程图 4 实现效果5 部分代码6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习行人重识别(person reid)系统 该项目…

RabbitMQ-第四种交换机类型

接上文 RabbitMQ-主题模式 1 第四种交换机类型 header:它是根据头部信息来决定的,在我们发送的消息中是可以携带一些头部信息的,类似与HTTP,我们可以根据这些头部信息来决定路由到哪一个消息队列中。 修改配置类内容 Configuration public…

win10自动更新后vpn不能使用

win10自动更新后vpn连接报错:不能建立到远程计算机的连接,请更改网络设置。 查看事件查看器: 错误日志如下: CoId{7E9C11AE-F6AF-0000-BC96-9C7EAFF6D901}: 用户 win10\myname 已进行名为 vpn1 的拨号连接,该连接已失…

写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。

题目要求: 写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。 思考内容: 怎么确定一个二进制数位的奇数位和偶数位?且这个位上的是0还是1? 假设: 数字 13 的二进制数位 0000 0000 0000 0000 0000 0000 00…

微信小程序 table表格 固定表头和首列 右侧表格可以左右滚动

(一) 1.左侧一列固定不动 2.右侧表格内容可以左右滚动 3.单元格内容平均分配 4.每一行行高可以由内容撑开 通过 js 设置左侧一列行高与右侧表格内容行高保持一致 1.1 效果图 1.2 tabble.wxml <view classtable><!-- 左侧固定 --><view classtable_left_colum…

代码随想录 Day10 栈与队列 LeetCode T239 滑动窗口的最大值 T347 前K个高频元素

简要介绍一下单调队列和优先级队列的不同 元素顺序的处理&#xff1a;单调队列中&#xff0c;元素的顺序是单调的&#xff0c;也就是说&#xff0c;队列中的元素按照特定的单调性&#xff08;递增或递减&#xff09;排列。这种特性使得单调队列在处理一些问题时非常高效&#…