「日拱一码」016 深度学习常用库——PyTorch

目录

张量操作

创建张量:

torch.tensor() :直接从数据创建张量

torch.zeros() :创建全零张量

torch.ones() :创建全一张量

torch.randn() :创建正态分布随机张量

torch.arange() :创建等差序列张量

torch.linspace() :创建线性间隔张量

张量属性:

tensor.shape :获取张量的形状

tensor.dtype :获取张量的数据类型

tensor.device :获取张量所在的设备

张量转换:

tensor.to() :将张量转换到指定设备或数据类型

tensor.numpy() :将张量转换为NumPy数组

torch.from_numpy() :从NumPy数组创建张量

 张量操作:

数学运算

广播机制

索引和切片

重塑和转置

自动求导

自动求导机制

定义新自动求导函数

神经网络构建

torch.nn 模块:

层定义

激活函数

损失函数

优化器

模型定义:

数据处理

数据集

数据加载器

模型保存与加载

保存模型

torch.save(model.state_dict(), 'model.pth')

torch.save(model, 'model.pth')

加载模型

对于只保存参数的方式,需要先定义相同的模型结构,然后使用 model.load_state_dict(torch.load('model.pth')) 加载模型参数

对于保存整个模型的方式,可以直接使用 torch.load('model.pth') 加载模型,然后将其分配给一个变量即可使用

分布式训练

多GPU训练

分布式数据加载

其他功能

设备管理

随机数种子设置

模型推理


PyTorch是一个功能强大的深度学习库,以下是其常用方法功能的分类介绍:

张量操作

创建张量:

  • torch.tensor() :直接从数据创建张量
  • torch.zeros() :创建全零张量
  • torch.ones() :创建全一张量
  • torch.randn() :创建正态分布随机张量
  • torch.arange() :创建等差序列张量
  • torch.linspace() :创建线性间隔张量
## 张量操作
# 创建张量
import torch# 创建张量
tensor_from_data = torch.tensor([1, 2, 3])
zeros_tensor = torch.zeros((3, 3))
ones_tensor = torch.ones((2, 2))
randn_tensor = torch.randn((3, 3))
arange_tensor = torch.arange(0, 10)
linspace_tensor = torch.linspace(0, 10, steps=5)print(tensor_from_data)  # tensor([1, 2, 3])
print(zeros_tensor)
# tensor([[0., 0., 0.],
#         [0., 0., 0.],
#         [0., 0., 0.]])print(ones_tensor)
# tensor([[1., 1.],
#         [1., 1.]])print(randn_tensor)
# tensor([[ 0.9779,  1.8636, -0.8193],
#         [-0.8590,  0.4308, -0.2886],
#         [-1.1653,  0.4701, -1.0421]])print(arange_tensor)  # tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print(linspace_tensor)  #  tensor([ 0.0000,  2.5000,  5.0000,  7.5000, 10.0000])

张量属性:

  • tensor.shape :获取张量的形状
  • tensor.dtype :获取张量的数据类型
  • tensor.device :获取张量所在的设备
# 张量属性
print(tensor_from_data.shape)  # 输出:torch.Size([3])
print(zeros_tensor.dtype)      # 输出:torch.float32
print(ones_tensor.device)      # 输出:cpu

张量转换:

  • tensor.to() :将张量转换到指定设备或数据类型
  • tensor.numpy() :将张量转换为NumPy数组
  • torch.from_numpy() :从NumPy数组创建张量
# 张量转换
tensor_to_cpu = tensor_from_data.to('cpu')
print(tensor_to_cpu)  # tensor([1, 2, 3])tensor_to_float = tensor_from_data.to(torch.float32)
print(tensor_to_float)  # tensor([1., 2., 3.])numpy_array = tensor_from_data.numpy()
print(numpy_array)  # [1 2 3]tensor_from_numpy = torch.from_numpy(numpy_array)
print(tensor_from_numpy)  # tensor([1, 2, 3])

 张量操作:

  • 数学运算

支持加法 tensor1 + tensor2 、减法 tensor1 - tensor2 、乘法 tensor1 * tensor2 、除法 tensor1 / tensor2 等逐元素运算,以及矩阵乘法 torch.matmul(tensor1, tensor2) 

  • 广播机制

