PyTorch笔记

Tensor

torch中的Tensor是一种数据结构,使用上与Python的list、numpy的array、ndarray等数据结构类似,可以当成一个多维数组来用。 数学上对张量有特定定义,但通常理解为多维数组即可。

生成Tensor:torch包中提供了直接生成Tensor的函数,如 zeros()、ones()、rand() 等。 还可以用 tensor(data) 函数直接将表示数组的数据(如:list、numpy.ndarray等格式)转换为Tensor。 可通过 from_numpy(data) 函数将numpy.ndarray格式的数据转换为Tensor。 也可生成一个与其他Tensor具有相同dtype和device等属性的Tensor, 使用torch的 ones_like(data) 或 rand_like(data) 等函数,或Tensor的 new_ones() 等函数。

Tensor的属性: shape(返回torch.Size格式)(也可以用size()函数),dtypedevice。

Tensor的操作

        类似numpy的API;改变原数据的原地操作在函数后面加_就可以(一般不建议这么操作)

         • 索引

         • 切片 • join:cat(tensors)或stack(tensors)

         • 加法:add()或+ • 乘法:对元素层面的乘法mul()或*,矩阵乘法matmul()或@

         • resize :

                (1)reshape()或view(),建议使用reshape(),仅使用view()可能会造成Tensor不contiguous的问题

                (2)squeeze()去掉长度为1的维度

                (3)unsqueeze()增加一个维度(长度为1)

                (4)transpose()转置2个维度

5. Tensor.numpy() 可将Tensor转换为numpy数据。 注意这两方向的转换的数据对象都是占用同一储存空间,修改后变化也会体现在另一对象上。

6. item()函数返回仅有一个元素的Tensor的该元素值。

Autograd

        torch.autograd 是PyTorch提供的自动求导包,神经网络由权重、偏置等参数决定的函数构成,这些参数在PyTorch中都储存在 Tensor 里,神经网络的训练包括前向传播和反向传播两部分,前向传播就是用函数计算预测值,反向传播通过预测值产生的 error/loss 更新参数(通过梯度下降的方式)。

        神经网络的一轮训练:

                前向传播:prediction = model(data)

                反向传播:

                (1)计算loss

                (2)loss.backward()(autograd会在这一步计算参数的梯度,存在相应参数Tensor的grad属性中)

                (3)更新参数

                      1)加载optimizer(通过torch.optim)

                      2)optimizer.step() 使用梯度下降更新参数(梯度来源自参数的grad属性)

        Tensor的requires_grad属性设为False,可以将其排除在DAG之外,autograd就不会计算它的梯度。在神经网络中,不需要计算梯度的参数叫frozen parameters。可以冻结不需要知道梯度的参数(节省计算资源),也可以在微调预训练模型时使用(此时往往冻结绝大多数参数,仅调整classifier layer参数,以在新标签上做预测),类似功能也用于 torch.no_grad() 的实现。

Neutral Network

  • 神经网络可以通过torch.nn包搭建(torch.nn 预定义的层调用 torch.nn.functional包的函数)
  • nn.Module包含了网络层
  • forward(input)方法返回输出结果

 网络训练流程:

        (1)前向传播

        (2)计算loss

        (3)计算梯度

        (4)使用梯度下降法更新参数

        模型的可学习参数存储在model.parameters()中,其返回值是一个迭代器,包含模型及其所有子模型的参数。

定义网络:只需要定义forward() 方法,backward()方法会自动定义(用 autograd),在forward()方法中可以进行任何 Tensor 操作。

        前向传播:out = net(input)

        反向传播:先将参数梯度缓冲池清零(否则梯度会累加),再反向传播(此处使用一个随机矩阵),model.zero_grad(),out.backward(torch.randn(1, 10)),如果有计算出损失函数,上一行代码应为:loss.backward()

        注意:torch.nn只支持mini-batch,如果只有一个输入数据可用 input.unsqueeze(0) 创造一个伪batch维度。

        损失函数torch.nn包中定义的损失函数文档:Page Redirection

                以MSELoss为例:criterion = nn.MSELoss(),loss = criterion(output, target)

                        得到的loss,其grad_fn组成的DAG:

调用loss.backward()后,所有张量的梯度都会得到更新:

print(loss.grad_fn)  # MSELoss
print(loss.grad_fn.next_functions[0][0])  # Linear
print(loss.grad_fn.next_functions[0][0].next_functions[0][0])  # ReLU

多GPU并行训练

设置使用GPU:device = 'cuda' if torch.cuda.is_avaiable() else 'cpu'

