自定义TorchScript模型在Python与DJL中推理结果不一致问题咨询
解答
Q1:结果不符的核心原因
1. 图像预处理逻辑不一致(主因)
Python代码和DJL代码的图像输入张量取值范围完全不同:
- Python端使用
PILToTensor(),将图像转为张量后直接转成FloatTensor,此时张量取值范围是0-255,和原始图像像素值一致; - DJL端的
ToTensor()默认会将图像像素值归一化到0-1范围(这是DJL的默认行为,对齐torchvision的ToTensor())。
你的模型是基于0-255范围的输入训练/导出的,DJL传入的0-1范围张量会导致模型输出严重偏离预期,这是概率值差异巨大的核心原因。
2. PyTorch版本兼容(次要)
PyTorch 2.0.x导出的TorchScript模型在1.13.x环境下运行确实可能存在兼容性风险,但从结果差异的幅度来看,预处理问题是主要诱因。
Q2:修改方案
方案1:调整DJL预处理,取消归一化
修改ToTensor()的配置,关闭自动归一化,让输入张量保持0-255范围:
val translator = ImageClassificationTranslator.builder() .setPipeline(Pipeline().apply { add(Resize(128)) // 关闭归一化,匹配Python端的输入范围 add(ToTensor.builder().optNormalize(false).build()) }) .optSynsetArtifactName("synset.txt") .build()
这是最直接的修复方式,不需要修改模型或依赖版本。
方案2:升级DJL的PyTorch依赖版本
如果要解决版本兼容问题,可在依赖管理中指定对应PyTorch 2.0.1的DJL依赖:
- Gradle示例:
dependencies { implementation "ai.djl.pytorch:pytorch-engine:0.24.0" runtimeOnly "ai.djl.pytorch:pytorch-native-auto:2.0.1" }
- Maven示例:
<dependency> <groupId>ai.djl.pytorch</groupId> <artifactId>pytorch-engine</artifactId> <version>0.24.0</version> </dependency> <dependency> <groupId>ai.djl.pytorch</groupId> <artifactId>pytorch-native-auto</artifactId> <version>2.0.1</version> <scope>runtime</scope> </dependency>
注意DJL引擎版本和PyTorch原生库版本需要匹配,具体对应关系可参考DJL官方版本说明。
方案3:修改Python端预处理对齐DJL
如果不想调整DJL代码,可修改Python端的预处理逻辑,将输入归一化到0-1范围后重新训练或导出模型:
tensor_transform = T.Compose([ T.Resize((128, 128)), T.ToTensor() # 自动将像素值归一化到0-1范围 ])
内容的提问来源于stack exchange,提问作者DVH Oscar
相关产品推荐
相关产品推荐

