8.pytorch lightning之训练时的技术

训练可用的技术

梯度累积 Accumulate Gradients

accumulate_grad_batches=K,设置后会每K个batches累积梯度,然后反向传播一次,相当于增加了batch size但内存没有增加。

# DEFAULT (ie: no accumulated grads)
trainer = Trainer(accumulate_grad_batches=1)

# Accumulate gradients for 7 batches
trainer = Trainer(accumulate_grad_batches=7)

梯度裁剪 Gradient Clipping

将梯度值限制在指定范围内,防止梯度爆炸。

# DEFAULT (ie: don't clip) 不u
trainer = Trainer(gradient_clip_val=0)

# clip gradients' global norm to <=0.5 using gradient_clip_algorithm='norm' by default
# 将norm后>0.5的梯度裁剪
trainer = Trainer(gradient_clip_val=0.5)

# 将梯度值>0.5的裁剪
# clip gradients' maximum magnitude to <=0.5
trainer = Trainer(gradient_clip_val=0.5, gradient_clip_algorithm="value")

学习率搜索

PL中内置学习率搜索工具,其使用论文Cyclical Learning Rates for Training Neural Networks的方法将学习率逐渐增大,然后运行少量batches,最后绘制loss vs lr曲线,并给出建议的学习率。

为了搜索学习率,LightningModule模型中必须声明一个learning_rate属性,创建Tuner对象,调用lr_fine方法。

from lightning.pytorch.tuner import Tuner


class LitModel(LightningModule):
    def __init__(self, learning_rate):
        super().__init__()
        # 声明学习率字段
        self.learning_rate = learning_rate
        self.model = Model(...)

    # 配置优化器,但是搜索学习率时只能指定一个优化器。
    def configure_optimizers(self):
        return Adam(self.parameters(), lr=(self.lr or self.learning_rate))


model = LitModel()
trainer = Trainer(...)

# Create a Tuner
tuner = Tuner(trainer)

# finds learning rate automatically
# sets hparams.lr or hparams.learning_rate to that learning rate
tuner.lr_find(model)

# to set to your own hparams.my_value 如果模型中学习率的字段不为learning_rate,则需要声明字段名。
# tuner.lr_find(model, attr_name="my_value")


# 打印搜索结果
print(lr_finder.results)

# 画出曲线图
fig = lr_finder.plot(suggest=True)
fig.show()

# 获取建议值Pick point based on plot, or get suggestion
new_lr = lr_finder.suggestion()

# update hparams of the model
model.hparams.lr = new_lr

# Fit model
trainer.fit(model)

绘制的曲线如下,红点为建议值,建议不是最低点,而是在最陡峭的下坡中间。

### PyTorch Lightning框架文档和教程 #### 文档资源 PyTorch Lightning旨在简化并标准化使用PyTorch构建机器学习模型的过程。官方提供了详尽的文档来指导开发者如何定义`LightningModule`以及配置训练流程[^1]。 对于希望深入了解该库特性的用户来说,访问官方网站获取最新版次的支持说明和技术细节至关重要。通过查阅这些资料可以了解到不同版本之间可能存在的差异及其兼容性问题,这对于维护项目稳定性和性能优化非常重要。 #### 教程实例 为了帮助初学者快速上手,在线平台上有许多关于创建自定义模块(`LightningModule`)的教学视频可供参考。例如有专门针对结构化数据集准备过程中的常见操作进行了详细介绍的内容,像批量处理(batching),随机打乱(shuffling)等实用技巧都被涵盖其中[^2]。 此外还有更多高级主题如迁移学习、分布式训练等方面的指南等待探索者去发掘。值得注意的是,随着社区贡献者的不断增加,越来越多高质量的学习材料被分享出来,使得掌握这项技能变得更加容易。 ```python import pytorch_lightning as pl from torch.utils.data import DataLoader, random_split from torchvision.datasets import MNIST from torchvision.transforms import ToTensor class LitMNIST(pl.LightningModule): def __init__(self): super().__init__() # Define model architecture here def forward(self, x): pass def training_step(self, batch, batch_idx): pass def configure_optimizers(self): pass if __name__ == '__main__': dataset = MNIST('.', train=True, download=True, transform=ToTensor()) train_loader = DataLoader(dataset, batch_size=64) lit_model = LitMNIST() trainer = pl.Trainer(max_epochs=5) trainer.fit(lit_model, train_loader) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值