DataParallel 和 DistributedDataParallel 两个类可用于GPU并行;

        以 DataParallel 为例:model = nn.DataParallel(model)

        在单卡上写好的 model 直接调用,别的都跟单卡形式一样,程序会自动把数据拆分放到所有已知的GPU上来运行,数据是直接从第一维拆开平均放到各个GPU上,相当于每个GPU放 batch_size / gpu_num 个样本。设置已知的GPU,可以在运行代码的 python 加上 CUDA_VISIBLE_DEVICES 参数,CUDA_VISIBLE_DEVICES=0,1,2,3 python example.py,如果要使用nohup的话,参数要加在nohup的前面,CUDA_VISIBLE_DEVICES=0,1,2,3 nohup python -u example.py >> nohup_output.log 2;如果不设置则默认为所有GPU,对GPU数量计数:torch.cuda.device_count() 代码。直接用 DataParallel 可能导致各卡空间不均衡的问题,建议使用 DistributedDataParallel。

Torch.squeeze()

Squeeze() 中如果没有指定删除的维度,则会将维度为 1 的都删除。
arr = np.array([1, 2, 3])
arr = arr.reshape(-1, 3, 1)
ta = torch.tensor(arr)ta = torch.tensor(arr)
ta.squeeze() -> tensor([1, 2, 3], dtype=torch.int32)
ta.squeeze(-1) -> tensor([[1, 2, 3]], dtype=torch.int32)

网络报错

RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: [torch.FloatTensor [8, 250, 7]], which is output 0 of ReluBackward0, is at version 1; expected version 0 instead.

可使用下面的方法追踪问题:

import torch.autograd as autograd
# set anomaly detection mode
autograd.set_detect_anomaly(True)

需要更新的参数被原地操作更改了,可能是以下几种情况导致
1)找到网络模型中的 inplace 操作,将inplace=True改成 inplace=False,例如torch.nn.ReLU(inplace=False)

2)将代码中的“a+=b”之类的操作改为“c = a + b”,a=b改成a=ab,a/=b改成a=a/b。

3)训练代码的optimizer.step()函数放到loss.backward()后面

4)pytorch降版本到1.4或1.5

参考:

60分钟闪击速成PyTorch(Deep Learning with PyTorch: A 60 Minute Blitz)学习笔记-阿里云开发者社区

Note-of-PyTorch-60-Minutes-Tutorial/tensor_tutorial.ipynb at master · PolarisRisingWar/Note-of-PyTorch-60-Minutes-Tutorial · GitHub

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【微信小程序】初识微信小程序组件

作者简介:一名C站萌新,前来进行小程序的前进之路博主主页:大熊李子🐻 一、组件的创建与引用 1.1 创建组件 在项目的根目录中,鼠标右键,创建 components -> test 文件夹在新建的 components -> test…

十分钟验证一个轻量化车联网解决方案

智能网联汽车在车联网的应用上,通常是以智能传感器、物联网、GIS技术为基础,结合大数据、人工智能技术,通过OT(Operation tecnology)和IT(information tecnology)融合的方式,实现智能…

2.3 连续性随机变量

思维导图: 学习目标: 我会按照以下步骤学习连续型随机变量: 复习概率论的基础知识,包括概率、期望、方差等概念和公式,以及离散型随机变量的概率分布函数和概率质量函数的概念和性质。 学习连续型随机变量的概念和性…

学生信息管理系统(student information manage system, SIMS)

一、前言 本项目为学生信息管理系统,使用C语言编写。 ★★★项目详见本人gitee仓库,地址 https://gitee.com/omnipotent-brother/student-information-manage-system.git ★★★ 二、项目介绍 开发环境: 基于windows 11系统下的Visual Studio…

YC-A11(原创)基于springboot,vue网上商城

绪论 课题的开发背景 随着计算机和网络的快速发展,并且越来越普及,互联网日益成为人们收集信息常用渠道,电子商务开始流行,一种全新的理念不断形成并且快速发展,像国内电商巨头淘宝、京东、苏宁易购、唯品会等电商平台…

【JavaScript】2.JavaScript函数

JavaScript 函数 1. 函数的概念 函数&#xff1a;就是封装了一段可被重复调用执行的代码块 通过此代码块可以实现大量代码的重复使用 2. 函数的使用 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta na…

前馈PID控制(热交换器/反应釜温度控制)

如何利用PID进行温度控制请参看下面博客文章: 博途PID 1200/1500PLC PID_Compact比例作用权重b微分作用权重c解读(PI-D控制器 I-PD控制器)_RXXW_Dor的博客-CSDN博客很多人会问PLC自带的PID指令和我们自己设计的PID有什么区别,这个问题要看你和什么PID控制器作对比,PID负反…

NDK RTMP直播客户端二

在之前完成的实战项目【FFmpeg音视频播放器】属于拉流范畴&#xff0c;接下来将完成推流工作&#xff0c;通过RTMP实现推流&#xff0c;即直播客户端。简单的说&#xff0c;就是将手机采集的音频数据和视频数据&#xff0c;推到服务器端。 接下来的RTMP直播客户端系列&#xff…

Redis用于全局ID生成器、分布式锁的解决方案

