【pytorch】函数记录

你好你好!
以下内容仅为当前认识,可能有不足之处,欢迎讨论!


文章目录

  • torch.sum()
  • torch.argmax()
  • torch.nn.Parameter
  • torch.unbind
  • torch.optim.Adam()[^adam]
  • torch.cat
  • torch.unsqueeze()
  • torch.normalize()[^l2]
  • torch.eye
  • torch.mm
  • torch.view
  • torch.masked_select
  • torch.max
  • torch.expand()[^expand]
  • torch.ndimension()
  • torch.range&arange


torch.sum()

torch.sum()维度0,1,2。比如现在有 3 × 2 × 3 3\times\ 2\times3 3× 2×3的张量,理解为3个 2 × 3 2\times3 2×3的矩阵。当dim=0,1,2时分别在哪个维度上相加1?下面是具体的矩阵
[ 1 , 2 , 3 ] [ 4 , 5 , 6 ] [ 1 , 2 , 3 ] [ 4 , 5 , 6 ] [ 1 , 2 , 3 ] [ 4 , 5 , 6 ] [1,2,3]\\ [4,5,6]\\\\ [1,2,3] \\ [4,5,6]\\\\ [1,2,3] \\ [4,5,6]\\\\ [1,2,3][4,5,6][1,2,3][4,5,6][1,2,3][4,5,6]
$$
\begin{bmatrix}
1&2&3
\end{bmatrix}

\begin{bmatrix}
4&5&6
\end{bmatrix}
\begin{bmatrix}
1&2&3
\end{bmatrix}
\begin{bmatrix}
4&5&6
\end{bmatrix}
$$
image-20230826105759041

在哪个维度相加,那个维度就去掉。 3 × 2 × 3 3\times2\times3 3×2×3分别就对应0,1,2三个维度。

  • dim=0,最后计算结果就是 2 × 3 2\times3 2×3。(可视化后按照宽维度相加对应元素)
  • dim=1,最后计算结果就是 3 × 3 3\times3 3×3。(可视化后按照高维度相加对应元素)
  • dim=2,最后计算结果就是 3 × 2 3\times2 3×2。(可视化后按照长维度相加对应元素)

宽和高维度是正面看的,所以不用动。而长维度是横着看,所以最后元素需要向左旋转。(具体计算时理解的,我这么表述可能不清楚)

示例代码

import torch
c = torch.tensor([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])
print(f" c size = {c.size()}")c1=torch.sum(c , dim=0)
print(f" c1 = {c1}\n c1 size = {c1.size()}")c2=torch.sum(c , dim=1)
print(f" c2 = {c2}\n c2 size = {c2.size()}")c3=torch.sum(c , dim=2)
print(f" c3 = {c3}\n c3 size = {c3.size()}")

运行结果如下

image-20230826105628738

torch.argmax()

argmax函数参数dim=0表示从列获取最大值索引,dim=1从行获取最大值索引,dim=-1从最后一个维度获取最大值索引2

举例

import torch
d = torch.tensor([[9,7,6],[4,8,2],[5,10,0]])
print(torch.argmax(d , dim=0))#结果应为9,10,6的所在列的索引==》0,2,0
print(torch.argmax(d , dim=1))#结果应为9,8,10所在行的索引==》0,1,1
print(torch.argmax(d , dim=-1))#结果应为9,8,10所在行的索引==》0,1,1

运行结果

image-20230826153122554

torch.nn.Parameter

参数是张量子类,当与模块S一块使用时,有一个非常特殊的属性——当它们被赋予为模块属性时,它们会自动添加到它的参数列表中,并且会出现在参数迭代器中。分配张量没有像这样的效果,因为可能需要在模型中缓存一些临时状态,比如RNN的上一个隐藏状态。如果没有参数这样的类,那么这些临时类也会被注册。

torch.unbind

移除一个维度,返回元组(该元组包含给定维度上已经没有的所有切片)。

import torch
a = torch.ones((2,3,1))
print(f"a-size = {a.size()}")
e = torch.unbind(a)
print(f"e type is {type(e)} , e = {e}")
print(F"e[0].size() = {e[0].size()}")

运行结果

image-20230828102249004

可以看到将第一个维度移除,默认dim=0,根据张量维度,可以将dim设置为[0,(dim-1)]。

