PyTorch 与 Python 装饰器及迭代器的比较与应用
在深度学习和 Stable Diffusion(SD)训练过程中,PyTorch 不仅依赖于 Python 的基础特性,而且通过扩展和封装这些特性,提供了更高效、便捷的训练和推理方式。本文将从装饰器和迭代器两个方面详细解释 Python 中的原生实现以及 PyTorch 如何针对深度学习场景进行优化,帮助大家更好地理解和使用这些工具。
一、装饰器
1.1 Python 装饰器简介
概念:
Python 装饰器是一种语法糖,用于在不修改原函数代码的前提下动态地增强或改变函数的行为。它常用于实现以下功能:
- 日志记录
- 性能计时
- 缓存优化
- 权限验证
- 异常处理
常见用法:
@functools.wraps
:用于保持被装饰函数的元数据(如函数名、文档字符串)。- 自定义装饰器:例如记录函数调用时间、重试机制等。
1.2 PyTorch 中的装饰器
PyTorch 基于 Python 装饰器的机制,专门设计了一些装饰器来解决深度学习训练和推理中的常见问题。
(1)@torch.no_grad()
- 作用:在推理阶段关闭梯度计算,节省内存并加速计算。
- 应用场景:验证、测试以及生成图片(如 SD 模型生成时)等场景不需要梯度反向传播。
- 示例代码:
import torchimport torch.nn as nnclass SimpleModel(nn.Module):def __init__(self):super(SimpleModel, self).__init__()self.fc = nn.Linear(10, 2)def forward(self, x):return self.fc(x)model = SimpleModel()@torch.no_grad()def evaluate(model, data_loader):model.eval()results = []for inputs in data_loader:outputs = model(inputs)results.append(outputs)return results# 构造伪数据加载器data_loader = [torch.randn(5, 10) for _ in range(3)]outputs = evaluate(model, data_loader)print(outputs)
在 SD 训练中,推理阶段常用该装饰器来避免不必要的梯度计算。
(2)@torch.jit.script / @torch.jit.trace
- 作用:将模型转换为 TorchScript,从而使模型能够在没有 Python 解释器环境下高效运行,便于跨平台部署和加速推理。
- 应用场景:模型训练结束后,优化推理和部署时使用。
- 示例代码:
import torch
import torch.nn as nnclass MyModule(nn.Module):def __init__(self):super(MyModule, self).__init__()self.linear = nn.Linear(10, 2)def forward(self, x):return self.linear(x)model = MyModule()# 使用 torch.jit.script 将模型编译成 TorchScript
scripted_model = torch.jit.script(model)x = torch.randn(1, 10)
print(scripted_model(x))
对于 SD 模型,其复杂的计算图经过 TorchScript 优化后能够提升推理效率。
(3)自定义装饰器
- 作用:在训练或调试过程中,可利用装饰器来封装日志记录、异常捕获、性能监控等功能。
- 示例代码:
import time
import functoolsdef timing_decorator(func):@functools.wraps(func)def wrapper(*args, **kwargs):start_time = time.time()result = func(*args, **kwargs)end_time = time.time()print(f"Function {func.__name__} took {end_time - start_time:.4f} seconds")return resultreturn wrapper@timing_decorator
def training_step(model, data):time.sleep(0.1) # 模拟训练耗时return model(data)# 示例:假设 model 是一个简单函数
model = lambda x: x * 2
training_step(model, 5)
在复杂的 SD 训练中,可以自定义装饰器监控每个训练步骤的性能瓶颈。
2.2 PyTorch 中的迭代器
在 PyTorch 中,迭代器主要体现在数据加载部分。由于深度学习训练通常涉及大规模数据,因此高效的数据加载成为关键。
(1)DataLoader 迭代器
• 作用:DataLoader 封装了数据集,并利用迭代器逐批返回数据,同时支持数据打乱、批量加载以及多进程并行加载。
• 应用场景:训练和验证过程中,通过迭代 DataLoader 获取每个 batch 的数据,进而进行前向传播、反向传播和优化。
• 示例代码:
import torch
from torch.utils.data import DataLoader, TensorDatasetdata = torch.randn(100, 10)
labels = torch.randint(0, 2, (100,))
dataset = TensorDataset(data, labels)data_loader = DataLoader(dataset, batch_size=16, shuffle=True)for batch_data, batch_labels in data_loader:print(batch_data.shape, batch_labels.shape)
对于 SD 模型训练,由于数据量较大,DataLoader 能够高效地加载和预处理数据。
(2)自定义数据集和迭代器
• 作用:当内置数据集不能满足特殊需求时,可以继承 torch.utils.data.Dataset 自定义数据集,并通过 DataLoader 进行迭代加载。
• 应用场景:例如,在 SD 训练中需要加载特定格式的图像、文本或多模态数据时,可以自定义数据集来实现数据预处理逻辑。
• 示例代码:
import torch
from torch.utils.data import Dataset, DataLoader
from PIL import Image
import osclass CustomImageDataset(Dataset):def __init__(self, image_dir, transform=None):self.image_dir = image_dirself.image_files = os.listdir(image_dir)self.transform = transformdef __len__(self):return len(self.image_files)def __getitem__(self, idx):img_path = os.path.join(self.image_dir, self.image_files[idx])image = Image.open(img_path).convert('RGB')if self.transform:image = self.transform(image)return imageimage_dir = "path/to/images"
dataset = CustomImageDataset(image_dir)
data_loader = DataLoader(dataset, batch_size=8, shuffle=True)for images in data_loader:print(images.shape)
通过自定义数据集,可以灵活应对各种数据格式,并利用迭代器机制高效加载数据。
三、综合比较与总结
3.1 装饰器方面
-
Python 装饰器:
- 用途广泛,如日志记录、计时、缓存、权限检查等。
- 通过简单的语法糖实现对函数行为的增强,无需修改原函数代码.
-
PyTorch 装饰器:
- 基于 Python 装饰器机制,专门针对深度学习中的梯度计算、模型部署和推理优化设计.
- 常见如
@torch.no_grad()
用于关闭梯度计算,@torch.jit.script
/@torch.jit.trace
用于模型优化部署,以及自定义装饰器用于性能监控.
3.2 迭代器方面
-
Python 迭代器:
- 基础语言特性,用于遍历任意可迭代对象,实现数据流处理.
- 通过实现
__iter__
和__next__
方法,能够逐个返回数据项.
-
PyTorch 迭代器:
- 主要体现在数据加载部分,利用
DataLoader
封装数据集,支持批量加载、数据打乱以及多进程并行处理. - 支持自定义数据集(继承
torch.utils.data.Dataset
),满足多模态、大规模数据处理的需求.
- 主要体现在数据加载部分,利用
3.3 总结
-
装饰器:
- Python 装饰器 是通用的扩展机制,而 PyTorch 装饰器 则专门用于优化深度学习场景下的推理、部署以及性能监控.
-
迭代器:
- Python 迭代器 是基础语言功能,而 PyTorch 的 DataLoader 与自定义数据集 则在其基础上进行了优化,使得大规模数据处理、批量加载与多进程并行处理成为可能,极大地方便了深度学习和 SD 模型的训练流程.
💬 如果你觉得这篇整理有帮助,欢迎点赞收藏!
相关文章:
PyTorch 与 Python 装饰器及迭代器的比较与应用
在深度学习和 Stable Diffusion(SD)训练过程中,PyTorch 不仅依赖于 Python 的基础特性,而且通过扩展和封装这些特性,提供了更高效、便捷的训练和推理方式。本文将从装饰器和迭代器两个方面详细解释 Python 中的原生实现…...
大数据(5)(基础概念)Spark从入门到实战:核心原理与大数据处理实战案例
目录 一、背景介绍1. 为什么需要Spark?2. Spark的诞生: 二、Spark核心原理1. 四大核心特性2. 核心架构3. 执行流程 三、Spark实战案例案例1:单词计数(WordCount)案例2:实时流处理&…...
Ubuntu小练习
文章目录 一、远程连接1、通过putty连接2、查看putty运行状态3、通过Puuty远程登录Ubuntu4、添加新用户查看是否添加成功 5、用新用户登录远程Ubuntu6、使用VNC远程登录树莓派 二、虚拟机上talk聊天三、Opencv1、简单安装版(适合新手安装)2、打开VScode特…...
运行Spark会出现恶问题
1. 依赖冲突问题:Spark依赖众多组件,如Scala、Hadoop等。不同版本的依赖之间可能存在兼容性问题,导致Spark无法正常运行。比如,特定版本的Spark可能要求与之匹配的Scala版本,若使用了不兼容的Scala版本,会在…...
uniapp大文件分包
1. 在pages.json中配置 "subPackages":[{"root":pagesUser,"pages":[{"path":mine/xxx,"style":xxx },{"path":mine/xxx,"style":xxx}]},{"root":pagesIndex,"pages":[{"p…...
Git 源码打包、迁移、恢复和备份
介绍 Git 项目打包方式,适用于源码交付、迁移、备份等场景。 一 Git 仓库的两种类型 在实际项目开发与交付中,常接触 的 两种 Git 仓库: 仓库类型是否包含源码适用场景普通仓库是本地开发、运行、构建裸仓库否代码托管、只读交付、备份 普…...
Linux 内核网络协议栈中的 struct packet_type:以 ip_packet_type 为例
在 Linux 内核的网络协议栈中,struct packet_type 是一个核心数据结构,用于注册特定协议类型的数据包处理逻辑。它定义了如何处理特定协议的数据包,并通过协议类型匹配机制实现协议分发。本文将通过分析 ip_packet_type 的定义和作用,深入探讨其在网络协议栈中的重要性。 …...
LeetCodeHot100-第三章:数学
面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台 目录 🎈1、双指针:9. 回文数 🎈2、逻辑题 :66. 加一 🎈3、逻辑题:172. 阶乘后的零 🎈4、…...
JavaScript 错误处理:理解和应对异常
在编程中,错误是不可避免的,特别是在进行复杂的逻辑操作、与外部系统交互或处理用户输入时。错误处理是软件开发中非常重要的一部分,它可以帮助开发者提高应用的稳定性和可用性。本文将深入探讨JavaScript中的错误处理机制,如何利…...
LangGraph异步化sqlite checkpoint
安装 pip install langgraph-checkpoint-sqlite异步checkpiont初始化: from langgraph.checkpoint.sqlite.aio import AsyncSqliteSaver conn aiosqlite.connect(":memory:", check_same_threadFalse) memory AsyncSqliteSaver(conn)如果使用异步流式…...
StarRocks 助力首汽约车精细化运营
作者:任智红,首汽约车大数据负责人 更多交流,联系我们:https://wx.focussend.com/weComLink/mobileQrCodeLink/334%201%202/ffbe5 导读: 本文整理自首汽约车大数据负责人任智红在 StarRocks 年度峰会上的演讲…...
Versatile-OCR-Program:可以从复杂的教育材料(如试卷)中提取结构化数据的开源多模态OCR工具
Versatile-OCR-Program 此 OCR 系统专门设计用于以针对机器学习 (ML) 训练优化的格式从复杂的教育材料(如试卷)中提取结构化数据。它支持多语言文本、数学公式、表格、图表和图表,非常适合创建高质量的训练数据集。 主…...
时序数据库 TDengine Cloud 私有连接实战指南:4步实现数据安全传输与成本优化
小T导读:在物联网和工业互联网场景下,企业对高并发、低延迟的数据处理需求愈发迫切。本文将带你深入了解 TDengineCloud 如何通过全托管服务与私有连接,帮助企业实现更安全、更高效、更低成本的数据采集与传输,从架构解析到实际配…...
vue项目本地调试使用https
由于测试环境远程接口,是采用https协议,为了能正常携带cookie访问接口,需要把本地项目也采用https协议访问。前提是后端的cookie设置在二级域名下,且允许固定其他子域名跨域访问(需要在后端设置) 项目框架…...
【学习笔记】文件上传漏洞--二次渲染、.htaccess、变异免杀
目录 第十二关 远程包含地址转换 第十三关 突破上传删除 条件竞争 第十四关 二次渲染 第十五关 第十六关 第十七关 .htaccess 第十八关 后门免杀 第十九关 日志包含 第十二关 远程包含地址转换 延续第十一关,加一个文件头,上传成功,…...
探秘 MQTT 协议:物联网的 “隐形桥梁”
在当今数字化时代,物联网技术正以前所未有的速度改变着我们的生活。从智能家居到工业自动化,从远程医疗到智能交通,无数设备相互连接、交换信息,构建起一个庞大而复杂的智能世界。而在这背后,有一个关键的 “隐形桥梁”…...
[ctfshow web入门] web24
前置知识 isset:判断这个变量是否声明且不为NULL,否则返回False mt_srand:设置随机数种子,如果不手动设置,那么系统会自动进行一次随机种子的设置 mt_rand:生成一个随机数,这个随机数与种子有个…...
Unity 实现伤害跳字
核心组件: Dotween TextMeshPro 过程轨迹如下图: 代码如下: using System.Collections; using System.Collections.Generic; using DG.Tweening; using TMPro; using UnityEngine; using UnityEngine.Pool;public class …...
在SQLark 中快速生成测试数据
在软件开发与数据库管理过程中,高质量的测试数据是保障系统稳定性和性能优化的关键。然而,手动构造仿真数据不仅耗时耗力,还难以覆盖多样化的测试场景。现在,可以使用 SQLark 的数据生成功能,通过 8大类47子类的数据规…...
Postman接口测试详解
一、为何使用postman postman是一款简单高效的接口测试工具,能够很方便发送接口请求,易于保存接口请求脚本,postman提供接口响应数据比对功能,可以设置预期结果作断言,还能把测试用例放在一个集合中批量执行ÿ…...
[ctfshow web入门] web30
信息收集 题目将flag system php不区分大小写地过滤了 解题 前置知识 print_r:php中用于打印数组 scandir:php中用于获取指点目录下的所以文件目录名 getcwd:获取当前目录 目录获取 这里提供两种方法 print_r(scandir(getcwd())); pri…...
ElasticSearch迁移数据
一、查询索引 1、查询所有索引 curl --user elastic:123456 -XGET "http://localhost:19200/_cat/indices?v&sindex" 2、查询索引配置 以索引名称hello为例 curl --user elastic:123456 -XGET "http://localhost:19200/hello/_settings?pretty" 3…...
ES:账号、索引、ILM
目录 笔记1:账号权限查看、查看账号、创建账号等查看所有用户查看特定用户验证权限修改用户权限删除用户 笔记2:索引状态和内容的查看等查看所有索引查看特定索引内容查看索引映射查看索引设置查看索引统计信息查看ILM策略 笔记1:账号权限查看…...
Spring MVC 逻辑视图(JSP、Thymeleaf、FreeMarker)与非逻辑视图(JSON、Excel、PDF、XML)详解及示例
Spring MVC 逻辑视图与非逻辑视图详解及示例 一、逻辑视图与非逻辑视图的定义 类型定义逻辑视图通过视图解析器(ViewResolver)将逻辑名称(如 success)映射到具体视图实现。非逻辑视图直接返回具体视图对象(如 JsonVie…...
开发体育赛事直播系统:实现聊天交友的私聊功能技术实现全方案解析
基于“东莞梦幻网络科技”体育赛事直播系统,展示前后端技术(PHP ThinkPHP Vue.js Android Java iOS OC)实现的“用户与用户之间私聊”完整方案,包括功能描述、界面效果、技术实现、数据结构、接口设计及关键代码示例。 一、私…...
UTF-8和GBK编码的区别和详细解释
各位看官,大家早安午安晚安呀~~~ 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连,小编尽全力做到更好 欢迎您分享给更多人哦 今天我们来学习:一个小的知识点—UTF-8和GBK编码的解释 1.关于bite位和进制的关系 1 个比特(bit&am…...
java导入excel更新设备经纬度度数或者度分秒
文章目录 一、背景介绍二、页面效果三、代码0.pom.xml1.ImportDevice.vue2.ImportDeviceError.vue3.system.js4.DeviceManageControl5.DeviceManageUserControl6.Repeater7.FileUtils8.ResponseModel9.EnumLongitudeLatitude10.词条 四、注意点本人其他相关文章链接 一、背景介…...
使用python访问mindie部署的vl多模态模型
说明 今天使用mindie1.0部署了qwen2_7b_vl模型,测试过程出现一些问题,这里总结下。 问题1:transformers版本太低 报错信息: [ERROR] [model_deploy_config.cpp:159] Failed to get vocab size from tokenizer wrapper with ex…...
github发布个人中英文简历网站CaoYongshengcys.github.io
在GitHub上创建个人主页(也称为GitHub Pages)是一个展示个人项目、技能和经历的好方法。以下是详细步骤: 1. 创建GitHub账号 • 如果你还没有GitHub账号,先访问GitHub官网注册一个账号。 • 选择一个专业的用户名,因…...
动态规划算法深度解析:0-1背包问题(含完整流程)
简介: 0-1背包问题是经典的组合优化问题:给定一组物品(每个物品有重量和价值),在背包容量限制下选择物品装入背包,要求总价值最大化且每个物品不可重复选取。 动态规划核心思想 通过构建二维状态表dp[i]…...
QML面试笔记--UI设计篇04交互控件
1. QML中常用交互控件 1.1. Button1.2. Slider1.3. ProgressBar1.4. TextField1.5. TextArea1.6. ComboBox1.7. CheckBox1.8. RadioButton1.9. Menu1.10. Dialog 1. QML中常用交互控件 在万物互联的智能时代,QML凭借其声明式语法和跨平台能力,…...
【数学】线性代数(Python)
参考:https://aibydoing.com/notebooks/appendix01-01-linear-algebra-with-python 目录 矩阵的定义矩阵的运算矩阵的属性矩阵的分解矩阵的本质遗留问题 矩阵的定义 通过数组的维度来区分向量(1 维数组)、矩阵(2 维数组࿰…...
ragflow开启https访问:添加证书后,使用浏览器还是有警告,如何解决?
如果在 Windows 系统中安装了 PEM 证书(使用方法一通过证书管理器 MMC 导入),但浏览器仍然提示安全警告,可能有以下几个原因及解决方法: 1. 证书未正确安装到受信任的存储位置 问题:如果证书被导入到错误的存储位置(如“个人”而非“受信任的根证书颁发机构”),浏览器…...
vue.config.js配置代理(输出代理前后的地址)
devServer: {host: 0.0.0.0,port: port,open: true,before(app) {app.use((req, res, next) > {// console.log(原始地址:, req.originalUrl) // 原始地址,如 /api/some-api/xxxxxnext()})},proxy: {[process.env.VUE_APP_BASE_API]: {target: http://192.168.50…...
【八股文】http1.0和1.1的区别
http1.0默认使用短连接,每次请求都需要建立TCP连接(三次握手),响应完成后立即关闭连接,导致资源浪费和延迟增加。 支持通过Connection:Keep-alive 手动开启长连接,但需客户端和服务端显式协商 …...
【Prompt实战】邮件分类专家
本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权&am…...
K8S核心技术点
Pod,Service和Deployment的关系 Pod:Kubernetes 中最小的部署单元,用于运行容器化应用。 Service:提供服务发现和负载均衡,为 Pod 提供稳定的网络端点,ClusterIP,NodePort,LoadBala…...
Python手写“随机森林”解决鸢尾花数据集分类问题
Python使用“随机森林”解决鸢尾花数据集分类问题 任务描述解题1. 导入必要的库2. 数据采样函数 sample3. 设置随机种子和超参数4. 定义随机森林类 random_forest5. 加载数据集并划分训练集和测试集6. 创建并训练随机森林模型7. 进行预测并计算准确率 代码 任务描述 您的任务是…...
Python 字典和集合(泛映射类型)
本章内容的大纲如下: 常见的字典方法 如何处理查找不到的键 标准库中 dict 类型的变种set 和 frozenset 类型 散列表的工作原理 散列表带来的潜在影响(什么样的数据类型可作为键、不可预知的 顺序,等等) 泛映射类型 collections.…...
CrystalDiskInfo电脑硬盘监控工具 v9.6.0中文绿色便携版
前言 CrystalDiskInfo是一个不用花钱的硬盘小帮手软件,它可以帮你看看你的电脑硬盘工作得怎么样,健不健康。这个软件能显示硬盘的温度高不高、还有多少地方没用、传输东西快不快等等好多信息。用了它,你就能很容易地知道硬盘现在是什么情况&…...
rqlite:一个基于SQLite构建的分布式数据库
今天给大家介绍一个基于 SQLite 构建的轻量级分布式关系型数据库:rqlite。 rqlite 基于 Raft 协议,结合了 SQLite 的简洁性以及高可用分布式系统的稳健性,对开发者友好,操作极其简便,其核心设计理念是以最低的复杂度实…...
网络1 网络设备
计算机网络设备 集线器: 易发生阻塞:所有端口共享一条带宽,两个端口发生传输时,其他端口若想传输数据给这两个端口,需等待这两个端口传输数据完毕。 端口数量限制:10M带宽下可用15口。15口共享10Md带宽 集线…...
mybatis 某些特殊的 ORA-00979:not a GROUP BY expression
打印的日志sql执行都是正常的 但是 就是报ORA-00979: not a GROUP BY expression 可能是 GROUP BY中不能使用动态参数 或特殊方法 使用 硬编码可以解决问题 <if test"statisticsInVo.timeTypeSql!null and statisticsInVo.timeTypeSql yyyy">TO_CHAR(CARD_T…...
基于OpenCV的图像处理程序设计实践
一.安装OpenCV3.x # 安装依赖 sudo apt update sudo apt install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev# 下载OpenCV源码 git clone https://github.com/opencv/opencv.git -b 3.4 cd opencv mkdir build &…...
DeepSeek 全套汇总资料pdf免费下载(最新更新8篇)
DeepSeek 全套汇总资料pdf目前仍然在持续更新中,今天更新了8篇,合计的汇总都在这里了,有需要的朋友可以直接去下载了。 后续更新请关注文章:DeepSeek 全套汇总资料pdf免费下载(持续更新) _ 潘子夜个人博客…...
前端面试题(六):HTTP和HTTPS的区别以及他们如何保障数据安全
HTTP(HyperText Transfer Protocol)和HTTPS(HyperText Transfer Protocol Secure)都是用于在互联网上传输数据的协议,但它们之间有一个重要的区别:安全性。 1. HTTP(超文本传输协议)…...
Buffer Pool 的核心作用与工作机制
Buffer Pool 的核心作用与工作机制 1. Buffer Pool 是什么? Buffer Pool 是 InnoDB 存储引擎的核心内存区域,用于 缓存磁盘中的数据页。 作用:通过内存缓存减少直接磁盘 I/O,加速数据库的读写操作。默认大小:通常设…...
使用uglifyjs对静态引入的js文件进行压缩
前言 因为有时候js文件没有npm包,或者需要修改,只能引入静态的js,那么这个时候就可以对js进行压缩了。我其实想通过vite、webpack等插件进行压缩的,可是他都不能定位到public目录下面的文件,所以我只能自己压缩了。编…...
Vue 3 的<Teleport>功能与用法
Vue 3 的 <Teleport> 功能与用法 1. 基本用法 <Teleport> 是 Vue 3 的一个内置组件,允许将组件的内容渲染到 DOM 中的任意位置,而不改变其逻辑结构。以下是基本用法: 定义目标 DOM 元素:<div id"teleport-…...
2025 年江苏交安安全员考试:借助本地培训资源提升能力
江苏拥有丰富的教育和培训资源,为交安安全员备考提供了有力支持。考生可关注本地专业培训机构开设的交安安全员培训课程,这些课程往往由经验丰富的讲师授课,他们熟悉本地考试特点和行业实际需求。课程内容不仅涵盖考试大纲的知识点࿰…...