【深度学习】Pytorch 系列教程(十):PyTorch数据结构:2、张量操作(Tensor Operations):(4)索引和切片详解

2023-09-16 20:06:22

目录

一、前言

二、实验环境

三、PyTorch数据结构

0、分类

1、张量(Tensor)

2、张量操作(Tensor Operations)

1. 数学运算

2. 统计计算

3. 张量变形

4. 索引和切片

使用索引访问单个元素

使用切片访问子集

使用索引和切片进行修改

布尔索引(Boolean indexing)

高级切片(Advanced slicing)


一、前言

ChatGPT:

        PyTorch是一个开源的机器学习框架,广泛应用于深度学习领域。它提供了丰富的工具和库,用于构建和训练各种类型的神经网络模型。下面是PyTorch的一些详细介绍:

  1. 动态计算图:PyTorch使用动态计算图的方式进行计算,这意味着在运行时可以动态地定义、修改和调整计算图,使得模型的构建和调试更加灵活和直观。

  2. 强大的GPU加速支持:PyTorch充分利用GPU进行计算,可以大幅提升训练和推理的速度。它提供了针对GPU的优化操作和内存管理,使得在GPU上运行模型更加高效。

  3. 自动求导:PyTorch内置了自动求导的功能,可以根据定义的计算图自动计算梯度。这简化了反向传播算法的实现,使得训练神经网络模型更加便捷。

  4. 大量的预训练模型和模型库:PyTorch生态系统中有许多预训练的模型和模型库可供使用,如TorchVision、TorchText和TorchAudio等,可以方便地加载和使用这些模型,加快模型开发的速度。

  5. 高级抽象接口:PyTorch提供了高级抽象接口,如nn.Modulenn.functional,用于快速构建神经网络模型。这些接口封装了常用的神经网络层和函数,简化了模型的定义和训练过程。

  6. 支持分布式训练:PyTorch支持在多个GPU和多台机器上进行分布式训练,可以加速训练过程,处理大规模的数据和模型。

        总体而言,PyTorch提供了一个灵活而强大的平台,使得深度学习的研究和开发更加便捷和高效。它的简洁的API和丰富的功能使得用户可以快速实现复杂的神经网络模型,并在各种任务中取得优秀的性能。

二、实验环境

        本系列实验使用如下环境

conda create -n DL python=3.7 
conda activate DL
pip install torch==1.8.1+cu102 torchvision==0.9.1+cu102 torchaudio==0.8.1 -f https://download.pytorch.org/whl/torch_stable.html
conda install matplotlib

关于配置环境问题,可参考前文的惨痛经历:

三、PyTorch数据结构

0、分类

  • Tensor(张量):Tensor是PyTorch中最基本的数据结构,类似于多维数组。它可以表示标量、向量、矩阵或任意维度的数组。
    • Tensor的操作:PyTorch提供了丰富的操作函数,用于对Tensor进行各种操作,如数学运算、统计计算、张量变形、索引和切片等。这些操作函数能够高效地利用GPU进行并行计算,加速模型训练过程。
  • Variable(变量):Variable是对Tensor的封装,用于自动求导。在PyTorch中,Variable会自动跟踪和记录对其进行的操作,从而构建计算图并支持自动求导。在PyTorch 0.4.0及以后的版本中,Variable被废弃,可以直接使用Tensor来进行自动求导。
  • Dataset(数据集):Dataset是一个抽象类,用于表示数据集。通过继承Dataset类,可以自定义数据集,并实现数据加载、预处理和获取样本等功能。PyTorch还提供了一些内置的数据集类,如MNIST、CIFAR-10等,用于方便地加载常用的数据集。
  • DataLoader(数据加载器):DataLoader用于将Dataset中的数据按批次加载,并提供多线程和多进程的数据预读功能。它可以高效地加载大规模的数据集,并支持数据的随机打乱、并行加载和数据增强等操作。
  • Module(模块):Module是PyTorch中用于构建模型的基类。通过继承Module类,可以定义自己的模型,并实现前向传播和反向传播等方法。Module提供了参数管理、模型保存和加载等功能,方便模型的训练和部署。

