PyTorch笔记

news/2024/5/7 22:08:22/文章来源:https://blog.csdn.net/MarkAustralia/article/details/129746771

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。

参考:

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

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

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

相关文章

A*算法简介

A*算法是一种启发式的搜索算法, A*算法在某种程度上和广度优先搜索( BFS)、 深度优先搜索( DFS) 类似, 都是按照一定的原则确定如何展开搜索的节点树状结构。 A*可以认为是一种基于“ 优点” 的搜索算法。搜…

值得推荐的 5 大 Android 手机密码解锁器

大多数 Android 用户使用唯一密码来保护他们的手机和重要数据。因此,忘记密码并被锁定在手机之外可能会令人沮丧。在这种情况下,使用安卓手机密码解锁器来解决问题是一个明智的选择。本文将介绍2023 年排名前 5 的 Android 手机密码解锁器。不要错过。 电…

Kubernetes容器运行原理

Kubernetes容器概述from 网络容器能够有效地虚拟化主机操作系统(或内核)并将应用程序的依赖项与同一台机器上运行的其他容器隔离开。在容器出现之前,在同一个虚拟机 (VM) 上部署了多个应用程序,共享依赖项的任何更改都可能导致奇怪…

EMQX Enterprise 新版本发布:新增 Apache IoTDB 支持、HStreamDB 最新版以及 MongoDB 6.0 适配

我们很高兴地宣布:EMQX Enterprise 4.4.15 和 4.4.16 版本现已正式发布! 本次发布增加了 Apache IoTDB 集成支持以满足工业制造海量数据存储与分析的需求,同时对最新版本的 HStreamDB v0.14.0 和 MongoDB(v6.0)进行了…

IOC/DI配置管理第三方bean

IOC/DI配置管理第三方bean1,IOC/DI配置管理第三方bean1.1 案例:数据源对象管理1.1.1 环境准备1.1.2 思路分析1.1.3 实现Druid管理步骤1:导入druid的依赖步骤2:配置第三方bean步骤3:从IOC容器中获取对应的bean对象步骤4:运行程序1.2 加载properties文件1.2.1 第三方b…

花青素类荧光染料Sulfo-Cy3.5 NH2,Sulfo-Cyanine3.5 amine,磺酸基-花青素Cyanine3.5 氨基,可以用来标记蛋白

Sulfo-Cyanine3.5 amine,Sulfo-Cy3.5 NH2,Sulfo-Cyanine3.5 NH2,Sulfo-Cy3.5 amine,磺酸基-花青素Cy3.5 氨基一、产品规格: 1.CAS号:N/A 2.分子式:C44H52K2N4O13S4 3.分子量:1051.36…

如何远程连接服务器

在如今的互联网时代,远程连接服务器已经成为了许多人必不可少的技能。通过远程连接服务器,我们可以随时随地访问和管理远程服务器,而无需亲身前往。那么如何远程连接服务器呢?远程连接服务器注意事项是什么?今天小编就来跟大家分…

不用vdom的lit框架学习3:代码结构初步解析

这是lit框架的系列学习文章,跳转查看其他章节 不用vdom的lit框架学习1:安装和编译不用vdom的lit框架学习2:挠头的web component(兼容性说明,必看)不用vdom的lit框架学习3:代码结构初步解析 在补…

牛客Verilog题目(1)——超前进位加法器

今天起,开始统计一些做的比较难的或者可以扩展知识面的Verilog题目。 第一题来自牛客->verilog快速入门->第12题 4个二进制全加器串联的四位加法器 在此之前需要了解全加器、4个1位二进制全加器串联的四位加法器。再了解为什么要用这种超前进位加法器。’ 全…

APP小程序移动商城系统 助力电商企业拓客引流

近几年电商企业的发展湿透持续旺盛,加上人们线上支付习惯的普及,使网上商城取得了稳健的发展。网上商城系统是在为个人用户和企业用户提供人性化的全方位服务,为用户创造轻松预约的购物环境,满足消费者多样化的购物需求&#xff0…

Microsoft Remote Desktop for Mac(远程桌面连接工具)

Microsoft Remote Desktop for Mac是一款Mac OS平台上的远程桌面控制软件来自微软,你可以通过Microsoft Remote Desktop for mac来控制Windows或者Mac OS设备完成你的工作。microsoft远程桌面为mac译名为微软远程桌面软件,这是一款Mac OS平台上的远程桌面…

OpenAI Translator | 基于ChatGPT API全局翻译润色解析插件

简介 OpenAI Translator,一款基于 ChatGPT API 的划词翻译浏览器插件和跨平台桌面端应用,使用 ChatGPT API 进行划词翻译和文本润色,借助了 ChatGPT 强大的翻译能力,帮助用户更流畅地阅读外语和编辑外语,允许跨 55 种…

Redis简单介绍-安装基本类型及其操作命令

文章目录1. redis网址2. 安装redis3. redis10大类型及操作命令3.1 key操作命令3.1.1 redis-server重启后数据不会消失3.1.2 keys * 显示所有的key3.1.3 exists 判断key是否存在,存在则计数加13.1.4 type 显示出类型3.1.5 del 删除指定key,返回结果为被删…

人工智能会给普通人带来哪些改变

最近人工智能太火了,很多人都听说了,尤其是大语言模型。可以让我们像和真人聊天一样,与AI对话,根据你所问的问题,AI可能像一个老师,像一个老人,像一个智者回答你的几乎所有问题。这也把有些人吓…

[openwrt]network配置生成和下发

配置脚本调用 network的配置处理入口为:/etc/init.d/boot,函数调用: /bin/config_generate脚本内容如下:

SpringCloud搭建微服务之Gateway+Jwt实现统一鉴权

1. 概述 在微服务项目中,需要对整个微服务系统进行权限校验,通常有两种方案,其一是每个微服务各自鉴权,其二是在网关统一鉴权,第二种方案只需要一次鉴权就行,避免了每个微服务重复鉴权的麻烦,本…

服务端测试知识汇总

目录 服务端测试思想 经济学⻆度 ⾦字塔模型 技术⻆度 HTTP协议 三次握⼿ HTTP完整请求 通信模式 URI信息 请求⽅法 请求状态码 请求/响应头 常⽤请求数据格式 COOKIE请求流程 SESSION请求流程 TOKEN请求流程 API测试维度 单接⼝测试 多个接⼝测试 …

【tensorboard】深度学习的日志信息events.out.tfevents文件可视化工具

在用深度学习模型训练完模型后,会有一些events.out.tfevents格式的日志信息文件,如下图: 在这类文件需要用tensorboard进行打开,并且查看训练过程的信息内容。 1. tensorboard安装 pip install tensorboard -i https://pypi.do…

从零开始学Python第06课:循环结构

我们在写程序的时候,极有可能遇到需要重复执行某条指令或某些指令的场景,例如我们需要每隔1秒钟在屏幕上输出一次“hello, world”并持续输出一个小时。如下所示的代码可以完成一次这样的操作,如果要持续输出一个小时,我们就需要把…

shell:简单易明白的变量和引用

目录什么是变量shell的变量类型declare定义变量的类型根据数据类型分类根据作用域分类变量的定义shell 中的引用什么是变量 可以变化的量。本质上讲,变量就是在程序中保存用户数据的一块内存空间,而变量名就是这块内存空间的地址。 shell的变量类型 s…