Versionsinkompatibilitäten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
fgm
User
Beiträge: 13
Registriert: Mittwoch 6. November 2019, 18:45

Hallo,

mal eine grundsätzliche Frage zu Python-Versionsverwaltungen:

ich habe mir den Code zu zwei Büchern über Tensorflow und Keras
angeschaut und versucht, den Code auzuprobieren.

Grundsätzlich gibt es offenichtlich einige Versionsunteschiede zwischen Tensorflow 1 und 2,
und auch Keras ist bei Version 2 in Tensorflo integriert, was Syntaxunterschiede bewirkt.
Dese grundsätzlichen Probleme sind lösbar.

Es gibt auch ein automatisches Update-Skript unter:
https://www.tensorflow.org/guide/upgrade

womit sich Syntaxunterschiede zwischen Tensorflow 1 und 2 in den Griff automatisiert
konvertieren lassen.

Trotzdem habe ich noch nciht viele der Skripte dazu bekommen, ohne irgendwelche
Syntaxfehler durchzulaufen.

Mal ein paar Beispiele:

Code: Alles auswählen

NameError: name 'get_ipython' is not defined

Code: Alles auswählen

python dqn_lunar_lander.py 
  File "dqn_lunar_lander.py", line 357
    self.env.close()
       ^     
  SyntaxError: invalid syntax       

Code: Alles auswählen

AttributeError: module 'gym' has no attribute 'undo_logger_setup'

Code: Alles auswählen

from scipy.misc import imresize
ImportError: cannot import name 'imresize' from 'scipy.misc' (/home/pyuser/anaconda3/envs/tensorflow_env/lib/python3.7/site-packages/scipy/misc/__init__.py)
In den Software-Spezificationen (im Readme) steht: "Python 3.6 and above"
auf meinem System ist Python3.7.5 installiert.

Gibt es eine Möglichkeit, diese Versionsprobleme allgemein zu lösen?
Müssen bei jedem Skript-Aufruf die exakt passenden Versionen alle einzelnen Bibliotheken
vorliegen? (wenn ja: wie wären die herauszufinden und zu laden)?

Vielen Dank für Hinweise auf allgemein Informationen dazu, wie sich diese
Kompatibilitätsprobleme und die Syntaxfehler möglichst allgemein lösen lassen!
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Außer einem sind das keine Syntaxfehler. Die anderen sind alles falsche Version der Bibliotheken (die auch alle nicht mit Python selbst kommen, sondern nachträglich installiert wurden) zum aus dem Netz geklaubten Code. Du musst die halt lesen, verstehen, die Dokumentation zur konkret installierten Version in die Hand nehmen, und das anpassen. Ein magisches Pflaster zum alles heile machen gibt’s nicht. Ich sehe wenig Sinn darin, verschiedenen Code mit verschiedenen Versionen zum laufen zu bewegen, wenn man das lernen will. Vor allem auch weil die Bibliotheken nicht trivial zu installieren sind. Darum würde ich bei einer Version bleiben, und den Code eben dafür anpassen.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Das Problem gibt es auch mit Büchern die kein halbes Jahr alt sind.
Erstelle dir sogenannte virtuelle Environments https://docs.python.org/3/tutorial/venv.html
und darin jeweils die python version die im Buch genannt ist, sowie die Module mit den entsprechenden Versionsnummern.
Wie das geht kannst du z.B. hier nachlesen: https://stackoverflow.com/questions/419 ... tensorflow
Dann solltest du den Code ohne große Veränderungen ans Laufen kriegen.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich waere da ein bisschen skeptisch. Zum einen musst du ein venv erstellen mit dem gewuenschten Python (z.B python3.7 -m venv name-des-venvs), nicht andersherum. Aber jenseits davon sind oft die 3rd-party-Abhaengigkeiten das Problem, Dinge wie CUDA etc.

