PyTorch训练循环中zero_grad()的正确调用位置详解
在PyTorch中optimizer.zero_grad()必须在loss.backward()之前执行且绝不能位于backward()与step()之间其具体位置循环开头或backward()前一刻不影响梯度计算逻辑但影响代码可读性与多优化器场景下的正确性。 在pytorch中optimizer.zero_grad()必须在loss.backward()之前执行且绝不能位于backward()与step()之间其具体位置循环开头或backward()前一刻不影响梯度计算逻辑但影响代码可读性与多优化器场景下的正确性。zero_grad()的核心作用是清空优化器所管理参数的累积梯度即param.grad张量。PyTorch默认采用梯度累加机制——每次调用backward()时新梯度会以加法方式累加到现有grad上而非覆盖。因此若不显式清零历史批次的梯度将持续叠加导致错误的参数更新方向和幅度。? 正确时机必须在 loss.backward() 之前、且在 optimizer.step() 之后的任意位置均可只要不夹在 backward() 和 step() 中间。例如以下两种写法完全等价且均正确# ? 方式1循环起始处清零推荐简洁清晰for epoch in range(num_epochs): for batch in dataloader: optimizer.zero_grad() # ← 清零在此处 outputs model(batch.x) loss criterion(outputs, batch.y) loss.backward() # ← 梯度计算 optimizer.step() # ← 参数更新# ? 方式2backward前一刻清零语义更显式for epoch in range(num_epochs): for batch in dataloader: outputs model(batch.x) loss criterion(outputs, batch.y) optimizer.zero_grad() # ← 清零在此处仍早于backward loss.backward() optimizer.step()?? 绝对禁止的写法loss.backward()optimizer.zero_grad() # ? 错误此时梯度已计算但未更新清零将丢失本次梯度optimizer.step()对于含多个子网络与独立优化器的复杂模型如VAE、GAN、编码器-解码器应为每个优化器单独、就近调用zero_grad()确保职责明确、避免干扰 Cleanup.pictures 智能移除图片中的物体、文本、污迹、人物或任何不想要的东西
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2544530.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!