使用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…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...
Vue 3 + WebSocket 实战:公司通知实时推送功能详解
📢 Vue 3 WebSocket 实战:公司通知实时推送功能详解 📌 收藏 点赞 关注,项目中要用到推送功能时就不怕找不到了! 实时通知是企业系统中常见的功能,比如:管理员发布通知后,所有用户…...