我在具有CentOS Linux 7.3.1611(Core)操作系统的计算机上使用Python 3.5.1。
我正在尝试使用PyTorch,我开始使用this tutorial。
不幸的是,该示例的#4行会产生麻烦:
>>> torch.Tensor(5, 3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'torch' has no attribute 'Tensor'
我无法理解这个错误...当然在火炬中'火炬'确实有一个属性'Tensor'。同样的命令在Torch中有效。
我怎么解决这个问题?
您运行的Python二进制文件没有安装torch
。它在模块搜索路径上有一个名为torch
的目录,它被视为namespace package:
$ 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']
上面显示sys.path
首先列出torch
目录,然后是additional_path/torch
,但后者在您尝试导入时作为torch
模块加载。这是因为Python在加载命名空间包之前优先考虑顶级模块和包。
您需要为当前的Python二进制文件正确安装torch,请参阅project homepage;使用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 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
注意差异;上面的命名空间包使用<module 'name' (namespace)>
,而常规包使用)
, while a plain module uses
`。
首先找到此类包和模块(不是命名空间包)并停止搜索。如果找到的包或模块不是您想要的那个,则需要将它们移到一边或重命名它们。
看起来笔记本正在运行python2
。
查看metadata
的notebook file部分(在文本编辑器中打开)
"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
并更改笔记本中的内核版本:
或者直接编辑<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"
}
}