用模型预测值替换张量像素值后,torch.equal返回True问题排查
问题原因与解决方案
核心问题:张量浅拷贝导致引用指向同一对象
你执行pa = patches时,并没有创建新的张量副本,只是让变量pa和patches指向内存中同一个张量实例。因此,后续对pa的修改本质上就是直接修改原张量patches的内容。这时候用torch.equal(pa, patches)对比,结果必然是True——因为它们本来就是同一个对象。
验证替换成功的正确方式
方式1:创建原张量的独立副本后修改
通过clone()方法创建原张量的深拷贝,这样副本和原张量是完全独立的对象,修改副本后对比两者就能验证替换效果:
# 创建原张量的深拷贝 pa = patches.clone() # 执行替换操作 batch_range = torch.arange(batch, device=device)[:, None] pa[batch_range, masked_indices, :] = pred_pixel_values # 此时对比pa和原patches,若替换有效则返回False print(torch.equal(pa, patches))
方式2:直接修改原张量,验证目标位置的数值匹配
如果不需要保留原张量,可以直接修改它,然后针对性验证被mask位置的数值是否与预测值一致:
# 直接修改原张量 batch_range = torch.arange(batch, device=device)[:, None] patches[batch_range, masked_indices, :] = pred_pixel_values # 验证目标位置的数值是否与预测值匹配(用allclose处理浮点精度问题) print(torch.allclose(patches[batch_range, masked_indices, :], pred_pixel_values))
内容的提问来源于stack exchange,提问作者S.EB
相关产品推荐
相关产品推荐