全局ID生成器 每个店铺都可以发布优惠卷 当用户抢购时&#xff0c;就会生成订单并保存到tb_voucher_order这张表中&#xff0c;而订单表如果使用数据库自增id就存在一些问题&#xff1a; 1.id的规律性太明显 2.受单表数据量的限制 全局ID生成器&#xff0c;是一种在分布式系…

Atlassian后Server时代 | Server版vs.数据中心版,二者的区别在哪里?

2024年2月&#xff0c;也就是一年不到&#xff0c;Atlassian将终止对Server产品及插件的所有支持。 此公告发布后&#xff0c;许多用户需要了解怎样的前进方向才是最适合企业的。为此&#xff0c;Atlassian提供了本地部署的数据中心&#xff08;Data Center&#xff09;版以及云…

线段树笔记草稿

一个左节点u << 1和右节点u << 1 | 1 的证明 区间修改部分 1.批量等值修改 前提条件 是要区间修改&#xff0c;区间查询&#xff0c;且修改操作修改的值是相同的 情景 一般是要对一个数组执行k次操作&#xff0c;每次改变其中一个区间内所有元素的值&#x…

ChatGPT文本框再次升级,打造出新型操作系统

在ChatGPT到来之前&#xff0c;没有谁能够预见。但是&#xff0c;它最终还是来了&#xff0c;并引起了不小的轰动&#xff0c;甚至有可能颠覆整个行业。 从某种程度上说&#xff0c;ChatGPT可能是历史上增长最快的应用程序&#xff0c;仅在两个多月就拥有了1亿多活跃用户&…

Adaptive Weight Assignment Scheme For Multi-task Learning

Adaptive Weight Assignment Scheme For Multi-task Learning 题目Adaptive Weight Assignment Scheme For Multi-task Learning译题用于多任务学习的自适应权重分配方案时间2022年期刊/会议IAES International Journal of Artificial Intelligence (IJ-AI) 摘要&#xff1a;如…

【AutoGPT】你自己运行,我先睡了—— ChatGPT过时了吗?

系列文章目录 【AI绘画】Midjourney和Stable Diffusion教程_山楂山楂丸的博客-CSDN博客 目录 系列文章目录 前言 一、AutoGPT是什么&#xff1f; 二、AutoGPT带来的利弊 三、AutoGPT和ChatGPT区别 四、未来 总结 前言 ChatGPT是否过时&#xff1f;AutoGPT的兴起&#…

MappingGenerator PRO 2023.3 Visual Studio 2019-2022

您的私人编码助手 MappingGenerator 最初是作为 AutoMapper 的设计时替代品创建的。现在它正在演变为编码助手&#xff0c;您可以将最平凡的编码任务委派给它&#xff1a; 生成映射生成显式转换实施克隆生成投影表达式脚手架方法调用脚手架对象创建清理方法调用方便ILogger的使…

ChatGPT风口下的中外“狂飙”,一文看懂微软、谷歌、百度、腾讯、华为、字节跳动们在做什么?

毫无疑问&#xff0c;ChatGPT正成为搅动市场情绪的buzzword。 历史经历过无线电&#xff0c;半导体&#xff0c;计算机&#xff0c;移动通讯&#xff0c;互联网&#xff0c;移动互联网&#xff0c;社交媒体&#xff0c;云计算等多个时代&#xff0c;产业界也一直在寻找Next Bi…

Golang每日一练(leetDay0031)

目录 91. 解码方法 Decode Ways &#x1f31f;&#x1f31f; 92. 反转链表 II Reverse Linked List II &#x1f31f;&#x1f31f; 93. 复原 IP 地址 Restore IP Addresses &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练…

【JVM】JVM之执行引擎

文章目录一、前言二、名词解释机器码指令指令集汇编语言高级语言字节码虚拟机&物理机前端编译器&后端编译器三、JVM之执行引擎执行引擎是如何工作的&#xff1f;解释器即时编译器&#xff08;JIT&#xff09;分层编译策略虚拟机执行模式热点代码&探测方式1&#xf…

如何在 Linux 中使用 Chage 命令,修改Linux系统用户密码更改策略

Chage是一个用于修改Linux系统用户密码更改策略的命令行工具。在本文中&#xff0c;我们将介绍如何在Linux系统中使用Chage命令。 检查用户密码过期信息 使用Chage命令可以检查用户密码更改策略和过期信息。要检查特定用户的密码过期信息&#xff0c;可以使用以下命令&#x…

PPT NO.1【用ppt如何做一张海报+字体】

PPT做得好的人&#xff0c;一定是站在观众的角度思考的人。 1、设置幻灯片尺寸大小&#xff1a; 设置完成后如下&#xff1a; 2、加载一张自己喜欢的图片进来&#xff1a;【图片越高清越好】 将图片铺满空白的地方&#xff0c;调整好自己喜欢的区域&#xff1a; 做裁剪&#xf…