PyTorch,属性错误:模块'torch'没有属性'Tensor'。

19

我正在使用Python 3.5.1在一台运行着CentOS Linux 7.3.1611(核心)操作系统的计算机上工作。

我正在尝试使用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 中可以运行。

我该如何解决这个问题?


>>> torch <module 'torch' (namespace)> - DavideChicco.it
尝试进入你的Python文件夹并找到torch库,以查看出了什么问题。 - Manuel Lagunas
@Rafael 我使用了conda。 - DavideChicco.it
@TarunLalwani 它返回 '/home/davide/torch' - DavideChicco.it
请将文件夹/home/davide/torch重命名为其他名称,然后再试一次。它可能会干扰原始的torch软件包。 - Tarun Lalwani
显示剩余11条评论
6个回答

15
你正在运行的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 模块或包在搜索路径上的其他位置。

这意味着,如果 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']

上述内容表明 sys.path 列出了 torch 目录,其次是 additional_path/torch,但当您尝试导入它时,后者作为 torch 模块被加载。这是因为 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)>,而常规包使用),普通模块使用`.

这样的包和模块(不是命名空间包)首先被找到并停止搜索。如果找到的包或模块不是您想要的,您需要将它们移开或重命名。


1
谢谢,但是它不起作用。我按照你的所有步骤进行了操作,但是仍然没有改变。还有其他想法吗? - DavideChicco.it
@DavideChicco,你能否创建一个pastie或gist来展示你的输出,这样我们就可以诊断出可能出错的地方了吗?python3.5 -m pip freeze列出了torch吗? - Martijn Pieters
以下是python3.5 -m pip freeze命令的输出结果: numexpr==2.6.1 numpy==1.11.1 olefile==0.44 pandas==0.18.1 Pillow==4.3.0 python-dateutil==2.5.3 pytz==2016.6.1 PyYAML==3.12 scikit-learn==0.17.1 scipy==0.17.1 six==1.10.0 tables==3.2.3.1 torch==0.2.0.post3 torchvision==0.1.9 - DavideChicco.it
@DavideChicco.it:所以torch的版本为0.2.0.post3。在您的问题中,python3.5 -c'import torch'是否仍会产生回溯? - Martijn Pieters
@DavideChicco.it:我以为我已经回复了,抱歉耽搁了。我要求的是错误的东西,import torch 明显之前就可以工作。python3.5 -c 'import torch; print(torch) 会产生什么结果? torch.Torch 是否仍然会出现属性错误? - Martijn Pieters
显示剩余9条评论

3

在我的笔记本中安装pytorch模块时,我遇到了类似的问题。我不得不重新启动我的Jupyter Notebook内核,这为我解决了问题。


0

看起来笔记本正在使用 python2 运行。
请查看 笔记本文件metadata 部分(在文本编辑器中打开)

 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.13"
  }
 }


修复
1. 确保已安装适用于 ipython/jupyter 的 python3.5 内核:
python3.5 -m ipykernel install --name python3.5.1

2. 运行 jupyter notebook,并在笔记本中更改内核版本:
enter image description here


或者通过 hack 方法直接编辑 <notebook.ipynb>(不推荐):

 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.5.1",
   "language": "python",
   "name": "python3.5.1"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.1"
  }
 }

0

我遇到了类似的问题。 只需在新的conda环境中安装pytorch即可解决。 如果您想在jupyter笔记本上工作,可能需要再次在新的conda环境中安装jupyter。


2
这个答案需要更多的细节。建议您至少包括您的Python版本和操作系统版本。 - Dave Kielpinski

0

我也遇到了这个问题,最后我发现我的目录中有一个名为“copy.py”的文件,这个名字引起了混乱,我将文件重命名后,问题得到了解决。


-1

我有同样的问题,一个 .py 文件可以正常运行,而另一个则报告此错误。 尝试运行以下命令:

import torch
print(torch.__path__)
If (you get a wrong path): 
  then you know what you need to do.
Else if (even can not get the path printed): 
  just remove the temp file of your IDE(.idea or __pycache__). 

我不知道为什么,但这对我有效。希望能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接