Mitsuba 3.6.4中可微分环境图反向传播失败问题求助
Mitsuba 3.6.4中可微分环境图反向传播失败问题求助
我最近在Mitsuba 3里尝试做环境图参数(emitter.data)的优化,参考官方的焦散优化思路,再加上Mitsuba 2里确实有过完全相同的实现,本来以为这事不难搞定。
我已经确认手动修改环境图的bitmap(也就是emitter.data)时,渲染出的画面会跟着正确变化,但一到反向传播环节就报错,说损失函数根本不依赖这个参数,实在搞不懂哪里出问题了。
最小复现示例
下面是一段能复现问题的简短脚本,逻辑很简单:生成一张小尺寸的均匀环境图,加载一个基础场景,先做一次渲染,然后用渲染结果和自身计算一个 dummy 损失(纯粹就是为了测试梯度能不能正常流动)。
import mitsuba as mi import drjit as dr import numpy as np mi.set_variant('llvm_ad_rgb') # 我也试过'cuda_ad_rgb',结果完全一样 # 创建一张均匀环境图 env_width, env_height = 256, 128 env_data = mi.Bitmap(np.full((env_height, env_width, 3), 0.5, dtype=np.float32)) # 定义使用上述环境图的极简场景 scene_dict = { "type": "scene", "emitter": { "type": "envmap", "bitmap": env_data, # 出问题的参数 "scale": 1.0 }, "integrator": { "type": "path", "max_depth": 4 }, "sensor": { "type": "perspective", "fov": 45, "to_world": mi.ScalarTransform4f().look_at( origin=[0, 0, 5], target=[0, 0, 0], up=[0, 1, 0] ), "film": { "type": "hdrfilm", "width": 256, "height": 256 }, "sampler": { "type": "independent", "sample_count": 16 } }, } scene = mi.load_dict(scene_dict) # 获取并启用环境图数据的梯度追踪 params = mi.traverse(scene) params.keep(['emitter.data']) dr.enable_grad(params['emitter.data']) # 前向渲染 image = mi.render(scene, spp=16) # 创建和渲染图尺寸相同的dummy参考图 dummy_reference = mi.Bitmap(np.full((256, 256, 3), 0.5, dtype=np.float32)) # 计算用于测试反向传播的dummy损失 loss = dr.mean(dr.square(image - dummy_reference)) # 尝试反向传播——理论上应该能正确追踪到输入变量的梯度 dr.backward(loss)
错误信息
RuntimeError: drjit.backward_from(): the argument does not depend on the input variable(s) being differentiated...
我的观察
- 前向渲染绝对是依赖
emitter.data的:比如我在渲染前把它乘以0.1,整个场景就会明显变暗。 - 但反向传播时,系统却坚称最终损失和
emitter.data没有任何依赖关系。
想请教的问题
- 有没有人在Mitsuba 3里做环境图微分的时候遇到过同样的问题?
- 是我哪里操作漏了,还是这本身就是个bug?
多谢各位!
备注:内容来源于stack exchange,提问作者Anson Savage
相关产品推荐
相关产品推荐

