- 问题描述
笔者在使用 pytorch=1.10.0, torchvision=0.11.1
的环境运行代码时,运行到语句 from torchvision.models.utils import load_state_dict_from_url
时会出现以下报错:
>>> from torchvision.models.utils import load_state_dict_from_url
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'torchvision.models.utils'
而该语句在 pytorch=1.2.0, torchvision=0.4.0
以及 pytorch=1.6.0, torchvision=0.7.0
下均能运行。
- 原因探寻
相关博客1指出:
报错原因是torchvision的版本0.2太低,安装个0.4的就可以的
因此,安装相应版本的 torchvision
确实可以解决这个问题,并且这个语法在低版本和最新的版本中都不支持了。
参考对不同版本的 torchvision.models
的源码解析,可以看出新旧版本在导入预训练模型时代码的区别。
新版本为:PyTorch源码解读之torchvision.models
稍旧版本为:PyTorch 75. PyTorch实现ResNet的代码解读
- 解决方法
- 方法一
安装相应的 torchvision
版本,目前实测 0.4.0~0.7.0 的版本均支持此类语句。
- 方法二
更改导入预训练模型的语句,可以借鉴ResNet源码的导入方式2,使用
import torch.utils.model_zoo as model_zoo
model.load_state_dict(model_zoo.load_url(model_urls['resnet18']))
方式导入预训练模型。
- 方法三
通过查阅 torchvision 的代码仓库【1】,还有另一种解决方法34:
The original code “from .utils import load_state_dict_from_url” is not applicable.
you connot import load_state_dict_from_url from .utils.
change “.utils” to “torch.hub” can fix the problem.
即将 from torchvision.models.utils import load_state_dict_from_url
改为 from torch.hub import load_state_dict_from_url
。
注意,此语法只针对较高版本的pytorch。