如果原先张量是 3 × 3 3\times3 3×3,移除第一个维度后,就变为3个 1 × 3 1\times3 1×3的张量。

torch.optim.Adam()[^adam]

torch.optim是一个实现了多种优化算法的包,大多数通用的方法都已支持,提供了丰富的接口调用。要使用优化算法,需先构造一个优化器对象Optimizer,用来保存当前状态,并能够根据计算得到的梯度来更新参数。

方式1:给定一个可进行迭代优化的包含所有参数的列表(所有参数必须是变量)。然后可以指定程序优化特定的选项,例如学习速率,权重衰减等。

import torchoptimizer = optim.SGD(model.parameters() , lr =0.01 , momentum = 0.9 )
#model.parameters()表示模型的所有参数,lr是学习率,momentum还不知道是啥。optimizer = optim.Adam([var1 , var2] , lr = 0.0001)

方式2:optimizer支持指定每个参数选项,只需要传递一个可以迭代的dict来替换先前可以迭代的variable。dict的每一项都可以定义为一个单独的参数组(我理解的是字典),参数组用params键来包含属于它的参数列表。其他键应该与optimizer接受的关键字参数相匹配,才能用此组的优化选项。

optim.SGD([
{'params':model.base.parameters()},
{'params':model.classifier.parameters() , 'lr':1e-3}
] , lr = 1e-2 , momentum = 0.9)

如上,model.base.parameters()将使用lr = 1e-2的学习率,model.classifier.parameters()将使用1e-3的学习率,0.9的momentum将作用于所有的parameters。

优化步骤:

优化器实现了step()方法对所有参数进行更新,有两种调用方法。

optimizer.step()这是大多数优化器都支持的简化版本,使用backward()方法计算梯度时会调用它。

for input , target in dataset:optimizer.zero_grad()output = model(input)loss = loss_fn(output , target)loss.backward()optimizer.step()

这只是使用方法,但优化器的具体原理还没搞懂。

torch.cat

连接相同维度的张量。举例

a4=torch.tensor([[1., 1., 1.],[1., 1., 1.]])
b1=torch.tensor([[3., 3., 3.],[3., 3., 3.]])print(F"行(维度为0)连接结果{torch.cat((a4,b1) , dim=0)}")
print("="*100)
print(F"列(维度为1)连接结果{torch.cat((a4,b1),dim =1)}")

image-20230828152853223

torch.unsqueeze()

在原有维度上加个维度。dim可以理解为变换后的位置为1

举例

a4=torch.tensor([[1., 1., 1.],[1., 1., 1.]])
b1=torch.tensor([[3., 3., 3.],[3., 3., 3.]])a4_new = torch.unsqueeze(a4 , dim = 0)
#在新的维度第0个位置为1,所以结果应为1×2×3
b1_new = torch.unsqueeze(b1 , dim = 1)
#在新的维度第1个位置为1,所以结果应为2×1×3
ab_new = torch.unsqueeze(a4 , dim = 2)
#在新的维度第2个位置为1,所以结果应为2×3×1
print(F"\t 0维上新加:{a4_new} \n\t a4_new形状为{a4_new.size()}")
print(F"\n")
print(F"\t 1维上新加:{b1_new} \n\t b1_new形状为{b1_new.size()}")
print(f"\n")
print(F"\t 2维上新加:{ab_new} \n\t ab_new形状为{ab_new.size()}")

结果

image-20230828155346861

dataset & dataloader 详解

https://blog.csdn.net/loveliuzz/article/details/108756253

torch.normalize()[^l2]

L2范数归一化

向量 x ( x 1 , x 2 , . . . , x n ) x(x_1,x_2,...,x_n) x(x1,x2,...,xn)的L2范数定义为: n o r m ( x ) = x 1 2 + x 2 2 + . . . + x n 2 \mathrm{norm}(x)=\sqrt{x_1^2+x_2^2+...+x_n^2} norm(x)=x12+x22+...+xn2 。要使得x归一化到单位L2范数,就是建立一个 x x x x ′ x^{'} x的映射,使得 x ′ x^{'} x的L2范数为1。