1、张量(Tensor

        

【深度学习】Pytorch 系列教程(一):PyTorch数据结构:1、Tensor(张量):维度(Dimensions)、数据类型(Data Types)_QomolangmaH的博客-CSDN博客https://blog.csdn.net/m0_63834988/article/details/132909219?spm=1001.2014.3001.5501https://blog.csdn.net/m0_63834988/article/details/132909219?spm=1001.2014.3001.5501​编辑https://blog.csdn.net/m0_63834988/article/details/132909219?spm=1001.2014.3001.5501​编辑https://blog.csdn.net/m0_63834988/article/details/132909219?spm=1001.2014.3001.5501icon-default.png?t=N7T8https://blog.csdn.net/m0_63834988/article/details/132909219?spm=1001.2014.3001.5501

2、张量操作(Tensor Operations)

        PyTorch提供了丰富的操作函数,用于对Tensor进行各种操作,如数学运算、统计计算、张量变形、索引和切片等。这些操作函数能够高效地利用GPU进行并行计算,加速模型训练过程。

1. 数学运算

2. 统计计算

3. 张量变形

4. 索引和切片

        在PyTorch中,可以使用索引和切片操作来访问和修改张量的特定元素或子集。

  • 使用索引访问单个元素

使用方括号和索引值来访问张量中的单个元素。索引值从0开始,并沿着每个维度进行指定。

import torch

x = torch.tensor([[1, 2, 3], [4, 5, 6]])
print(x[0, 1])  # 访问第0行、第1列的元素

输出:

tensor(2)
  • 使用切片访问子集

        可以使用冒号(:)进行切片操作,以访问张量的子集。冒号可以用来指定起始索引、结束索引和步长。

import torch

x = torch.tensor([[1, 2, 3], [4, 5, 6]])
print(x[:, 1:])  # 访问所有行的第1列及之后的元素

输出:

tensor([[2, 3],
        [5, 6]])
  • 使用索引和切片进行修改

        可以使用索引和切片操作来修改张量中的特定元素或子集。

import torch

x = torch.tensor([[1, 2, 3], [4, 5, 6]])
x[0, 1] = 9  # 修改第0行、第1列的元素为9
print(x)

输出:

tensor([[1, 9, 3],
        [4, 5, 6]])

  • 布尔索引(Boolean indexing)

        使用布尔张量作为索引,可以选择与布尔张量中相应位置为True的元素。布尔张量的形状必须与被索引的张量的形状相匹配。

import torch

tensor = torch.tensor([[1, 2, 3],
                       [4, 5, 6],
                       [7, 8, 9]])

# 使用布尔索引选择元素
bool_index = tensor[tensor > 5]
print("布尔索引选择的元素:", bool_index)

输出:

tensor([6, 7, 8, 9])

  • 高级切片(Advanced slicing)

    除了基本的切片操作外,还可以使用逗号将多个切片组合在一起,实现对不同维度的切片操作。

import torch

tensor = torch.tensor([[1, 2, 3],
                       [4, 5, 6],
                       [7, 8, 9]])

# 使用高级切片选择子集
advanced_slice = tensor[1:, ::2]
print("高级切片选择的子集:\n", advanced_slice)

输出:

tensor([[4, 6],
        [7, 9]])

使用高级切片选择了张量中从第二行开始到最后一行的子集,并且每隔一列选择一个元素。

更多推荐

前端深入理解JavaScript面向对象编程与Class

🎬岸边的风:个人主页🔥个人专栏:《VUE》《javaScript》⛺️生活的理想,就是为了理想的生活!目录引言1.什么是面向对象编程?2.Class的基本概念3.Class的语法3.1构造函数3.2属性3.3方法3.4方法的访问修饰符4.类的静态方法和属性5.Getter和Setter方法6.类的私有属性和方法7.

深度学习-Python调用ONNX模型

目录ONNX模型使用流程获取ONNX模型方法使用ONNX模型手动编写ONNX模型Python调用ONNX模型常见错误错误raiseValueError...:错误:Loadmodelmodel.onnxfailed错误:'CUDAExecutionProvider'isnotinavailableprovider错误:

GFS 分布式文件系统

1、GlusterFS概述1.1GlusterFS简介GlusterFS是一个开源的分布式文件系统。由存储服务器、客户端以及NFS/Samba存储网关(可选,根据需要选择使用)组成。没有元数据服务器组件,这有助于提升整个系统的性能、可靠性和稳定性。MFS传统的分布式文件系统大多通过元服务器来存储元数据,元数据包含存储节

前端实现websocket的应用场景以及逻辑实现

前端实现websocket的应用场景以及逻辑实现前端在基础业务逻辑外,根据具体的业务需求还可以实现更复杂的交互逻辑,如:数据同步:WebSocket可用于实时更新数据,当服务器端数据发生变化时,通过WebSocket将变化的数据推送给前端,以保持数据的实时同步。聊天功能:使用WebSocket实现实时聊天功能,前端用户

Guava精讲(三)-Caches,同步DB数据到缓存

在开发中,我们经常需要从数据库中读取数据并进行频繁的读取操作。缓存在各种场景中都有运用,例如,当一个值的计算或检索成本很高,而且在某个输入中需要多次使用该值时,就应该考虑使用缓存,因此将数据缓存在内存中可以显著提高应用程序的性能。问题描述假设我们正在开发一个电子商务网站,需要频繁地显示商品信息。商品信息存储在数据库中,

Go-Python-Java-C-LeetCode高分解法-第六周合集

前言本题解Go语言部分基于LeetCode-Go其他部分基于本人实践学习个人题解GitHub连接:LeetCode-Go-Python-Java-CGo-Python-Java-C-LeetCode高分解法-第一周合集Go-Python-Java-C-LeetCode高分解法-第二周合集Go-Python-Java-C

施耐德电气携中国信通院和中国联通共同发布白皮书,共探5G+PLC深度融合应用

2023年9月20日——全球能源管理和自动化领域的数字化转型专家施耐德电气在第23届中国国际工业博览会首日的9月19日,与中国信息通信研究院(以下简称“中国信通院”)及中国联合网络通信集团有限公司(以下简称“中国联通”)联手重磅发布《5G+PLC深度融合解决方案》白皮书,以期通过对研究思路、前沿技术、产业成果及实际应用

VScode的注释和标题,标签,img的src属性(如何网页上插入图片)(Mac如何开启js控制台)(如何免费复制网页中的文字)

一、注释<!--这是注释-->,在这个<!--内容-->里面的是注释,内容就是你要填写的注释。在windows上查看,你是使用F12,但是mac上(我也不清楚为什么f12不好使,这时候就要按照下面的步骤调出这个界面看这个高级,下面的在菜单栏中显示开发选项,然后我们可以勾选上它。这时候点击这里的JAVAScript控制台

前端Javascript模块化

🎬岸边的风:个人主页🔥个人专栏:《VUE》《javaScript》⛺️生活的理想,就是为了理想的生活!目录引言前端模块化的发展历程1.全局函数式编程2.命名空间模式3.CommonJSrequire函数module.exports4.AMD(AsynchronousModuleDefinition)5.UMD(Un

8天长假快来了,Python分析【去哪儿旅游攻略】数据,制作可视化图表

前言:嗨喽~大家好呀,这里是魔王呐❤~!python更多源码/资料/解答/教程等点击此处跳转文末名片免费获取2023年的中秋节和国庆节即将来临,好消息是,它们将连休8天!!!这个长假为许多人提供了绝佳的休闲机会,让许多人都迫不及待地想要释放他们被压抑已久的旅游热情,所以很多朋友已经开始着手规划他们的旅游行程。今天我们来

基于微信小程序的校园失物招领系统设计与实现(源码+lw+部署文档+讲解等)

前言💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗👇🏻精彩专栏推荐订阅👇🏻2023-2024年最值得选的微信小程序毕业设计选题大全:100个热门选

热文推荐