在进行张量运算时,会自动扩展较小张量的维度以匹配较大张量的维度,从而实现更灵活的运算

  • 索引和切片

与NumPy类似,可以通过索引和切片操作来访问张量的特定元素或子张量

  • 重塑和转置

tensor.reshape() 可以改变张量的形状, tensor.transpose() 可以对张量进行转置操作

# 张量操作
tensor1 = torch.tensor([1, 2, 3])
tensor2 = torch.tensor([4, 5, 6])
add_tensor = tensor1 + tensor2  # 加法
print(add_tensor)  # tensor([5, 7, 9])mul_tensor = tensor1 * tensor2  # 乘法
print(mul_tensor)  # tensor([ 4, 10, 18])matmul_tensor = torch.matmul(tensor1.unsqueeze(0), tensor2.unsqueeze(1))  # 矩阵乘法
print(matmul_tensor)  # tensor([[32]])reshaped_tensor = tensor_from_data.reshape((1, 3))  # 重塑
print(reshaped_tensor)  # tensor([[1, 2, 3]])transposed_tensor = tensor_from_data.reshape((3, 1)).transpose(0, 1)  # 转置
print(transposed_tensor)  # tensor([[1, 2, 3]])

自动求导

  • 自动求导机制

PyTorch的 autograd 模块能够自动计算梯度,这对于神经网络的反向传播至关重要。当创建张量时,设置 requires_grad=True ,则该张量的所有操作都会被跟踪,以便后续计算梯度

## 自动求导x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
y = x * x
y.sum().backward()  # 反向传播
print(x.grad)  # 输出梯度 [2., 4., 6.]
  • 定义新自动求导函数

可以通过继承 torch.autograd.Function 类并实现 forward 和 backward 方法来定义新的自动求导函数,从而实现自定义的梯度计算逻辑

# 定义新自动求导函数
class CustomReLU(torch.autograd.Function):@staticmethod  # 表示这是一个静态方法,不需要实例化类就可以调用def forward(ctx, input):ctx.save_for_backward(input)  # 保存输入张量,以便在反向传播时使用return torch.relu(input)  # 前向传播:应用 ReLU 激活函数@staticmethoddef backward(ctx, grad_output):input, = ctx.saved_tensors  # 获取保存的输入张量grad_input = grad_output.clone()  # 创建一个与 grad_output 形状相同的张量grad_input[input < 0] = 0  # 对于输入小于0的部分,梯度为0return grad_input  # 返回梯度custom_relu = CustomReLU.apply
x = torch.tensor([-1.0, 2.0, 3.0], requires_grad=True)
y = custom_relu(x)
y.sum().backward()
print(x.grad)  # 输出梯度 [0., 1., 1.]

神经网络构建

torch.nn 模块:

  • 层定义

提供了各种神经网络层的实现如 nn.Linear 定义全连接层, nn.Conv2d 定义二维卷积层, nn.BatchNorm2d 定义二维批量归一化层等

  • 激活函数

包括 torch.relu 、 torch.sigmoid 、 torch.tanh 等常用的激活函数

  • 损失函数

提供了多种损失函数,如 nn.MSELoss 用于均方误差损失, nn.CrossEntropyLoss 用于分类任务的交叉熵损失, nn.BCELoss 用于二分类任务的二元交叉熵损失等

  • 优化器

实现了多种优化算法,如 torch.optim.SGD 是随机梯度下降优化器, torch.optim.Adam 是Adam优化器等,用于更新网络参数

模型定义:

通过继承 torch.nn.Module 类来定义自己的神经网络模型,在 __init__ 方法中定义网络的层,在 forward 方法中定义数据在网络中的前向传播过程

## 神经网络构建import torch.nn as nn
import torch.optim as optim# 定义模型
class MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()self.fc1 = nn.Linear(10, 5)self.relu = nn.ReLU()self.fc2 = nn.Linear(5, 2)def forward(self, x):x = self.fc1(x)x = self.relu(x)x = self.fc2(x)return xmodel = MyModel()# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)# 模拟训练
inputs = torch.randn(4, 10)
labels = torch.tensor([0, 1, 0, 1])optimizer.zero_grad()  # 清空梯度
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()  # 反向传播
optimizer.step()  # 更新参数print(criterion(outputs, labels))  # tensor(0.6918, grad_fn=<NllLossBackward0>)

