反向传播验证

在上一篇文章中,我们已经实现了颜色梯度的反向传播。在这篇文章中,我们验证一下反向传播是否生效。

完整的验证代码可以查看 Commit 12752ef。主要的代码片段如下所示。

  1. for epoch in range(60):
  2.     # 渲染当前优化器下颜色的图像
  3.     pred_image = RasterizerFunction.apply(
  4.         pos, colors, alpha_raw, h_half, w_half, fx_h, fy_h, cx_h, cy_h, c2w, sigma
  5.     )
  6.    
  7.     # 记录指定阶段的渲染图像,用于后续 3x3 评估对比
  8.     if (epoch + 1) in interested_epochs:
  9.         stage_images[epoch + 1] = pred_image.detach().clamp(0.0, 1.0).cpu().numpy()
  10.        
  11.     # 仅使用 L1 损失函数进行监督
  12.     loss = F.l1_loss(pred_image, target_image)
  13.    
  14.     # 零梯度、反向传播与优化器更新
  15.     optimizer.zero_grad()
  16.     loss.backward()
  17.     optimizer.step()
  18.    
  19.     loss_val = loss.item()
  20.     loss_history.append(loss_val)
  21.     print(f"Step {epoch+1:03d} | L1 Loss: {loss_val:.6f}", flush=True)

当我们使用 .apply 方法时,PyTorch 在执行前向传播生成 image 的同时,会在后台默默关联我们写好的 backward 函数。后续只要调用 loss.backward(),它就会顺藤摸瓜,通过链式法则 (Chain Rule) 自动计算出图像相对于颜色(Color)的梯度。

我们设置初始颜色为随机,目标颜色为黑色。可以看到最终图片的确变成了接近黑色。

我们再次设置初始颜色为黑色,目标颜色为真值颜色。可以看到最终图片变成了彩色。

从以上现象可以看出颜色梯度的反向传播是生效的,我们可以继续实现后续内容。