Tensorflow: Neuronales Netz ableiten

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Üpsilon
User
Beiträge: 222
Registriert: Samstag 15. September 2012, 19:23

Hallo,

ich möchte im Prinzip das Gleiche machen was hier gemacht wird:
https://github.com/maziarraissi/PINNs/b ... Burgers.py

In meinen Worten: Man hat eine Differentialgleichung, und man hat für eine Lösung der Differentialgleichung Werte an gewissen Punkten gegeben. Jetzt fittet man ein neuronales Netz an diese Lösung regressionsmäßig ran. Allerdings soll das Netz die Differentialgleichung respektieren. Deswegen leitet man das Netz ab, und man packt in die Loss-Funktion auch noch Terme rein, die messen, wie weit die Ableitung des Netzes von den Werten entfernt liegt, die die Ableitung nach der Differentialgleichung haben soll. Dieses Prinzip nennt sich "physics informed neural networks".
(Das ist noch nicht alles was hier gemacht werden soll, es geht noch damit weiter, dass die Differentialgleichung von einem unbekannten Parameter abhängt und man dann herausfinden will, welcher Parameter zur gegebenen Lösung passt.)

Offenbar ist der verlinkte Code aber für eine alte Tensorflow-Version geschrieben. Deswegen versuche ich jetzt, das für die neue Version mittels tf.keras nachzumachen. Das ist das erste Mal, dass ich Tensorflow benutze.

Ich bekomme es nun nicht hin, das Netz so abzuleiten. Bis jetzt habe ich:

Code: Alles auswählen

model = tf.keras.Sequential(
        [tf.keras.layers.Dense(n_neurons, activation="tanh", input_shape=(1,))]
        + [tf.keras.layers.Dense(n_neurons, activation="tanh") for _ in range(n_layers-1)]
        + [tf.keras.layers.Dense(1)])
model.compile(optimizer="adam", loss="mse", metrics="mse")

with tf.GradientTape() as tape:
    xx = tf.Variable([[1.]])
    yy = model(xx)
print(tape.gradient(yy, [xx]))
Da kommt immerhin ein Tensorobjekt mit einer Zahl als Ableitung raus.

Allerdings: so wie ich den oben verlinkten Code verstehe (ausführen kann ich ihn ja nicht ^^), wird dort nicht "mit Zahlen" abgeleitet, sondern das neuronale Netz wird mit lauter tf.placeholder-Objekten belegt (und die gibt es im neuen Tensorflow nicht mehr), und dann wird mit den Platzhaltern "abstrakt" abgeleitet, und erst später, beim Training, werden Zahlen eingesetzt. Falls ich das richtig verstehe: so möchte ich es auch machen.

Kann mir jemand einen Tipp geben, wie das geht?

€: Ich bin durch herumsuchen auch schon auf die "Keras Functional API" https://www.tensorflow.org/guide/keras/functional gestoßen, aber damit kriege ich das auch nicht hin.
PS: Die angebotene Summe ist beachtlich.
Üpsilon
User
Beiträge: 222
Registriert: Samstag 15. September 2012, 19:23

Nicht alle auf einmal :)

Ist die Frage schlecht gestellt, fehlen im Beitrag oben irgendwelche Infos, oder ist das Thema zu speziell?
PS: Die angebotene Summe ist beachtlich.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Das Problem (für mich) ist, dass dies 4-jahre alter Tensorflow Code ist. Als ich mit Tensorflow angefangen habe, war dies schon veraltet und ich habe direkt mit Keras gearbeitet, welches einem ja eine Menge dieses umständlichen Codes abnimmt. Wenn du das umsetzen willst auf aktuellen TF 2.x Code müsstest du dich in alte Dokus von vor 5 Jahren einarbeiten. Ich habe dazu nicht die Zeit und auch nicht unbedingt die Lust. :-)
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
Antworten