使用Pytorch的一些小细节(一)
文章目录
- 前言
- 数据结构-张量
- max函数
- 索引函数
- 赋值函数
- 拼接函数
前言
由于不经常动手写代码,所以对于python语言中的常见数据结构的用法也不是很熟悉,对于pytorch中的数据结构就更加不熟悉了。之前的代码基础是基于C语言的,属性都是自己定义,值传递或者引用传递都是自己定义,而在python中就没有区分的这么清楚,所以让我对一些概念或者数据结构用法存在疑惑,尤其是使用pytorch的过程中,所以专门做个笔记。
ChatGPT有句话说的很好,“小心使用,以确保结果符合您的预期。”为了确保结果符合我们心中的预期,所以在编写代码的过程中需要对每个函数的输入与输出进行验证,而在每个函数中我们又使用了别的API函数,层层嵌套,所以我们要想验证一个函数的输入输出符合预期,就需要对输入输出进行验证。每一步都是为了结果符合预期。
数据结构-张量
max函数
torch.max函数对于一个二维张量size=(a,b)的效果为:
torch.max(next_q_values,dim=1)
#返回值
torch.return_types.max(
values=tensor([0.1055, 0.0693, 0.1055, 0.1071, 0.0456, 0.0544, 0.0671, 0.0859, 0.0946,0.0770]),
indices=tensor([1, 1, 1, 1, 1, 1, 1, 1, 1, 1]))
#后面加上索引1
torch.max(next_q_values,dim=1)[1]
#结果:
tensor([1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
也就是说torch.max函数当参数dim为多少时,它的取极大值的过程就是针对这个维度进行的,让其他维度保持不变的情况下,取max,然后让其他维度递增,再取max。
索引函数
对于张量来说,索引加括号与不加括号差别也很大。使用加括号的形式叫做花式索引,花式索引(Fancy Indexing)是一种在NumPy和其他类似的数组库比如Pytorch中常见的索引方式,它允许您使用一个数组来索引另一个数组的元素。常见的索引方式就是给每个维度赋值然后索引D[a,b],花式索引就是在每个维度的位置上,用数组来赋值D[[ ],[ ]],可以把第一个维度当作希望生成的形状,并且把对应元素的行标上去,然后第二个维度的形状不用发生变化,只用把对应元素的列标上去即可,比如说我们想从原始数据中生成一个新的数组尺寸为(2,3),新数组B中各个位置的元素与原数组A的关系为:

那么我们可以使用如下的命令:A[[[2,1,2],[1,0,0]],[[1,1,2],[1,2,1]]]。注意我们的索引第一个维度就是每个元素所对应的行的重新排列,索引的第二个维度就是每个元素所对应的列的重新排列。同时需要注意,这种索引形式得到的值都是相当于值引用。如果我们对索引出来的值进行赋值操作,就会导致原来数组中的元素发生变化,因为它就相当于索引赋值。
提起索引不得不提到Python中臭名昭著的赋值语句,赋值语句时常让我迷惑他究竟是值传递还是引用传递。目前看来只有整数和浮点数数据类型是值传递,其他的一律是引用传递,哪怕是GPT宣称列表也是值传递也是假的,列表也是引用传递。比如:

对于非整数或者浮点数的合成数据类型,就更是引用传递了,哪怕是torch.tensor(1)也是引用传递。

对于Pytorch中的张量数组来说也是这样:
b=torch.tensor([[1.1,2.2,3.3,4.4],[0.1,0.2,0.3,0.4],[-1,-2,-3,-4]])
print(b[0,1].shape)
#结果 torch.Size([])
print(b[[0],[1]].shape)
#结果 torch.Size([1])
print(b[[0,1],[1,0]].shape)
#结果 torch.Size([2])
其实引用传递往往要与原地修改相辅相成,如果两个变量是同一引用,但是其中一个变量修改的时候并不是原地修改,就不会导致另一个变量发生同步变化。所以要想同步改变,我们就要使用原地修改。
原地修改的常见类型有:索引赋值,简写递推(+=、-=、*=、/=)等。
如果我们不希望同步变化,那么我们有两种办法:第一不使用引用,或者说使用引用克隆;第二不使用原地修改,对于指向同一引用的对象,在更新对象的值时,不使用原地修改的函数。第二种方法稍微难做一点,因为我们在pytorch中处理张量数据时,很容易就会对张量进行索引赋值,而这种方式恰恰是会造成原地修改的,也就是会导致同步变化的。所以在保存变量时,尽量保存变量的克隆,这样就会避免同步变化。
在pytorch中不使用引用可以分为两种情况。第一种是不保存梯度的detach()方法,但是数据区共享,所以还是有引用的,只不过没有梯度了;第二种数据区也不共享,梯度也不保存的是clone()方法,数据区不共享,梯度应该也不会受到影响。可以是
赋值函数
赋值函数或者可以叫做索引函数,毕竟是先找到位置才能进行赋值的。对于张量来说,对第一个维度进行索引,就会得到第一个维度所对应的那些数据。如果我们在两个维度都用列表来索引,得到的就是单个元素所拼接的张量
对于一个二维张量size=(a,b),相对其中某些位置上的元素进行赋值的操作为:
target_q_values[range(batch_size),actions]=rewards+0.9*(1-dones)*torch.max(next_q_values,dim=1)[0]
其实为了分清楚究竟是引用传递还是值传递,我们应该用这样的提示词进行搜索:python中数组的原地修改的操作有哪些?python中numpy数组的原地修改的操作有哪些?pytorch的tensor张量的原地修改操作有哪些??
以下是chatGPT的回答:
在PyTorch中,张量(tensor)是核心数据结构,提供了许多原地修改的操作。以下是一些常见的原地修改操作:
-
索引赋值运算:
直接对张量的元素进行赋值操作,会原地修改张量。import torchmy_tensor = torch.tensor([1, 2, 3])my_tensor[0] = 4 # 原地修改,不创建新对象 -
add_()、sub_()等方法:
类似于赋值运算,这些方法在原地执行加法、减法等操作。import torchmy_tensor = torch.tensor([1, 2, 3]) my_tensor.add_(1) # 原地修改,不创建新对象,等价于+= my_tensor +=1 -
mul_()、div_()等方法:
类似于add_(),这些方法在原地执行乘法、除法等操作。import torchmy_tensor = torch.tensor([1, 2, 3]) my_tensor.mul_(2) # 原地修改,不创建新对象 -
zero_()方法:
将张量所有元素设为零。import torchmy_tensor = torch.tensor([1, 2, 3]) my_tensor.zero_() # 将所有元素设为零,原地修改 -
fill_()方法:
将张量所有元素填充为指定值。import torchmy_tensor = torch.tensor([1, 2, 3]) my_tensor.fill_(5) # 将所有元素填充为5,原地修改
这些方法都是在原地修改PyTorch张量,而不是创建新的张量对象。原地操作可以有效地减少内存开销,并提高代码的执行效率。
所以,在代码中,我们需要注意哪些是引用传递对,然后注意引用传递对中变量的运算是不是原地修改,如果不是,就需要再修改。
拼接函数
拼接函数torch.cat作用是把列表list中的张量按照第一个维度拼在一起。不论列表中第一个张量的第一个维度是多少,拼接的时候,总是在第一个张量的第一个维度后拼接,按照顺序,每个张量的第一个维度的值都是累加的。
相关文章:
使用Pytorch的一些小细节(一)
文章目录 前言数据结构-张量max函数索引函数赋值函数拼接函数 前言 由于不经常动手写代码,所以对于python语言中的常见数据结构的用法也不是很熟悉,对于pytorch中的数据结构就更加不熟悉了。之前的代码基础是基于C语言的,属性都是自己定义&a…...
PDF Expert for mac(专业pdf编辑器)苹果电脑
PDF Expert for Mac 是一款功能强大、界面简洁的PDF阅读、编辑和转换工具,为Mac用户提供了全面而便捷的PDF处理体验。无论是日常工作中的文档阅读、标注,还是专业需求下的编辑、转换,PDF Expert 都能满足您的各种需求。 首先,PDF…...
班级新闻管理系统asp.net+sqlserver
班级新闻管理系统 附加功能 新闻图片,点击次数访问自增,每个人都只能增删改查自己发布的新闻,并可以看到所有人发布的新闻 运行前附加数据库.mdf(或sql生成数据库) 主要技术: 基于asp.net架构和sql serve…...
navicat导入.sql文件出现:[ERR] 1067 - Invalid default value for ‘create_date‘
比较老的系统生成的数据库导入5.7时报错[Err] 1067 - Invalid default value for create_time 错误分析 表中的第一个TIMESTAMP列(如果未声明为NULL或显示DEFAULT或ON UPDATE子句)将自动分配DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP属…...
Labview利用声卡捕获波形
一般的计算机上自带的声卡,均既有A/D功能,又有D/A功能,就是一款具备基本配置的数据采集卡,并且技术成熟,性能稳定。 后台如下:...
ElasticSearch7.x - HTTP 操作 - 索引操作
创建索引 对比关系型数据库,创建索引就等同于创建数据库 在 Postman 中,向 ES 服务器发 PUT 请求 :http://192.168.254.101:9200/shopping 说明 {"acknowledged"【响应结果】: true, # true 操作成功"shards_acknowledged"【分片结果】: true, # 分片操…...
Banana Pi BPI-M6(Raspberry Pi 5 替代品)初始设置及固件烧录
Banana Pi BPI-M6:初始设置和镜像烧录 Banana Pi BPI-M6 的首次测试 在上一篇文章中,我比较了Banana Pi BPI-M6和Raspberry Pi 5的硬件特性。两者都拥有出色的硬件技术,在性能方面应该不会有太大的问题。 今天我想测试一下 Banana Pi。作为…...
Ubuntu18.04.6安装qt5.7.1(超级详细教程)
目录 1、下载对应Linux版本的qt 2、安装完qt,可能也要安装下对应的编译工具 1、下载对应Linux版本的qt (1)准备安装的是qt5.7.1:qt-opensource-linux-x64-5.7.1.run (2)在虚拟机进入存放qt安装包的目录…...
进程线程
从Android3.0开始,系统要求网络访问必须在子线程中进行,否则会抛出异常,这么做是为了避免主线程被阻塞而导致ANR,那么网络访问的操作就必须要放到线程中去执行。 进程 进程是操作系统结构的基础,是程序在一个数据集合…...
【ubuntu 快速熟悉】
ubuntu 快速熟悉 2.ubuntu桌面管理器3.ubuntu常见文件夹说明4.ubuntu任务管理器4.1 gnome桌面的任务管理器4.2 实时监控GPU4.3 top 命令 5.ubuntu必备命令5.1 .deb文件5.2 查找命令5.2.1 find文件搜索5.2.2 which查找可执行文件的路径5.2.3 which的进阶,whereis5.2.…...
全局异常处理器(黑马程序员)
定义全局异常处理器非常简单,就是定义一个类,在类上加上一个注解 RestControllerAdvice,加上这个注解就代表我们定义了一个全局异常处理器。 在全局异常处理器当中,需要定义一个方法来捕获异常,在这个方法上需要加上注…...
虹科示波器 | 汽车免拆检测 | 2017款路虎发现车行驶中发动机抖动且加速无力
一、故障现象 一辆2017款路虎发现车,搭载3.0L发动机,累计行驶里程约为3.8万km。车主反映,车辆在行驶过程中突然出现发动机抖动且加速无力的现象,于是请求拖车救援。 二、故障诊断 拖车到店后首先试车,发动机怠速轻微抖…...
数据结构与算法C语言版学习笔记(6)-树、二叉树、赫夫曼树
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、树的定义1.结点的度、树的度2.结点的逻辑关系3.树的深度4.有序树和无序树5.森林 二、树的存储结构(1)双亲表示法(2&…...
Leetcode刷题详解——电话号码的字母组合
1. 题目链接:17. 电话号码的字母组合 2. 题目描述: 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。…...
dream_ready
🧸欢迎来到dream_ready的博客,📜相信您对这篇博客也感兴趣o (ˉ▽ˉ;) Python 语法及入门 (超全超详细) 专为Python零基础 一篇博客让你完全掌握Python语法 路的尽头是什么?这是我年少时常伴在嘴…...
离线视频ocr识别
sudo apt-get install libleptonica-dev libtesseract-dev sudo apt-get install tesseract-ocr-chi-sim python -m pip install video-ocrwindows安装方法: 下载安装 https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-w64-setup-5.3.3.20231005.exe 下…...
双十一流量卡选购指南:不要只看月租,性价比高才是硬道理!
双十一来了,流量卡也推出了不少性价比较高的套餐,为了方便大家选择,这篇文章给大家推荐如何流量卡,希望大家都能够买到合适自己的流量卡,不该花的钱坚决不花! 这篇文章内容较多,请大家耐…...
时序预测 | MATLAB实现WOA-CNN-GRU-Attention时间序列预测(SE注意力机制)
时序预测 | MATLAB实现WOA-CNN-GRU-Attention时间序列预测(SE注意力机制) 目录 时序预测 | MATLAB实现WOA-CNN-GRU-Attention时间序列预测(SE注意力机制)预测效果基本描述模型描述程序设计参考资料 预测效果 基本描述 1.MATLAB实现…...
华为防火墙二层透明模式下双机热备负载分担配置(两端为路由器)
这种模式只做负载分担,不能是主备备份,因为主备备份模式下,备设备会把vlan down掉,如果是主备备份模式,那在主挂后,备的状态在切换过程中先起vlan,再建立ospf邻接,那业务会断线较久&…...
“基于RflySim平台飞控底层算法开发”系列专题培训 (第三期)
>> RflySim平台系列专题培训 RflySim平台是一个生态系统或工具链(官网:https://doc.rflysim.com),发起于北航可靠飞行控制研究组,主要用于遵循基于模型设计的思想进行无人系统的控制和安全测试。本平台选择MATL…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
