- 问题描述

笔者在使用 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。


  1. No module named ‘torchvision.models._utils‘ ↩︎

  2. PyTorch源码解读之torchvision.models ↩︎

  3. Update resnet.py ↩︎

  4. Bug report: changing .utils to .hub ↩︎

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