lightning的hook顺序

结果

setup: 训练循环开始前设置数据加载器和模型。

configure_optimizers: 设置优化器和学习率调度器。

on_fit_start: 训练过程开始。

on_train_start: 训练开始。

on_train_epoch_start: 每个训练周期开始。

on_train_batch_start: 每个训练批次开始。

on_before_backward: 反向传播之前。

on_after_backward: 反向传播之后。

on_before_zero_grad: 清空梯度之前。

on_after_zero_grad: 清空梯度之后。

on_before_optimizer_step: 优化器步骤之前。

on_train_batch_end: 每个训练批次结束。

on_train_epoch_end: 每个训练周期结束。

on_train_end: 训练结束。

on_fit_end: 训练过程结束。

测试代码

import torch
from torch.utils.data import DataLoader, TensorDataset
from pytorch_lightning import LightningModule, Trainer, Callback
from pytorch_lightning.callbacks import Callback

# 定义一个简单的线性回归模型
class LinearRegression(LightningModule):
    def __init__(self):
        super().__init__()
        self.linear = torch.nn.Linear(1, 1)

    def forward(self, x):
        return self.linear(x)

    def training_step(self, batch, batch_idx):
        x, y = batch
        y_hat = self(x)
        loss = torch.nn.functional.mse_loss(y_hat, y)
        return loss
    
    def on_after_backward(self, *args, **kwargs):
        print("After backward is called!", args, kwargs)
        return super().on_after_backward(*args, **kwargs)
    
    def on_before_zero_grad(self, *args, **kwargs):
        print("Before zero grad is called!", args, kwargs)
        return super().on_before_zero_grad(*args, **kwargs)
    
    def on_after_zero_grad(self, *args, **kwargs):
        print("After zero grad is called!", args, kwargs)
        return super().on_after_zero_grad(*args, **kwargs)
    
    def on_before_backward(self, *args, **kwargs):
        print("Before backward is called!", args, kwargs)
        return super().on_before_backward(*args, **kwargs)
    
    def on_before_optimizer_step(self, *args, **kwargs):
        print("Before optimizer step is called!", args, kwargs)
        return super().on_before_optimizer_step(*args, **kwargs)
    
    def on_after_optimizer_step(self, *args, **kwargs):
        print("After optimizer step is called!", args, kwargs)
        return super().on_after_optimizer_step(*args, **kwargs)
    
    def on_fit_start(self, *args, **kwargs):
        print("Fit is starting!", args, kwargs)
        return super().on_fit_start(*args, **kwargs)
    
    def on_fit_end(self, *args, **kwargs):
        print("Fit is ending!", args, kwargs)
        return super().on_fit_end(*args, **kwargs)
    
    def setup(self, *args, **kwargs):
        print("Setup is called!", args, kwargs)
        return super().setup(*args, **kwargs)
    
    def configure_optimizers(self, *args, **kwargs):
        print("Configure Optimizers is called!", args, kwargs)
        return super().configure_optimizers(*args, **kwargs)
    
    def on_train_start(self, *args, **kwargs):
        print("Training is starting!", args, kwargs)
        return super().on_train_start(*args, **kwargs)
    
    def on_train_end(self, *args, **kwargs):
        print("Training is ending!", args, kwargs)
        return super().on_train_end(*args, **kwargs)
    
    def on_train_batch_start(self, *args, **kwargs):
        print(f"Training batch is starting!", args, kwargs)
        return super().on_train_batch_start(*args, **kwargs)
    
    def on_train_batch_end(self, *args, **kwargs):
        print(f"Training batch is ending!", args, kwargs)
        return super().on_train_batch_end(*args, **kwargs)
    
    def on_train_epoch_start(self, *args, **kwargs):
        print(f"Training epoch is starting!", args, kwargs)
        return super().on_train_epoch_start(*args, **kwargs)
    
    def on_train_epoch_end(self, *args, **kwargs):
        print(f"Training epoch is ending!", args, kwargs)
        return super().on_train_epoch_end(*args, **kwargs)
    
    
# 创建数据集
x_train = torch.tensor([[1.0], [2.0], [3.0], [4.0]], dtype=torch.float)
y_train = torch.tensor([[2.0], [4.0], [6.0], [8.0]], dtype=torch.float)
train_dataset = TensorDataset(x_train, y_train)
train_loader = DataLoader(train_dataset, batch_size=2)

# 创建模型和训练器
model = LinearRegression()
trainer = Trainer(max_epochs=2)

# 开始训练
trainer.fit(model, train_loader)
编写目的:测试报告的核心目标是总结测试周期的活动与结果,判断系统是否符合需求。它为用户提供全面视角,展示测试发现的问题、解决方式及系统现状。 项目背景:简要介绍项目,包括发起原因、目标客户和技术栈等,帮助读者理解测试背景。 列出测试过程中使用的关键文档,如需求规格说明书、设计文档和测试计划等,确保各方能获取一致的参考信息。 定义文档中的专业术语和缩写,避免误解,确保所有人员准确理解报告内容。 概述测试的整体框架,包括目的、范围和方法论,同时提及基本假设,如需求文档的准确性和资源可用性。 设计原则:测试用例需与需求项直接关联,且随需求变化动态调整。 设计方法:采用等价类划分、边界值分析和因果图等方法,设计覆盖关键场景的测试用例。 详细描述测试环境的硬件、软件和网络配置,以便复现测试结果。 介绍测试过程中使用的方法和技术,以及相关工具,如自动化测试工具和性能测试工具。 功能测试:验证系统功能模块是否按预期工作,包括冒烟测试等快速检查。 性能测试:评估系统在不同负载下的表现,关注响应时间和吞吐量等指标。 可靠性测试:模拟实际使用场景,评估系统稳定性。 安全性测试:检查系统是否存在安全漏洞,确保数据安全。 兼容性测试:验证系统在不同环境(如操作系统、浏览器)下的运行情况。 易用性测试:评估用户体验,确保界面直观易用。 覆盖分析:分析测试覆盖程度,识别未覆盖区域。 缺陷汇总:记录测试中发现的所有缺陷,包括严重性和优先级信息。 缺陷分析:对缺陷进行分类和趋势分析,找出根本原因。 残留缺陷与未解决问题:列出未解决的问题及其对系统的影响。 测试结论:基于测试结果,判断系统是否符合发布条件。 建议:提出改进建议,帮助团队避免未来类似问题。 这份测试报告模板结构清晰,内容全面,细节丰富,非常适合指导软件测试项目的实施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值