You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 12:42:32