Last but not least hilft es nicht so viel, wenn man 10 Schnipsel Code laufen lassen kann, aber nicht eines daraus backen. Das muss man dann schon portieren.
fgm
User
Beiträge: 13
Registriert: Mittwoch 6. November 2019, 18:45

Danke für die Tips.
>Erstelle dir sogenannte virtuelle Environments https://docs.python.org/3/tutorial/venv.html
>und darin jeweils die python version die im Buch genannt ist, sowie die Module mit den entsprechenden Versionsnummern.

Das liegt ein Problem für sich: wenn ich die Verisonsnummern hätte, könnte ich ja wahrscheinlich ein virtual environment
erstellen. Was aber, wenn eine ganze Reihe von Modulen importiert wrden und keine Angaben zu den Versionnummern vorliegen?
Muss ich die Versionen dann am Quelltext jedes Moduls erkennen?
Bei vielen Tutorials im Netz steht nicht dabei, welche Versionen verwende wurden (oder aus welchem Jahr sie sind).
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn der Ersteller eines Beitrags oder Skriptes dazu keine Informationen liefert - explizit, oder implizit mit zB einer setup.py oder requirements.txt-Datei - dann kannst du nur raten.
fgm
User
Beiträge: 13
Registriert: Mittwoch 6. November 2019, 18:45

Das mit setup.py war ein sehr guter Hinweis.
In einem Beispielordner habe ich die gefunden.
Ich habe also erst eine neue Conda-Environment erstellt:

Code: Alles auswählen

conda create --name keras_rl python=3.7 -y
dann habe ich

Code: Alles auswählen

pip install .
ausgeführt.

Um dann beim Start des ersten Skriptes doch wieder eine
Fehlermeldung zu kriegen:
no module named tensorflow.

Dann habe ich

Code: Alles auswählen

conda install tensorflow
ausgeführt.

Dank kommt:
no module named wandb

Ich frage mich: ist diese setup.py unvollständig?

Eine Datei requirements.txt gibt es auch,
die ist aber sehr kurz:
numpy
mkdocs
python-markdown-math

Wandb oder tensorflow sind nicht dabei.

Probiere ich jetzt:

Code: Alles auswählen

conda install wandb 
Oder

Code: Alles auswählen

pip ionstall wandb
Gibt es da allgemein eine etwas strukturiertere Vorgehensweise,
als einfach nur rumzuprobieren?
fgm
User
Beiträge: 13
Registriert: Mittwoch 6. November 2019, 18:45

Nachdem ich noch weitere Module mit
pip install ...
installiert habe, die nicht in requirements oder setup.py
standen, kommt dann eine neue Fehlermeldung:

AttributeError: module 'keras.backend' has no attribute 'image_dim_ordering'
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da du nicht zeigst, woher der Code stammt, kann man auch nicht sagen, ob das was da dargestellt ist vollstaendig ist oder nicht. Googelt man aber deine Fehlermeldung, dann findet man zB https://github.com/keras-team/keras/issues/12649, und lernt, dass es eben anders heisst in einer neueren Version von tensorflow. Das mag frustrierend sein, aber die Verantwortung hier liegt bei den Quellen, aus denen die Skripte stammen.
fgm
User
Beiträge: 13
Registriert: Mittwoch 6. November 2019, 18:45

Der Code stammt von hier:
https://github.com/PacktPublishing/Kera ... g-Projects
Bzw.: den Code mit Requirements gibt es für registrierte User auf www.packtpub.com
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@fgm: Eine `setup.py` und/oder `requirements.txt` ist für Dein Problem übrigens auch nur die halbe Miete — mal davon ausgehend das sie vollständig/gepflegt sind. Denn in dem was Du gezeigt hast sind ja keine Versionsnummern enthalten. Das kann man machen, denn sowohl `setup.py` als auch `requirements.txt` sieht es vor das man da auch Versionen angeben kann. Wie __deets__ schon schrieb: das liegt in der Verantwortung der Quellen wo Du den Code her hast. Wenn die Code zeigen und wollen das den andere nachvollziehen können, dann müssten *die* dafür sorgen das man leicht eine Umgebung für diesen Code erstellen kann, und zwar auch noch ein Jahr nachdem sie den Code veröffentlicht haben.

