8 PyTorch训练技巧
8.1 模型保存与加载
模型保存与加载
,就是序列化与反序列化,将模型持久化保存
-
torch.save()
功能:模型保存,即序列化
参数说明:
- obj:对象
- f:输出路径
-
torch.load()
功能:模型加载,即反序列化
参数说明:
- f:文件路径
- map_location:指定存放位置,cpu or gpu
模型保存的两种方法
:
官方推荐方法2:方法2比方法1速度快,但方法2只保存了模型参数,加载时需将参数加入网络(预先定义一个模型【模型必须与原模型相同的构造】)中才能获得完整模型
8.2 模型断点续训练
模型和优化器会随着迭代训练而变化,优化器中的缓存如momentum数值会改变
断点续训练可以使得意外中断的训练重新恢复之前的训练
8.3 模型微调(Finetune)
Transfer Learning(迁移学习)
:机器学习分支,研究源域(source domain)的知识如何应用到目标域(target domain)
模型微调的步骤
:
- 获取预训练模型参数
- 加载模型(load_state_dict)
- 修改输出层
模型微调的训练方法
:【让特征提取层的参数不更新或者缓慢更新】
- 固定预训练的参数(requires_grad=Flase; lr=0)
- Features Extractor(特征提取–卷积层)设置较小学习率(params_group)
8.4 GPU的使用
CPU(Central Processing Unit,中央处理器):主要包括控制器和运算器
GPU(Graphics Processing Unit,图形处理器):处理统一的、无依赖的大规模数据运算
-
to函数:转换数据类型/设备
- **tensor.to(args,*kwargs)
- **module.to(args,*kwargs)
区别:张量不执行inplace操作,必须重新赋值,而模型会执行inplace操作
-
torch.cuda常用方法
- torch.cuda.device_count():计算当前可见可用GPU数
- torch.cuda.get_device_name():获取GPU名称
- torch.cuda.manual_seed():为当前GPU设置随机种子
- torch.cuda.manual_seed_all():为所有可见可用GPU设置随机种子
8.5 多GPU运算的分发并行机制
分发 —》并行运算 —》结果回收
-
torch.nn.DataParallel()
功能:包装模型,实现分发并行机制参数说明:
- module:需包装分发的模型,即训练的模型
- device_ids:可分发的GPU,默认分发到所有可见可用GPU
- output_device:结果输出设备,通常设置为逻辑GPU的第一个 ,即主GPU