Verfasst am: 28.09.2019, 12:30
Titel: Funktion linear approximieren mit Neuronalem Netz
Hallo zusammen,
ich habe einen Code gefunden, welcher in Python eine Funktion mittels eines neuronalen Netzes approximiert. Dies würde ich aufgrund fehlender Pythonkentnisse gern in Matlab durchführen, kann mir hier jemand weiterhelfen, wie eine solche Funktion in Matlab auszusehen hat?
Zielstellung: Es gibt eine Funktion f(x), welche dem Netzwerk nicht bekannt ist. Es soll ein neuronales Netzwerk g(x) aufgesetzt und angelernt werden, welches diese Funktion approximiert.
Umsetzung in Python:
Code:
% Import Keras and Numpy Stuff we need
from keras.models import Sequential
from keras.layers.core import Dense, Activation
from keras.optimizers import Adadelta
import numpy as np
f = lambda x: 0.2+0.4*x**2+0.3*x*np.sin(15*x)+0.05*np.cos(50*x)
x = np.linspace(0, 1, 101)
y = f(x)
X = x.reshape((-1, 1)) print(np.shape(X))% (100, 1) print(np.shape(y))% (100, )
model = Sequential()% Sequentielles Netz, d.h. Layer nach Layer...
model.add(Dense(input_dim=1, output_dim=300, init="uniform"))
model.add(Activation("relu"))
model.add(Dense(output_dim=1, init="uniform"))
Was haben wir jetzt aufgesetzt? Ein Dense Layer ist ein Fully Connected Layer, d.h. jedes Neuron soll mit jedem des nächsten verbunden werden. Input hat die Dimension 1. Unser Inputvektor x hat die Form [100, 1]. Wie bereits beschrieben, bedeutet die Länge 100, dass wir 100 Werte haben, welche aber die Dimension 1 haben. Die Output Dimension wurde mit 300 initialisiert, das bedeutet, dass das Netzwerk 300 Neuronen bekommt im 1. Layer. Die Initialisierung soll ‘uniform’, d.h. gleichverteilt erfolgen.
Als Aktivierungsfunktion wird die ReLu Funktion hinzugefügt.
Anschließend, als Output-Layer wieder ein Fully-Connected Layer mit einer Output Dimension, d.h. das Netzwerk soll keine Klassifizierung o.ä. machen, sondern eine reale Zahl ausgeben. Diese müssen wir nun irgendwie mit dem Sollwert, d.h. der Funktion f(x) vergleichen und dem Netzwerk eine Loss-Funktion mitteilen.
In Keras wird das aufgesetzte Modell mit Loss Funktion (in dem Fall der mittlere quadratische Fehler) und Optimizer (in dem Fall Adadelta) gleich kompiliert, d.h. wenn möglich als optimierter GPU Code im Hintergrund erzeugt. Nun ist alles aufgesetzt und in Code gegossen. Nun kann man es lernen lassen.
Das Lernen erfolgt mit jeweils 15 der 100 Werte aus dem Eingangsvektor x. Die Fehlerfunktion wird 10.000x die gemachten mittleren quadratischen Fehler via Backpropagation auf die Gewichte w und b zurück verteilen. Je nach Initialisierung und Loss Funktion und Aktivierungsfunktion und gewählter Hyperparameter, lernt das Netzwerk schneller oder langsamer.
---------
Bisher habe ich leider nur folgenden Ansatz gefunden:
Vielleicht könnt ihr mir da weiterhelfen, wie man diesen Ansatz in Matlab einfach und effizient umsetzt. Einen Aufruf von Python aus Matlab aus, würde ich aufgrund fehlender Pythonkentnisse gern vermeiden wollen.
Grüße und Dank
MaikPloitz
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 30.09.2019, 19:42
Titel:
Keiner eine Idee oder einen Ansatz?
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.