webentwicklung-frage-antwort-db.com.de

pytorch, AttributeError: Modul 'Brenner' hat kein Attribut 'Tensor'

Ich arbeite mit Python 3.5.1 auf einem Computer mit CentOS Linux 7.3.1611 (Core) als Betriebssystem.

Ich versuche, PyTorch zu verwenden, und ich beginne mit diesem Tutorial .

Leider führt die Zeile # 4 des Beispiels zu Problemen:

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

Ich kann diesen Fehler nicht verstehen ... natürlich hat die "Fackel" in Fackel das Attribut "Tensor". Derselbe Befehl funktioniert in Fackel.

Wie kann ich dieses Problem lösen?

14
DavideChicco.it

Auf der Python-Binärdatei, die Sie ausführen, ist torch nicht installiert. Es hat ein Verzeichnis mit dem Namen torch im Suchpfad des Moduls und wird als Namespace-Paket behandelt :

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

Jedes Verzeichnis ohne eine __init__.py - Datei in Ihrem Modulsuchpfad wird als Namespace behandelt, sofern keine anderen Python Module oder Pakete mit diesem Namen werden an einer anderen Stelle im Suchpfad gefunden .

Dies bedeutet, dass, wenn torch für Ihre Python-Binärdatei installiert wurde, es keine Rolle spielt, ob es ein lokales torch -Verzeichnis gibt:

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

Das Obige zeigt, dass sys.path Zuerst das Verzeichnis torch auflistet, gefolgt von additional_path/torch. Letzteres wird jedoch als Modul torch geladen, wenn Sie versuchen, es zu importieren . Dies liegt daran, dass Python Modulen und Paketen der obersten Ebene Vorrang einräumt, bevor ein Namespace-Paket geladen wird.

Sie müssen den Brenner korrekt für Ihre aktuelle Python Binärdatei installieren (siehe Projekthomepage ; Wenn Sie pip verwenden, möchten Sie möglicherweise stattdessen die Python-Binärdatei mit dem Schalter -m verwenden:

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

Ersetzen Sie also den pip3, Den die Homepage-Anweisungen verwenden, durch python3.5 -m pip; python3.5 Kann auch der vollständige Pfad zu Ihrer Python-Binärdatei sein.

Verwenden Sie für die neueste Version die richtige URL download.pytorch.org.

Sie müssen das Verzeichnis nicht beiseite schieben, aber wenn Sie möchten und nicht wissen, wo es sich befindet, verwenden Sie print(torch.__path__) wie oben gezeigt.

Beachten Sie auch hier, dass, wenn Sie eine __init__.py - Datei in einem lokalen torch -Verzeichnis haben , diese zu einem regulären Paket wird und es maskiert Pakete, die von pip installiert wurden, in den normalen site-packages - Speicherort. Wenn Sie ein solches Paket oder ein lokales torch.py - Einzeldateimodul haben, müssen Sie diese umbenennen. Die Diagnoseinformationen sehen in diesem Fall anders aus:

$ 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

Beachten Sie die Unterschiede. Ein Namespace-Paket oben verwendet <module 'name' (namespace)>, während ein reguläres Paket ), while a plain module uses `verwendet.

Solche Pakete und Module (keine Namespace-Pakete) werden zuerst gefunden und stoppen die Suche. Wenn das gefundene Paket oder Modul nicht das gewünschte ist, müssen Sie es beiseite schieben oder umbenennen.

12
Martijn Pieters

Sieht aus, als würde das Notebook mit python2 laufen.
Siehe den Abschnitt metadata der Datei notebook (in einem Texteditor öffnen).

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


FIX
1. Stellen Sie sicher, dass der python3.5-Kernel für ipython/jupyter installiert ist:
python3.5 -m ipykernel install --name python3.5.1

2. Führen Sie jupyter notebook aus und ändern Sie die Kernelversion im Notizbuch:
 enter image description here



oder ärgerlich den <notebook.ipynb> direkt bearbeiten (nicht empfohlen): 

 "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