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

Dav*_*.it 14 python torch centos7 python-3.5 pytorch

我在具有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'
Run Code Online (Sandbox Code Playgroud)

我无法理解这个错误...当然在火炬中'火炬'确实有一个属性'Tensor'.同样的命令在Torch中有效.

我怎么解决这个问题?

Mar*_*ers 11

您运行的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'])
Run Code Online (Sandbox Code Playgroud)

__init__.py位于模块搜索路径上的任何没有文件的目录都将被视为命名空间,前提在搜索路径的任何其他位置找不到其他Python模块或包名.

这意味着如果torch为您的Python二进制文件安装了,那么是否存在本地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']
Run Code Online (Sandbox Code Playgroud)

上面显示的是首先sys.path列出torch目录,然后是additional_path/torch,但后者torch在您尝试导入时作为模块加载.这是因为Python在加载命名空间包之前优先考虑顶级模块和包.

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

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
Run Code Online (Sandbox Code Playgroud)

所以更换pip3主页说明使用python3.5 -m pip; python3.5也可以是Python二进制文件的完整路径.

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

您不必将目录移到一边,但如果您确实想要并且不知道它位于何处,请print(torch.__path__)按照上面的说明使用.

再次,注意,如果你这样做有一个__init__.py在本地文件torch目录,就变成一个普通包,它会掩盖由安装包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
Run Code Online (Sandbox Code Playgroud)

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

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