web-dev-qa-db-fra.com

pytorch, AttributeError: le module 'torche' n'a aucun attribut 'Tensor'

Je travaille avec Python 3.5.1 sur un ordinateur doté du système d'exploitation CentOS Linux 7.3.1611 (Core).

J'essaie d'utiliser PyTorch et je commence à utiliser ce tutoriel .

Malheureusement, la ligne n ° 4 de l'exemple crée des problèmes:

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

Je ne comprends pas cette erreur ... bien sûr, dans Torch, la "torche" a un attribut "Tensor". La même commande fonctionne dans Torch.

Comment puis-je résoudre ce problème?

14
DavideChicco.it

torch n'est pas installé sur le binaire Python que vous exécutez. Il a un répertoire nommé torch sur le chemin de recherche du module, et il est traité comme un paquet d'espace de nom } _:

$ 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'])

Tout répertoire sans fichier __init__.py, situé dans le chemin de recherche de votre module, sera traité comme un espace de noms, à condition que aucun autre module ou package Python portant ce nom ne soit trouvé ailleurs dans le chemin de recherche.

Cela signifie que si torch a été installé pour votre binaire Python, peu importe s'il existe un répertoire local 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']

Ce qui précède montre que sys.path répertorie d’abord le répertoire torch, suivi de additional_path/torch, mais ce dernier est chargé en tant que module torch lorsque vous essayez de l’importer. En effet, Python donne la priorité aux modules et packages de niveau supérieur avant de charger un package d'espace de noms.

Vous devez installer correctement la torche pour votre binaire Python actuel, voir le page d'accueil du projet _; lorsque vous utilisez pip, vous voudrez peut-être utiliser le binaire Python avec le commutateur -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

Remplacez donc le pip3 par les instructions de la page d’accueil avec python3.5 -m pip; python3.5 peut également être le chemin complet de votre binaire Python.

Utilisez l'URL download.pytorch.org correcte pour la dernière version.

Vous n'avez pas à déplacer le répertoire de côté, mais si vous voulez et ne savez pas où il se trouve, utilisez print(torch.__path__) comme je l'ai montré ci-dessus.

Encore une fois, notez que si do a un fichier __init__.py dans un répertoire local torch, il devient un paquet standard et masque les paquets installés par pip à l’emplacement site-packages normal. Si vous disposez d'un tel package ou d'un module local à fichier unique torch.py, vous devez les renommer. Les informations de diagnostic sont différentes dans ce cas:

$ 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

Notez les différences. Un paquet d'espace de noms, ci-dessus, utilise <module 'name' (namespace)>, alors qu'un paquet ordinaire utilise ), while a plain module uses`. 

Ces packages et modules (pas les packages d'espace de noms) sont trouvés en premier et arrêtent la recherche. Si le package ou le module trouvé n'est pas celui que vous souhaitiez, vous devez le déplacer ou le renommer.

12
Martijn Pieters

On dirait que le bloc-notes fonctionne avec python2.
Voir la section metadata du fichier du cahier } (ouvert dans un éditeur de texte).

 "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"
  }
 }


R&EACUTE;PARER
1. Assurez-vous que le noyau python3.5 pour ipython/jupyter est installé:
python3.5 -m ipykernel install --name python3.5.1

2. Exécutez jupyter notebook et changez la version du noyau dans le cahier:
enter image description here



ou modifiez le <notebook.ipynb> directement (non recommandé): 

 "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
stacksonstacks