x i ′ = x i n o r m ( x ) x_i^{'}=\dfrac{x_i}{\mathrm{norm}(x)} xi=norm(x)xi

举例

x = torch.tensor([[1,2,4] , [3,5,6] , [9, 3, 1]] , dtyp= torch.float)
y = torch.nn.functional.normalize(x , dim = 0)
z = torch.nn.functional.normalize(x , dim = 1)
print(f"y = {y}")
print(f"z = {z}")

image-20230829164152207

dim = 0 ,从列计算。

dim = 1,从行计算。

为什么要进行归一化?归一化有什么好处?

可以提高深度学习模型收敛速度,如果不进行归一化,假设模型接受的输入向量有两个维度x,y,其中x取值[0,1000],y取值[0,10]。这样数据在进行梯度下降计算时梯度对应一个很扁的椭圆形,很容易在垂直等高线的方向上走大量的之字形路线,迭代量大且迭代次数多,造成模型收敛慢[^why l2]。

损失函数是自己写的,既然是自己写的,那怎么求导呢?那怎么反向传播呢?

有训练次数,有自己的函数指导

torch.eye

生成一个二维对角矩阵,参数是 n × m n\times m n×m

举例

mask = torch.eye((3) ,dtype = torch.bool )
print(mask)

结果👇

image-20230828194136736

torch.mm

torch.mm(input , mat2 , * , out = None)-> Tensor

两个矩阵相乘

举例

a = torch.tensor([[1,2,3],[4,5,6]])
b = torch.tensor([[1,2],[3,4],[5,6]])
c = torch.mm(a , b)
print(f"\t c={c}")

image-20230828194809237


torch.view

输入:形状,不知道的维度可以用-1。

返回:一个数据与自张量相同但形状不同的新张量

举例

x = torch.randn(4,4)
print(f" x = {x} \n x.size() = {x.size()}")
y = x.view(-1)
z = x.view(16)
q = x.view(2,-1)
p = x.view(-1,8)
print(f" y = {y} \n y.size() = {y.size()}")
print(f" z = {z} \n z.size() = {z.size()}")
print(f" q = {q} \n q.size() = {q.size()}")
print(f" p = {p} \n p.size() = {p.size()}")

运行结果

image-20230829104612851

torch.masked_select

输入参数:输入张量,布尔值掩码

返回:一个新的1-D张量,该张量根据布尔值掩码对输入张量进行判定,为True则记录,返回之。

举例

x = torch.tensor([[-1,2,-4],[2,-5,8],[-3,6,-9]])
print(f"x = {x}")
print(f"x.size() = {x.size()}")mask = x.ge(0.5)
print(f"mask = {mask}")
print(f"mask.size() = {mask.size()}")y = torch.masked_select(x , mask)
print(f"y = {y}")
print(f"y.size() = y.size()")

运行结果

image-20230829105714672

因为数据总量是不同的,所以不能总是按照自己手动算的结果作为最终的形状输入。这时就需要用到view函数。(2024年1月3日)

torch.max

返回输入张量所有元素的最大值。

举例

x = torch.randn([3,3])
print(f"\tx = {x}")
max = torch.max(x)
print(F"\tmax = {max}")
max2 = x.max(0)
print(f"\tmax2 = {max2}")
max3 = x.max(1)
print(F"\tmax3 = {max3}")

维度为0返回列的最大值,及所在列元素位置的索引

维度为1返回行的最大值,及所在行元素位置的索引

image-20230830112842836


torch.expand()[^expand]

返回新的视图,其中单维尺寸扩展到更大的尺寸。如果参数是-1意味着不更改该维度。

举例,现在有 2 × 3 2\times3 2×3的张量矩阵,现在想将它扩展为 4 × 4 4\times4 4×4的矩阵。显示不可行,需要倍数关系。

a = torch.tensor([[1,3,5],[2,4,5]])
b = a.expand(4,4)
c = a.expand(-1,4)
print(f"\t a = {a}")
print(f"\t b = {b}")
print(f"\t c = {c}")

image-20230901152131551

那现在 2 × 3 → 4 × 6 2\times3\rightarrow4\times6 2×34×6

a = torch.tensor([[1,3,5],[2,4,5]])
b = a.expand(4,6)
c = a.expand(-1,6)
print(f"\t a = {a}")
print(f"\t b = {b}")
print(f"\t c = {c}")

也不行,只能由原先维度为1所在维度进行扩张。其他维度不知道的话可以写成-1。

a = torch.tensor([[1,3,4]])
print(f"\t size of a = {a.size()}\n")
b = a.expand(6,-1)
print(f"\t size of b = {b.size()}\n\t b = {b}")

image-20230901152740363

torch.ndimension()

得到这个矩阵的维度是什么

a = torch.ones((1,2,3))
b = torch.tensor([1,3,3,5])
c = torch.tensor([[1,2,3,4],[5,7,5,3]])
a_dim = a.ndimension()
b_dim = b.ndimension()
c_dim = c.ndimension()
print(f"\t a的形状是{a.size()},a的维度是{a_dim}")
print(F"\t b的形状是{b.size()},b的维度是{b_dim}")
print(F"\t c的形状是{c.size()},c的维度是{c_dim}")

image-20230901154828705

torch.tensor.index_add_()[^index_add]

作用

参数

返回值

torch.to_dense()&sparse_coo_tensor()

作用

参数

返回值

torch.range&arange



以上是我的学习笔记,希望对你有所帮助!
如有不当之处欢迎指出!谢谢!

学吧,学无止境,太深了


  1. https://mathpretty.com/12065.html#%E5%AF%B9%E4%BA%8E%E4%B8%89%E7%BB%B4%E5%90%91%E9%87%8F ↩︎

  2. https://blog.csdn.net/weixin_42494287/article/details/92797061 ↩︎

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

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

相关文章

kubectl使用及源码阅读

目录 概述实践样例yaml 中的必须字段 kubectl 代码原理kubectl 命令行设置pprof 抓取火焰图kubectl 中的 cobra 七大分组命令kubectl createcreateCmd中的builder模式createCmd中的visitor访问者模式外层VisitorFunc分析 结束 概述 k8s 版本 v1.24.16 kubectl的职责 1.主要的…

R语言实现分位数回归和二次分位数回归

大家好,我是带我去滑雪!新的一年,新的气象,在接下来的日子里我将继续和各位小伙伴们分享我在科研道路上,学习的一些知识! 分位数回归和二次分位数回归是统计学中用于分析因变量与自变量之间关系的方法&…

数据结构:链表的冒泡排序

法一:修改指针指向 //法二 void maopao_link(link_p H){if(HNULL){printf("头节点为空\n");return;}if(link_empty(H)){printf("链表为空\n");return;}link_p tailNULL;while(H->next->next!tail){link_p pH;link_p qH->next;while(q…

2022《OpenScene: 3D Scene Understanding with Open Vocabularies》阅读笔记2

A. Implementation Details 3D Distillation. 我们基于PyTorch实现。为了提取,我们使用Adam[26]作为优化器,初始学习率为1e−4,并训练100个epochs。对于MinkowskiNet,我们对ScanNet和Matterport3D实验使用2cm的体素大小,对nuScenes使用5cm的体素尺寸。对于室内数据集,我…

12年高级工程师的“飞升之路”,redis和rabbitmq面试题

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

【管理咨询宝藏资料25】某能源集团五年发展战略报告

本报告首发于公号“管理咨询宝藏”,如需阅读完整版报告内容,请查阅公号“管理咨询宝藏”。 【管理咨询宝藏资料25】某能源集团五年发展战略报告 【关键词】战略规划、五年战略、管理咨询 【文件核心观点】 - LL应以快速做大做强为目标,专注…

laravel8配合jwt

composer 安装包 composer require tymon/jwt-authconfig/app.php 注册服务提供者 providers > [Tymon\JWTAuth\Providers\LaravelServiceProvider::class, ]aliases > [JWTAuth > Tymon\JWTAuth\Facades\JWTAuth::class,JWTFactory > Tymon\JWTAuth\Facades\JWT…

HTTP 的 multipart 类型

上一篇文章讲到 http 的 MIME 类型 http MIME 类型 里有一个 multipart 多部分对象集合类型,这个类型 http 指南里有讲到:MIME 中的 multipart(多部分)电子邮件报文中包含多个报文,它们合在一起作为单一的复杂报文发送…

Rocky Linux 运维工具 systemctl

一、​​systemctl​的简介 ​​systemctl​是用于管理系统服务的命令行工具。​systemctl​命令可以启动、停止、重启或重新加载服务,并管理它们。 二、systemctl​的参数说明 序号参数描述1start启动指定系统服务2stop停止指定系统服务3status显示指定系统服务的…

STM32 +合宙1.54“ 电子墨水屏(e-paper)驱动显示示例

STM32 合宙1.54“ 电子墨水屏(e-paper)驱动显示示例 📍相关篇《Arduino框架下ESP32/ESP8266合宙1.54“ 电子墨水屏(e-paper)驱动显示示例》🔖程序是从GooDisplay品牌和微雪电子下同型号规格墨水屏的示例程序…

Ubuntu Mysql Innodb cluster集群搭建+MaxScale负载均衡(读写分离)

Ubuntu系统版本 20.04.3 LTS (Focal Fossa) 、64位系统。 cat /etc/os-release查看Ubuntu系统是32位还是64位 uname -m如果显示“i686”,则表示安装了32位操作系统。如果显示“x86_64”,则表示安装了64位操作系统。 一、安装MySql 参考: https://blog.csdn.net/qq_3712…

高频面试题整理(一)

文章目录 平台无关性如何实现?JVM如何加载 .class文件?什么是反射?谈谈ClassLoader谈谈类的双亲委派机制类的加载方式Java的内存模型?JVM内存模型-jdk8程序计数器:Java虚拟机栈局部变量表和操作数栈: Java内存模型中堆和栈的区别…

Linux之前后端项目部署与发布

目录 前言 一. Nginx配置安装(自启动) 1.1 一键安装4个依赖 1.2 上传并解压安装包 1.3 安装nginx 1.4 启动Nginx服务 1.5 防火墙规则 1.6 配置开机自启动 1.7 修改/etc/rc.d/rc/local的权限 二. Nginx负载多个tomcat 2.1 准备2个tomcat 2.2 修改第二个…

【Java设计模式】四、适配器模式

文章目录 1、适配器模式2、举例 1、适配器模式 适配器模式Adapter Pattern,是做为两个不兼容的接口之间的桥梁目的是将一个类的接口转换成客户希望的另外一个接口适配器模式可以使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 最后,适配器…

阿里云中小企业扶持权益,助力企业开启智能时代创业新范式

在数字化浪潮的推动下,中小企业正面临着转型升级的重要关口。阿里云深知中小企业的挑战与机遇,特别推出了一系列中小企业扶持权益,旨在帮助企业以更低的成本、更高的效率拥抱云计算,开启智能时代创业的新范式。 一、企业上云权益…

自动驾驶消息传输机制-LCM

需要用到LCM消息通讯,遂研究下。 这里写目录标题 1 LCM简介2. LCM源码分析3 LCM C教程与实例3.1 安装配置及介绍3.2 创建类型定义3.3 初始化LCM3.4 发布publish一个消息3.5 订阅和接收一个消息3.6 LCM进程间通讯3.7 注意事项?3.7.1 当数据结构定义的是数…

SpringMVC 学习(十)之异常处理

目录 1 异常处理介绍 2 通过 SimpleMappingExceptionResolver 实现 3 通过接口 HandlerExceptionResolver 实现 4 通过 ExceptionHandler 注解实现(推荐) 1 异常处理介绍 在 SpringMVC中,异常处理器(Exceptio…

go test用法(获取单元测试覆盖率)

go test用法(获取ut覆盖率) 为了提升系统的稳定性,一般公司都会对代码的单元测试覆盖率有一定要求。下面针对golang自带的测试命令go test做讲解。 1 命令 1.1 go test ./… (运行当前目录及所有子目录下的测试用例) …

13.云原生之常用研发中间件部署

云原生专栏大纲 文章目录 mysql主从集群部署mysql高可用集群高可用互为主从架构互为主从架构如何实现主主复制中若是两台master上同时出现写操作可能会出现的问题该架构是否存在问题? heml部署mysql高可用集群 nacos集群部署官网文档部署nacoshelm部署nacos redis集…

yolov9 瑞芯微芯片rknn部署、地平线芯片Horizon部署、TensorRT部署

特别说明:参考官方开源的yolov9代码、瑞芯微官方文档、地平线的官方文档,如有侵权告知删,谢谢。 模型和完整仿真测试代码,放在github上参考链接 模型和代码。 之前写过yolov8检测、分割、关键点模型的部署的多篇博文,y…