python项目调优合集(长期更新):提升准确率、训练提速、pytorch trich

本文探讨了在PyTorch中遇到的模型训练问题,包括loss稳定但accuracy低的情况,以及模型训练速度慢的挑战。针对梯度消失和爆炸,提出了更换优化器、调整学习率、使用BatchNorm和残差网络等解决方案。对于模型训练速度慢,推荐了多种加速训练的方法。此外,还分享了一些PyTorch的实用技巧。
摘要由CSDN通过智能技术生成

1. 准确率相关

1.1 loss基本保持不变,acc又很低

1.1.1 检验模型参数的更新幅度

		optimizer.zero_grad()
        
        model_output, pooler_output = model(input_data)
        Before = list(model.parameters())[0].clone() 	# 获取更新前模型的第0层权重
       
        loss = criterion(model_output, label)
        loss.backward()
        # nn.utils.clip_grad_norm_(model.parameters(), max_norm=20, norm_type=2) # 梯度截断
        optimizer.step()
		
		# 检验模型的学习情况
        After = list(model.parameters())[0].clone() 	# 获取更新后模型的第0层权重
        predicted_label = torch.argmax(model_output, -1)
        acc = accuracy_score(label.float().cpu(), predicted_label.view(-1).float().cpu())
    	print(loss,acc) # 打印mini-batch的损失值以及准确率
        print('模型的第0层更新幅度:',torch.sum(After-Before))

如果:模型更新幅度非常小,其绝对值<0.01, 很可能是梯度消失了; 如果绝对值>1000,很可能是梯度爆炸;

具体阈值需要自行去调节,只是提供了一种思路

1.2 解决
(1)梯度爆炸
梯度爆炸常见原因:使用了深层网络、参数初始化过大,解决方案:
1)更换优化器
2)学习率调低
3)梯度截断
4)使用正则化
(2)梯度消失
梯度消失很有可能是:深层网络、使用了sigmoid激活函数,解决方案:
1)使用Batch Norm 批标准化
BN将网络中每一层的输出标准化为正态分布,并使用缩放和平移参数对标准化之后的数据分布进行调整,可以将集中在梯度饱和区的原始输出拉向线性变化区,增大梯度值,缓解梯度消失问题,并加快网络的学习速度。

2)选用Relu()激活函数
3)使用残差网络ResNet
使用ResNet可以轻松搭建几百层、上千层的网络,而不用担心梯度消失问题.

2. 模型训练慢

这个问题非常多,直接看一些大佬的原文更清晰
(1)Pytorch提速指南
(2)度学习PyTorch,TensorFlow中GPU利用率较低,CPU利用率很低,且模型训练速度很慢的问题总结与分析
(3)十七种方法轻松解决PyTorch训练速度慢
(4)Pytorch 深度强化学习模型训练速度慢

3. PyTorch trick集锦

PyTorch trick 集锦
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值