torchvision中_new_empty_tensor的纯torch替代方案及版本适配问题
关于L-DETR中
_new_empty_tensor导入报错的问题解答 1. 包含_new_empty_tensor的最后一版torchvision
_new_empty_tensor是torchvision的私有内部函数,在torchvision 0.13.0版本中被移除。最后包含该函数的稳定版本是torchvision 0.12.x系列(比如0.12.0、0.12.1)。如果要使用仓库原始代码,建议搭配torch 1.12.x + torchvision 0.12.x的版本组合。
2. 纯torch函数替代方案及注意事项
完全可以用原生torch函数替代,原函数_new_empty_tensor(input, output_shape)的核心逻辑是创建指定形状的空张量,同时继承输入张量的设备、数据类型、布局、梯度属性。替代代码如下:
def _new_empty_tensor(input, output_shape): return torch.empty( output_shape, device=input.device, dtype=input.dtype, layout=input.layout, requires_grad=input.requires_grad )
需要注意的点:
- 确保
output_shape是合法的张量形状(由非负整数组成的元组/列表),否则torch.empty会抛出错误,这和原函数行为一致。 - 必须完整继承输入张量的所有属性,避免出现设备不匹配(如CPU张量生成GPU张量)、数据类型不一致(如float32生成float64)等问题,否则会导致后续计算报错。
3. torchvision引入这类函数的原因
torchvision虽然主打图像预处理、视觉模型等上层功能,但内部的视觉任务模块(比如目标检测、语义分割的ops组件)需要大量重复的张量操作逻辑。这类私有函数的作用是封装通用的张量操作逻辑,确保内部代码的一致性,减少重复代码,同时统一处理张量的设备、类型等细节,避免每个模块都手动编写冗余代码。
另外要明确:_new_empty_tensor是torchvision的私有API,并非对外暴露的用户接口,所以torchvision团队不会保证其跨版本兼容性,这也是不同版本间无法导入的原因。
内容的提问来源于stack exchange,提问作者Eypros
相关产品推荐
相关产品推荐

