ImportError: cannot import name ‘OrderedDict’ from ‘typing’ 问题解决
运行model.py时报错了 E:\004---CSDN_resource>C:\Users\cxx\anaconda3\Scripts\activate&&conda activate python37(python37)E:\004---CSDN_resource>C:\Users\cxx\anaconda3\envs\python37\python.exe e:/004---CSDN_resource/02_resnet50_image_classification/model.py Traceback(most recent call last): File"e:/004---CSDN_resource/02_resnet50_image_classification/model.py", line3,in<module>from torchvisionimportmodels File"C:\Users\cxx\anaconda3\envs\python37\lib\site-packages\torchvision\__init__.py", line5,in<module>from torchvisionimportdatasets, io, models, ops, transforms, utils File"C:\Users\cxx\anaconda3\envs\python37\lib\site-packages\torchvision\models\__init__.py", line16,in<module>from .maxvitimport* File"C:\Users\cxx\anaconda3\envs\python37\lib\site-packages\torchvision\models\maxvit.py", line3,in<module>from typingimportAny, Callable, List, Optional, OrderedDict, Sequence, Tuple ImportError: cannotimportname'OrderedDict'from'typing'(C:\Users\cxx\anaconda3\envs\python37\lib\typing.py)(python37)E:\004---CSDN_resource>这个报错非常关键,而且你其实已经踩到了一个“版本地雷”。
结论我先给你:
❌不是你的
model.py写错了
❌也不是 ResNet50 的问题
✅是 Python 3.7 + torchvision 版本不兼容导致的
下面我一步一步把原因、判断依据、以及最稳妥的解决方案给你讲清楚,你也可以把这段内容整理进博客,作为“真实踩坑记录”。
文章目录
- ImportError: cannot import name 'OrderedDict' from 'typing' 问题解决
- 一、报错本质是什么?
- 关键点 🔍
- 二、为什么“你什么都没用 maxvit,却还是报错?”
- 三、你的环境组合为什么“必炸”
- 官方兼容关系(简化版)
- 四、最稳妥的 3 种解决方案(按推荐顺序)
- ✅ 方案一(强烈推荐):单独为资源②建 Python 3.8 环境
- 1️⃣ 新建环境
- 2️⃣ 安装匹配版本(CPU 版即可)
- 3️⃣ 再运行 model.py
- ⚠️ 方案二(不推荐,但可用):强行降级 torchvision
- ❌ 方案三(不建议):改 torchvision 源码
- 五、你现在该怎么选?(给你一个“资源作者级建议”)
一、报错本质是什么?
你的核心报错是这一句:
ImportError: cannot import name 'OrderedDict' from 'typing'而它出现在这里:
torchvision\models\maxvit.py from typing import Any, Callable, List, Optional, OrderedDict, Sequence, Tuple关键点 🔍
OrderedDict不属于 typing 模块(Python 3.7)- 它属于
collections或typing_extensions - 但新版 torchvision 假设你使用的是较新的 Python
👉也就是说:你现在的 Python 版本,已经“跟不上”你装的 torchvision 了。
二、为什么“你什么都没用 maxvit,却还是报错?”
这是一个非常容易让人迷糊的地方。
你写的是:
fromtorchvisionimportmodels但实际上 torchvision 内部会:
importtorchvision.models.maxvit也就是说:
哪怕你只想用 ResNet50,只要 torchvision 版本偏新,它就会加载 maxvit。
而 maxvit 是Python ≥ 3.8 时代的模型。
三、你的环境组合为什么“必炸”
你现在的关键信息是:
- Python:3.7
- Torch:1.13.x
- Torchvision:0.14+(隐含)
这是一个不安全组合。
官方兼容关系(简化版)
| Python | Torch | Torchvision | 结论 |
|---|---|---|---|
| 3.7 | ≤1.10 | ≤0.11 | ✅ 稳定 |
| 3.7 | 1.12 / 1.13 | 0.13 / 0.14 | ❌ 高概率炸 |
| ≥3.8 | 1.13 | 0.14 | ✅ 稳定 |
👉你正好处在“官方已经不太照顾”的区间。
四、最稳妥的 3 种解决方案(按推荐顺序)
✅ 方案一(强烈推荐):单独为资源②建 Python 3.8 环境
这是工程上最干净、博客里也最合理的方案。
1️⃣ 新建环境
conda create -n resnet50_py38python=3.8-y conda activate resnet50_py382️⃣ 安装匹配版本(CPU 版即可)
pipinstalltorch==1.13.1torchvision==0.14.1如果你后面要讲 GPU,可以再单独开一篇博客,不要现在纠缠。
3️⃣ 再运行 model.py
python model.py✅问题会直接消失
⚠️ 方案二(不推荐,但可用):强行降级 torchvision
如果你必须留在 Python 3.7(比如资源①已经这样),那就:
pip uninstall torchvision -y pipinstalltorchvision==0.11.3并且 Torch 最好一起降:
pipinstalltorch==1.10.2torchvision==0.11.3📌 缺点:
- ResNet50 还能用
- 但你未来写博客会一直受版本限制
- 不利于后续资源扩展
❌ 方案三(不建议):改 torchvision 源码
网上有人会教你:
fromcollectionsimportOrderedDict然后改maxvit.py。
⚠️这是非常不专业的做法,也不适合教学资源。
五、你现在该怎么选?(给你一个“资源作者级建议”)
站在你现在这个阶段,我明确建议你:
资源①(模板):
允许 Python 3.7,偏“基础工程”
资源②(ResNet50 实战):
👉升级到 Python 3.8,作为“进阶实战”
这在博客里反而是一个加分点,你可以这样写:
“从这个资源开始,我建议使用 Python 3.8,这是当前 PyTorch 工程更主流、也更稳定的选择。”