Wenn das zu einem Buch gehört und Du dafür bezahlt hast, solltest Du Dich IMHO nicht scheuen die Möglichkeiten der Kontaktaufnahme zu nutzen die der Autor angibt. Zum Beispiel auf der Github-Projektseite steht ein Link für Rückmeldung und Vorschläge.

Ich habe mal in zwei Dateien reingeschaut und in Verbindung mit dem Autor-Blurb der da steht (PhD in environmental technical physics and two master's degrees. […] over 15 years of work experience in programming (in Python, R, and MATLAB)) bedient der IMHO voll das Klischee das Ingenieure nicht programmieren können, aber fest davon überzeugt sind sie könnten das besser als echte Programmierer die ja nur Theoretiker sind.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
fgm
User
Beiträge: 13
Registriert: Mittwoch 6. November 2019, 18:45

Ich habe jetzt für einen Fehler:

TypeError: len is not well defined for symbolic Tensors. (activation_4/Identity:0) Please call `x.shape` rather than `len(x)` for shape information.

nochmal weiter gegoogelt.

Dafür wird (u.a. hier: https://github.com/wau/keras-rl2/issues/4) empfohlen,
tensorflow-beta zu installieren.
Das habe ich (in einem neuen environment mit pip) auch gemacht, was nur dazu führt,
dass ich einen Fehler "ungültiger Maschinenbefehl" bekommen
(den ich durch Installation von conda in Verbindung mit tensorflow2 schon mal
gelöst hatte).

Woran diese Inkompatibiltität jetzt liegt und wie ich sie lösen könnte: k.A.
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@fgm: Ist Dir klar was „nightly“ und „beta“ bedeutet? Willst Du das wirklich?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
fgm
User
Beiträge: 13
Registriert: Mittwoch 6. November 2019, 18:45

Nein. Aber außer auf die Beta-Version zuzugreifen, wie hier vorgeschlagen:
https://github.com/wau/keras-rl2/issues/4
habe ich noch keine Idee bekommen, wie ich diesen TypeError
(len is not well defined for symbolic Tensor)
überhaupt beheben könnte.
Im Quelltext gibt es keine Stelle, wo ich len einfach gegen shape ersetzten könnte
(der Fehler entsteht implizit in irgendeiner Bibliothek).
Anscheinend handelt es sich ja um eine Inkompatitbilität von Bibliotheken.
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@fgm: Da wo die Beta vorgeschlagen wird, wird aber auch eine Nightly-Version verwendet. Statt dann noch eine Beta-Version von irgendwas zu verwenden, also immer weiter in die aktuell aber ungetestet Richtung zu gehen, würde ich ja eher schauen mit welcher älteren nicht-experimentellen Version/Versionskombination das Problem nicht mehr auftritt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
fgm
User
Beiträge: 13
Registriert: Mittwoch 6. November 2019, 18:45

Ich habe schon z.B. mit tensorflow 1.5.0 probiert, da gibt es auch Syntaxfehler.
Es ist wohl auch Teil des Problems, dass es keine konkreten Anhaltspunkte dafür gibt,
welche Versionen von was ich eigentlich ersetzen (oder verwenden) soll, damit
es keine Fehlermeldungen mehr gibt.
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Natürlich gibt es die - die passende Dokumentation zu einer konkreten Version von TF (und ggf Keras, aber AFAIK ist das in neueren Versionen enthalten in TF). Mit der in der Hand, und einem Verständnis dafür was ein Stück Code erreichen soll, kann man das portieren. Was nicht klappt ist wahllos Code und Versionen aufeinander prallen zu lassen.

Installier dir die aktuelle TF Version, verifizier sie anhand von Beispielen aus DER Version, und dann portier deine Skripte.
Antworten