pytorch,AttributeError:模块'torch'没有属性'Tensor'

新手上路,请多包涵

我在装有 CentOS Linux 7.3.1611 (Core) 操作系统的计算机上使用 Python 3.5.1

我正在尝试使用 PyTorch 并开始学习 本教程

不幸的是,示例的#4 行造成了麻烦:

 >>> torch.Tensor(5, 3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'torch' has no attribute 'Tensor'

我无法理解这个错误……当然在 Torch 中,’torch’ 确实有一个属性 ‘Tensor’。同样的命令在 Torch 中也有效。

我怎么解决这个问题?

原文由 DavideChicco.it 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.4k
1 个回答

您正在运行的 Python 二进制文件没有安装 torch 。它在模块搜索路径上 确实 有一个名为 torch 的目录,并且它被视为 命名空间包

 $ pwd
/some/path
$ python3 -c 'import torch; print(torch); print(torch.__path__)'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ModuleNotFoundError: No module named 'torch'
$ mkdir torch
$ python3 -c 'import torch; print(torch); print(torch.__path__)'
<module 'torch' (namespace)>
_NamespacePath(['/some/path/torch'])

任何没有 __init__.py 文件的目录,位于您的模块搜索路径上,将被视为命名空间,前提是在搜索路径的其他任何地方都 _没有找到具有该名称的其他 Python 模块或包_。

这意味着如果为您的 Python 二进制文件安装了 torch ,则是否存在本地 torch 目录并不重要:

 $ ls -ld torch/
drwxr-xr-x  2 mjpieters users  68 Nov 23 13:57 torch/
$ mkdir -p additional_path/torch/
$ touch additional_path/torch/__init__.py
$ PYTHONPATH="./additional_path" python3 -c 'import os.path as p, sys; print(*(t for t in (p.join(e, "torch") for e in sys.path) if p.exists(t)), sep="\n")'
torch
/some/path/additional_path/torch
$ PYTHONPATH="./additional_path" python3 -c 'import torch; print(torch); print(torch.__path__)'
<module 'torch' from '/some/path/additional_path/torch/__init__.py'>
['/some/path/additional_path/torch']

The above shows that sys.path lists the torch directory first, followed by additional_path/torch , but the latter is loaded as the torch module when you尝试导入它。这是因为 Python 在加载命名空间包之前优先考虑顶级模块和包。

您需要为当前的 Python 二进制文件正确安装 torch,请参阅 项目主页;使用 pip 时,您可能希望使用带有 -m 开关的 Python 二进制文件:

 python3.5 -m pip install http://download.pytorch.org/whl/cu80/torch-0.2.0.post3-cp35-cp35m-manylinux1_x86_64.whl
python3.5 -m pip install torchvision

所以将主页说明中使用的—替换为 pip3 python3.5 -m pippython3.5 也可以是 Python 二进制文件的完整路径。

请使用正确的 download.pytorch.org 最新版本的 URL。

您不必将目录移到一边,但如果您确实想要但不知道它位于何处,请使用 print(torch.__path__) 如上所示。

同样,请注意,如果您在本地 torch 目录中 确实 有一个 __init__.py 文件,它将成为一个常规包,它会屏蔽由 pip 安装的包正常 site-packages 位置。如果你有这样的包,或本地 torch.py 单文件模块,你需要重命名它们。在这种情况下,诊断信息看起来有所不同:

 $ pwd
/some/path
$ python3 -c 'import torch; print(torch); print(torch.__path__)'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ModuleNotFoundError: No module named 'torch'
$ mkdir torch
$ touch torch/__init__.py  # make it a package
$ python3 -c 'import torch; print(torch); print(torch.__path__)'
<module 'torch' from '/some/path/torch/__init__.py'>
['/some/path/torch']
$ rm -rf torch/
$ touch torch.py           # make it a module
$ python3 -c 'import torch; print(torch); print(torch.__file__)'
<module 'torch' from '/some/path/torch.py'>
/some/path/torch.py

注意差异;上面的命名空间包使用 <module 'name' (namespace)> ,而常规包使用 ) , while a plain module uses `。

此类包和模块(不是命名空间包)首先被发现并停止搜索。如果找到的包或模块不是您想要的,则需要将它们移到一边或重命名。

原文由 Martijn Pieters 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题