数据处理

  • 数据集

 torch.utils.data.Dataset 是一个抽象类,用于表示数据集,用户可以自定义数据集类,通过重写 __getitem__ 和 __len__ 方法来实现对数据的访问和获取数据集的大小

  • 数据加载器

torch.utils.data.DataLoader 是一个可迭代对象,它封装了数据集,并提供了批量加载、打乱数据、多线程数据加载等功能,方便在训练过程中高效地获取数据

## 数据处理from torch.utils.data import Dataset, DataLoader# 自定义数据集
class MyDataset(Dataset):def __init__(self, data, labels):self.data = dataself.labels = labelsdef __getitem__(self, index):return self.data[index], self.labels[index]def __len__(self):return len(self.data)data = torch.randn(100, 10)
labels = torch.randint(0, 2, (100,))
dataset = MyDataset(data, labels)
dataloader = DataLoader(dataset, batch_size=10, shuffle=True)# 使用数据加载器
for inputs, labels in dataloader:print(inputs.shape, labels.shape)   # torch.Size([10, 10])  torch.Size([10])# torch.Size([10, 10])  torch.Size([10])# torch.Size([10, 10])  torch.Size([10])# torch.Size([10, 10])  torch.Size([10])# torch.Size([10, 10])  torch.Size([10])# torch.Size([10, 10])  torch.Size([10])# torch.Size([10, 10])  torch.Size([10])# torch.Size([10, 10])  torch.Size([10])# torch.Size([10, 10])  torch.Size([10])# torch.Size([10, 10])  torch.Size([10])

模型保存与加载

保存模型

  • torch.save(model.state_dict(), 'model.pth')

只保存模型的参数,这种方式保存的文件较小,且在加载模型时需要先定义相同的模型结构

  • torch.save(model, 'model.pth')

保存整个模型,包括模型的结构和参数,这种方式保存的文件较大,但加载时不需要定义模型结构

## 数据保存与加载# 保存模型
torch.save(model.state_dict(), 'model.pth')  # 保存参数
torch.save(model, 'model.pth')  # 保存整个模型

加载模型

  • 对于只保存参数的方式,需要先定义相同的模型结构,然后使用 model.load_state_dict(torch.load('model.pth')) 加载模型参数
  • 对于保存整个模型的方式,可以直接使用 torch.load('model.pth') 加载模型,然后将其分配给一个变量即可使用
# 加载模型
model = MyModel()
model.load_state_dict(torch.load('model.pth'))  # 加载参数
model = torch.load('model.pth')  # 加载整个模型

分布式训练

  • 多GPU训练

PyTorch提供了 torch.nn.DataParallel 和 torch.nn.parallel.DistributedDataParallel 等模块,用于在多GPU环境下进行模型训练,可以显著提高训练速度

  • 分布式数据加载

在分布式训练中, torch.utils.data.distributed.DistributedSampler 可以根据进程数和进程编号对数据集进行分片,确保每个进程加载的数据是不同的,从而实现数据的分布式加载

## 分布式训练import torch.distributed as dist
import torch.nn.parallel# 初始化分布式环境
dist.init_process_group(backend='nccl', init_method='env://')# 多GPU训练
model = MyModel()
model = torch.nn.DataParallel(model)
# model = torch.nn.parallel.DistributedDataParallel(model)# 分布式数据加载
sampler = torch.utils.data.distributed.DistributedSampler(dataset)
dataloader = DataLoader(dataset, batch_size=10, sampler=sampler)

其他功能

  • 设备管理

可以通过 torch.device 对象来指定张量和模型所在的设备,如 torch.device('cuda:0') 表示使用第一块GPU, torch.device('cpu') 表示使用CPU

  • 随机数种子设置

使用 torch.manual_seed(seed) 可以设置随机数种子,确保每次运行代码时生成的随机数是相同的,这对于实验的可重复性非常重要

  • 模型推理

在模型推理阶段,可以使用 model.eval() 将模型切换到评估模式,这会关闭 Dropout 和 BatchNorm 等层的训练特性,以确保模型在推理时的行为是正确的

