问题描述:
在使用 PyTorch 训练自定义神经网络时,我们希望能够动态地调整学习率,以便在训练过程中逐渐优化模型,避免过拟合并加速收敛。那么,如何在 PyTorch 中实现这一功能呢?
解决方案:
在训练过程中,动态调整学习率通常是为了提高模型的训练效率和性能。常见的策略包括:
基于周期的衰减:
例如每隔一定的epoch将学习率减少一定比例根据训练损失或指标动态调整:
比如在训练过程中,如果验证集的损失不再下降,则减少学习率
本例我们使用基于epoch的周期衰减,设置每5个epoch将学习率衰减为原来的0.99,实现自定义调整学习率。
伪代码示例:
# 定义优化器
lr = 0.01
optimizer = optim.Adam(net.parameters(), lr=lr)for epoch in range(1, 100):# 我们希望每5个epoch学习率衰减为原来的0.99if epoch%5 == 0:lr = lr*0.99for param_group in optimizer.param_groups:param_group['lr'] = lr# 从dataloader中加载训练数据for train_data_batch in train_dataload:# 训练
optimizer.param_groups
是一个列表,其中包含所有参数组的学习率,因此我们更新每个参数组的学习率。也可以根据训练过程中的其他指标(如训练损失、验证损失、准确率等)来自定义调整学习率的策略。例如,动态地根据损失的变化来调整学习率。
错误代码示例:
# 定义优化器
lr = 0.01
optimizer = optim.Adam(net.parameters(), lr=lr)for epoch in range(1, 100):# 我们希望每5个epoch学习率衰减为原来的0.99if epoch%5 == 0:lr = lr*0.99optimizer = optim.Adam(net.parameters(), lr=lr)# 从dataloader中加载训练数据for train_data_batch in train_dataload:# 训练
上面代码中,每个epoch重新初始化优化器,意味着每次都会丢失优化器之前的状态(例如动量)。正确的做法是通过 optimizer.param_groups
修改现有优化器中的学习率,而不是重新定义优化器。