反向传播验证
在上一篇文章中,我们已经实现了颜色梯度的反向传播。在这篇文章中,我们验证一下反向传播是否生效。
完整的验证代码可以查看 Commit 12752ef。主要的代码片段如下所示。
- for epoch in range(60):
- # 渲染当前优化器下颜色的图像
- pred_image = RasterizerFunction.apply(
- pos, colors, alpha_raw, h_half, w_half, fx_h, fy_h, cx_h, cy_h, c2w, sigma
- )
- # 记录指定阶段的渲染图像,用于后续 3x3 评估对比
- if (epoch + 1) in interested_epochs:
- stage_images[epoch + 1] = pred_image.detach().clamp(0.0, 1.0).cpu().numpy()
- # 仅使用 L1 损失函数进行监督
- loss = F.l1_loss(pred_image, target_image)
- # 零梯度、反向传播与优化器更新
- optimizer.zero_grad()
- loss.backward()
- optimizer.step()
- loss_val = loss.item()
- loss_history.append(loss_val)
- print(f"Step {epoch+1:03d} | L1 Loss: {loss_val:.6f}", flush=True)
当我们使用 .apply 方法时,PyTorch 在执行前向传播生成 image 的同时,会在后台默默关联我们写好的 backward 函数。后续只要调用 loss.backward(),它就会顺藤摸瓜,通过链式法则 (Chain Rule) 自动计算出图像相对于颜色(Color)的梯度。
我们设置初始颜色为随机,目标颜色为黑色。可以看到最终图片的确变成了接近黑色。
我们再次设置初始颜色为黑色,目标颜色为真值颜色。可以看到最终图片变成了彩色。
从以上现象可以看出颜色梯度的反向传播是生效的,我们可以继续实现后续内容。