## 其他功能# 设备管理
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
tensor = torch.tensor([1, 2, 3], device=device)# 随机数种子设置
torch.manual_seed(42)
random_tensor = torch.randn((3, 3))# 模型推理
model.eval()  # 切换到评估模式
with torch.no_grad():  # 关闭梯度计算outputs = model(inputs)

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

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

相关文章

【Qt】QStringLiteral 介绍

QStringLiteral 介绍 QStringLiteral 是 Qt 框架中提供的一个宏&#xff0c;用于在编译时从字符串字面量创建 QString 对象&#xff0c;具有高效和零内存分配的特点。 主要特点 编译时转换&#xff1a;将字符串字面量在编译时转换为 QString 数据&#xff0c;而不是运行时。…

UI前端与数字孪生结合实践探索:智慧物流的货物追踪与配送优化

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!一、引言&#xff1a;数字孪生重构智慧物流的技术范式在物流行业数字化转型的浪潮中&#xff0…

Java创建型模式---工厂模式

工厂模式基础概念 工厂模式是一种创建型设计模式&#xff0c;其核心思想是将对象的创建和使用分离。通过使用工厂模式&#xff0c;可以将对象创建逻辑集中管理&#xff0c;提高代码的可维护性和可扩展性。在 Java 中&#xff0c;工厂模式主要分为三种类型&#xff1a; 简单工…

分布式定时任务:xxl-job

基础 XXL - Job采用的是调度中心&#xff08;Scheduler&#xff09;与执行器&#xff08;Executor&#xff09;分离的架构设计&#xff0c;这种设计带来了诸多优势&#xff0c;比如高可用性、可扩展性以及便于分布式部署等。 1. 调度中心&#xff08;XXL - Job Admin&#xf…

易语言实现钉钉PC端高频率链接批量打开系统

易语言实现钉钉PC端高频率链接批量打开系统 一、需求分析与技术方案 核心需求: 在钉钉PC端私聊消息中嵌入特殊格式链接用户点击后通过自定义协议唤醒本地程序支持每分钟处理10万次请求的批量操作实现链接的批量生成和管理技术方案: #mermaid-svg-AYoMWYQQf71dlyEF {font-fa…

MyBatis如何实现动态数据源切换?

大家好&#xff0c;我是锋哥。今天分享关于【MyBatis如何实现动态数据源切换&#xff1f;】面试题。希望对大家有帮助&#xff1b; MyBatis如何实现动态数据源切换&#xff1f; 超硬核AI学习资料&#xff0c;现在永久免费了&#xff01; 在MyBatis中实现动态数据源切换&#…

实践篇:14-构建 Node.js 应用程序镜像

背景介绍 Node.js是一个基于 Chrome V8 引擎的 JavaScript 运行时环境&#xff0c;以其事件驱动、非阻塞 I/O 模型而闻名&#xff0c;广泛用于构建后端服务和前端应用。 Node.js 的特点使其非常适合容器化部署&#xff1a; 轻量级运行时&#xff1a;相比传统后端语言&#xf…

Spring Cloud 微服务(链路追踪与日志聚合)

&#x1f4cc; 摘要 在微服务架构中&#xff0c;随着服务数量的增加和调用关系的复杂化&#xff0c;传统的日志记录方式已经无法满足对系统运行状态的全面掌控。如何快速定位异常请求、分析服务调用耗时、追踪完整链路成为运维和开发人员面临的核心挑战。 为此&#xff0c;Sp…

PADS交互式布局

PADS的交互式布局通过原理图与PCB的双向联动大幅提升设计效率。在原理图中框选电路模块时&#xff0c;PCB视图将自动高亮对应元件组并生成可移动簇&#xff0c;拖动时保持模块内部相对位置不变。布局过程中启用实时推挤功能&#xff08;Placement Shoving&#xff09;&#xff…

类图+案例+代码详解:软件设计模式----原型模式

5、原型模式 通过复制现有对象来创建新对象&#xff0c;避免从零开始构建&#xff0c;就像 “复印文件” 一样。 克隆的核心是复用现有对象状态 用 克隆熊猫 举例&#xff0c;秒懂原理 假设你有一只熊猫对象&#xff08;属性&#xff1a;名字、年龄、毛色&#xff09;&#…

