第六章:PyTorch模型定义与进阶训练技巧
需要将上一章结合,U-Net模型后加深进阶训练技巧。
一、自定义损失函数?
损失函数仅仅是一个函数而已,当我们不想使用CrossEntropyLoss(),我们可以通过直接以函数定义的方式定义一个自己的函数。本次课程采用的是DiceLoss, 是一种分割模型。
Kaggle上有很多关于Loss functions:
【1】https://www.kaggle.com/bigironsphere/loss-function-library-keras-pytorch/notebook
二、动态调整学习率
随着优化的进行,固定的学习率可能无法满足优化的需求,这时需要调整学习率,降低优化的速度,以此提高模型精度。
本次使用的是StepLR的方法。通过运行示例代码,可以看出learning rate每次 都不一样。公式中step_size和gamma可以自定义来调整,想要平滑就把step_size调小,把gamma调大,十分灵活。
三、模型微调
运用多的场景为图像处理。
unet.module.outc.conv.weight.requires_grad=False, 让最后一层不需要参数更新。
模型微调是个大工程,通常你有别人留下的权重,或者在官网中torchvision上下载来的权重。
四、半精度训练
减少浮点数:Pytorch默认的是torch.float 32,因此改为torch.float16格式,搭配@autocast修饰器函数,来进行半精度训练。
五、数据增强-imgaug
当数据不足时,会容易导致模型过拟合,为了避免这种情况而使用数据增强,提高训练数据集的大小和质量。
总结
本次章节,还是以搞懂代码里的含义为主。后续需要多看一下。