DPN(Dual Path Networks,双路径网络)是一种创新的卷积神经网络架构,由 Chen Yunpeng 等人提出。DPN 结合了 ResNet(残差路径)和 DenseNet(密集连接路径)的优势,通过双路径机制让信息流动更加高效。该模型在 ImageNet-1K 数据集上预训练,适用于图像分类任务。
本仓库提供 dpn131.mx_in1k 在华为昇腾 NPU 上的适配与推理实现,包含完整的推理脚本、精度对比工具和测试结果。参数量大,适合高精度要求的分类任务。
图像分类 (Image Classification - ImageNet-1K, 1000 classes)
| 参数 | 值 |
|---|---|
| 参数量 | 83.8M |
| 输入尺寸 | 224x224 |
| 输入通道 | 3 |
| 类别数 | 1000 (ImageNet-1K) |
| 组件 | 版本 |
|---|---|
| Python | 3.11 |
| PyTorch | 2.9.0+cpu |
| torch_npu | 2.9.0.post1 |
| timm | 1.0.27 |
| ModelScope | 1.35.3 |
| CANN | 8.5.1 |
| NPU | Ascend910 |
| OS | Linux (aarch64) |
该模型使用 timm 框架的 DPN 实现,在昇腾 NPU 上无需额外修改即可运行。适配过程:
snapshot_download)timm.create_model() 创建模型并加载本地权重.to("npu:0") 将模型移至 NPU 设备create_transform 进行图像预处理# 安装依赖(使用清华 PyPI 镜像)
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple torch torchvision timm modelscope pillow numpy
# 安装 torch_npu(昇腾 NPU 支持)
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple torch_npucd dpn131_mx_in1k
python3 inference.py --device cpucd dpn131_mx_in1k
python3 inference.py --device npucd dpn131_mx_in1k
python3 compare_cpu_npu.py使用合成测试图像进行推理。
| Rank | Class ID |
|---|---|
| 1 | 21 |
| 2 | 512 |
| 3 | 600 |
| 4 | 818 |
| 5 | 902 |
| Rank | Class ID |
|---|---|
| 1 | 21 |
| 2 | 512 |
| 3 | 600 |
| 4 | 818 |
| 5 | 902 |
| 指标 | 值 |
|---|---|
| 最大绝对 Logit 差异 | 0.00494879 |
| 平均绝对 Logit 差异 | 0.00119871 |
| 最大绝对概率差异 | 0.00003241 |
| 平均绝对概率差异 | 0.00000131 |
| 最大相对误差 | 0.1449% |
| Logits 余弦相似度 | 0.99999870 |
| CPU 预测类别 | 600 |
| NPU 预测类别 | 600 |
| Top-1 类别一致 | 是 |
| Top-5 重合数 | 5/5 |
NPU 与 CPU 推理结果误差 < 1%(最大相对误差: 0.1449%)。
NPU 与 CPU 的推理结果在数值上高度一致,余弦相似度达到 0.9999 以上,Top-1 和 Top-5 预测类别完全一致。昇腾 NPU (Ascend910) 在该模型上的推理精度完全满足要求。
| 设备 | 推理耗时 (ms) | 加速比 |
|---|---|---|
| CPU (Intel Xeon) | 826.00 | 1x |
| NPU (Ascend910) | 16.49 | 50.09x |

dpn131_mx_in1k/
├── inference.py # NPU/CPU 推理脚本
├── compare_cpu_npu.py # CPU vs NPU 精度对比脚本
├── requirements.txt # 依赖包列表
├── precision_results.json # 精度测试结果 (JSON)
├── precision_test.log # 精度测试日志
├── terminal_screenshot.png # 模拟终端输出截图
└── README.md # 本文件import torch
import torch_npu
from PIL import Image
from timm import create_model
from timm.data import create_transform, IMAGENET_DEFAULT_MEAN, IMAGENET_DEFAULT_STD
model_arch = "dpn131"
model = create_model(model_arch, pretrained=False, num_classes=1000)
# 加载本地权重
import timm
timm.models.load_checkpoint(model, "./model.safetensors")
model.eval()
model.to("npu:0")
# 预处理图像
transform = create_transform(
input_size=(3, 224, 224),
is_training=False,
mean=IMAGENET_DEFAULT_MEAN,
std=IMAGENET_DEFAULT_STD,
interpolation='bicubic',
)
image = Image.open("test.jpg").convert("RGB")
input_tensor = transform(image).unsqueeze(0).to("npu:0")
# 推理
with torch.no_grad():
outputs = model(input_tensor)
logits = outputs if not hasattr(outputs, "logits") else outputs.logits
probs = torch.softmax(logits, dim=-1)
pred = torch.argmax(probs, dim=-1).item()
print(f"Predicted class: {pred}")python3 compare_cpu_npu.py该脚本会依次在 CPU 和 NPU 上运行推理,输出详细的精度对比结果,并保存在 precision_results.json 中。
以下日志展示了 NPU 推理成功的关键信息:
Top-1 match: True
Top-5 overlap: 5/5