Python-FAQ-__name__、__main__

1 需求 2 接口 3 示例 4 参考资料 在 Python 中&#xff0c;像 __name__ 这样的双下划线属性&#xff08;也称为 "dunder" 属性&#xff0c;即 "double underscore" 的缩写&#xff09;是 Python 的特殊属性或方法&#xff0c;它们为类、对象或模块提供了…

Adobe高阶技巧与设计师创意思维的进阶指南

作为一名在全球设计圈摸爬滚打了十年的职业设计师&#xff0c;我深知创意与技术的结合是点燃灵感的火花。凭借英国Parvis School of Economics and Music大学提供的Adobe正版教育订阅&#xff0c;我得以在设计之路上不断探索与突破。今天&#xff0c;我想以轻松实用的口吻&…

音视频会议服务搭建(设计方案-Go服务端API业务逻辑流程图)-04

前言 这一篇是 关于 Go服务端相关的音视频会议的接口API业务逻辑流程图肯定是不能完全复用到你的项目中去的&#xff0c;但是希望对你有一些参考性的帮助嗯&#xff0c;我也是在不断的进行完善和优化&#xff0c;并不是最终的结构&#xff0c;先定好大方向&#xff0c;然后不断…

C++ Qt Widget绘图画布缩放与平移:实现CAD级交互体验

在图形应用程序开发中&#xff0c;实现流畅的缩放和平移功能是创建专业级绘图工具的基础。本文将深入探讨如何在Qt Widget中实现CAD级别的交互体验&#xff0c;包括视图变换、坐标系统管理以及交互功能实现。核心概念&#xff1a;视图变换与坐标系统 在图形应用中&#xff0c;我…

Paimon 位图索引解析:高效等值查询的秘密( Bit-Sliced Index)

BitmapFileIndexBitmapFileIndex 这个类 是 Paimon 中一个非常重要的索引类型&#xff0c;它使用位图&#xff08;Bitmap&#xff09;来精确定位数据&#xff0c;尤其擅长处理低基数&#xff08;low-cardinality&#xff09;列的等值查询。BitmapFileIndex 实现了 FileIndexer …

S7-1200 CPU 与 S7-200 CPU S7通信(S7-1200 作为服务器

7-1200 CPU 与 S7-200 CPU S7通信&#xff08;S7-1200 作为服务器&#xff09; S7-1200 CPU 与 S7-200 CPU 之间的通信只能通过 S7 通信来实现&#xff0c;因为 S7-200 的以太网模块只支持S7 通信。当S7-200作为客户端&#xff0c;S7-1200作为服务器&#xff0c;需在客户端单边…

pyspark大规模数据加解密优化实践

假如有1亿行数据 方法1 spark udf解密 from pyspark.sql import SparkSession import pyspark.sql.functions as F from pyDes import * import binasciisparkSparkSession.builder.getOrCreate()def dec_fun(text):key triple_des(b"HHHHHHHHHHHHHHHHHHHHHHHH", CB…

华为云Flexus+DeepSeek征文|华为云ECS与CCE:从介绍到架构部署·仅需要此文足矣

前引&#xff1a;当今的企业面临着前所未有的技术挑战&#xff1a;如何构建既安全又高效、既灵活又可靠的云服务架构&#xff1f;如何有效整合人工智能技术&#xff0c;打造智能化的运维和服务体系&#xff1f;这些问题的答案&#xff0c;正在悄然改变着企业级IT基础设施的生态…

DAY 50 预训练模型+CBAM模块

浙大疏锦行https://blog.csdn.net/weixin_45655710 知识点回顾&#xff1a; resnet结构解析CBAM放置位置的思考针对预训练模型的训练策略 差异化学习率三阶段微调 作业&#xff1a; 好好理解下resnet18的模型结构尝试对vgg16cbam进行微调策略 ResNet-18 结构核心思想 可以将R…

docker连接mysql

查看在运行的容器&#xff1a;docker ps -s 进入容器&#xff1a;docker exec -it 容器号或名 /bin/bash&#xff0c;如&#xff1a;docker exec -it c04c438ff177 /bin/bash 或docker exec -it mysql /bin/bash。 3. 登录mysql&#xff1a;mysql -uroot -p123456