Navigation: 📈 Teil 1 - 📈 Teil 2 Loading ⌛Loading ⌛
🎯 In dieser Reihe erfährst du, wie du mit neuronalen Netzen Zeitreihen vorhersagen kannst und erhältst Einblicke in das Programmierer-Framework „TensorFlow“.
↩️ Zurück zum ersten Teil.
Künstliche_Intelligenz in der Form von neuronalen Netzen wird in der Forschung und für zahlreiche Anwendungen eingesetzt. Das Schreiben von Programmen zum Erstellen, Trainieren, Auswerten und Anwenden von neuronalen Netzen ist aufwändig.
Damit nicht alle „das Rad neu erfinden“ müssen, gibt es mehrere Sammlungen von Programmcodestücken (sogenannte Frameworks) für neuronale Netze, die als Open_Source gekennzeichnet sind, d.h. frei genutzt werden können. Diese Open-Source-Frameworks werden von Freiwilligen (Community), Organisationen oder/und Firmen weiterentwickelt. Das vermutlich bekannteste und umfangreichste Neuronale-Netz-Framework ist TensorFlow. Z.B. nutzt Spotify TensorFlow, um Musikempfehlungen zusammenzustellen1).
Obwohl TensorFlow2) ursprünglich von Google für die Programmiersprache Python entwickelt wurde, ist TensorFlow mittlerweile für mehrere Programmiersprachen verfügbar, unter anderem auch für JavaScript.
Obwohl TensorFlow viel Programmierarbeit abnimmt, ist die Nutzung immer noch aufwändig und braucht viel Einarbeitungszeit. Das liegt daran, dass sich TensorFlow nur mit fortgeschrittenen JavaScript-Programmiertechniken und -konzepten nutzen lässt. Aus diesem Grund gibt es mittlerweile „Meta-Frameworks“, welche den Gebrauch von TensorFlow vereinfachen, wie z.B. Keras für Python oder ml5.js für JavaScript.
Die Programme in diesen Kapiteln nutzen direkt TensorFlow für JavaScript. Der Grund dafür liegt darin, dass das Meta-Framework ml5.js (im Gegensatz zu Keras) für unsere Zwecke zu viele Einstellungen für das Training von neuronalen Netzen vorgibt.
TensorFlow für JavaScript wird als Tensorflow.js bezeichnet. Auf der Tensorflow.js-Webseite gibt es Tutorials, Demos und bereits fertig trainierte neuronale Netze, welche frei genutzt werden dürfen. Eine Auflistung und Beschreibung aller TensorFlow.js-Komponenten ist auf Tensorflow.js API zu finden.
💡 Da die Handhabung von TensorFlow.js relativ aufwändig ist, wurden alle Programmteile, welche für die Erstellung und das Training der neuronalen Netze relevant sind, in die „Parametersektion“ ganz oben im Programmen verschoben. Somit musst du dich nicht vertieft mit den JavaScript-Konzepten von TensorFlow.js auseinandersetzen, sondern kannst dich auf die Möglichkeiten konzentrieren, welche TensorFlow.js dir bietet.
In TensorFlow wird ein neuronales Netz als model bezeichnet. TensorFlow nutzt per Default ein sogenanntes Feedforward Neural Network, welches aus mehreren layers (Schichten) aufgebaut ist. Jeder layer besteht aus mehreren units (Neuronen). Jeder unit besitzt eine activation (Aktivierungsfunktion).
Die beiden Sourcecode unten zeigen, wie in TensorFlow ein neuronales Netz aus mehren layer aufgebaut wird. Im Code links ist ein neuronales Netz mit nur einem Hidden Layer definiert, rechts ein neuronales Netz mit zwei Hidden Layers.
Jeder tf.layers.dense(...)
Abschnitt stellt einen Hidden Layer dar. Der Input Layer wird gerade mit dem ersten Hidden Layer zusammen definiert durch die Zeile inputShape
, wobei in den [
]
-Klammern die Anzahl der Eingangsgrössen (Input Neuronen) definiert wird (hier die Anzahl TIMESERIES_FEATURES
plus Sinus und Cosinus der Tagesstunde). Das letzte tf.layers.dense(...)
stellt den Output Layer dar. Alle weiteren Hidden Layer beinhalten keine inputShape
-Zeile, diese kommt nur im ersten Hidden Layer vor. Um einen Hidden Layer hinzuzufügen oder zu entfernen, wird einfach ein tf.layers.dense(...)
Abschnitt hinzugefügt oder entfernt und der Name hinter name
entsprechend angepasst.
„Einfaches“ Modell | „Deep Learning“ Modell |
---|---|
const MODEL_LAYERS = [ tf.layers.dense({ name: 'HiddenLayer1', inputShape: [TIMESERIES_FEATURES + 2], units: ANZAHL_HIDDEN_NEURONS, activation: 'tanh' }), tf.layers.dense({ name: 'OutputLayer', units: 1, activation: 'linear' }) ]; | const MODEL_LAYERS = [ tf.layers.dense({ name: 'HiddenLayer1', inputShape: [TIMESERIES_FEATURES + 2], units: ANZAHL_HIDDEN_NEURONS, activation: 'relu' }), tf.layers.dense({ name: 'HiddenLayer2', units: ANZAHL_HIDDEN_NEURONS, activation: 'relu' }), tf.layers.dense({ name: 'OutputLayer', units: 1, activation: 'linear' }) ]; |
Für jeden Hidden und Output Layer können andere Aktivierungsfunktionen gewählt werden. Die Aktivierungsfunktion wird nach activation
eingetragen.
elu
, hardSigmoid
, linear
, relu
, relu6
, selu
, sigmoid
, softmax
, softplus
, softsign
, tanh
. Sie sind auf dieser Webseite beschrieben.LeakyReLU
, PReLU
, ReLU
sind in der Tensorflow.js API - Advanced Activation dokumentiert (linke Spalte, einfach etwas nach unten scrollen, dann erscheinen diese sogleich).
Für das Training des neuronalen Netzes müssen der optimizer (Update- oder Lernalgorithmus) und der loss (Fehlerfunktion) festgelegt werden. Dies wird in TensorFlow im folgenden Code festgelegt.
const MODEL_COMPILE = { optimizer: tf.train.sgd(LERNRATE), loss: tf.losses.meanSquaredError };
Nicht alle optimizer brauchen eine Lernrate. Z.B. kommt der aktuell sehr beliebte „adam“ Algorithmus ohne Lernrate aus. Dieser kann mit optimizer: tf.train.adam()
verwendet werden.
optimizer: tf.train.adam()
. Wie verändert sich das Resultat?tf.losses.huberLoss
. Wie verändert sich das Resultat?
elu
, hardSigmoid
, linear
, relu
, relu6
, selu
, sigmoid
, softmax
, softplus
, softsign
, tanh
. Sie sind auf dieser Webseite beschrieben.LeakyReLU
, PReLU
, ReLU
sind in der TensorFlow.js API - Advanced Activation dokumentiert (linke Spalte, einfach etwas nach unten scrollen, dann erscheinen diese sogleich).💡 Die beiden untenstehenden Programme sind zum Experimentieren gedacht. Das neuronale Netz im roten Bereich nutzt die Zeitreihe + Sinus und Cosinus der Tageszeit. Das neuronale Netz im gelben Bereich nutzt nur die Zeitreihe und stellt somit die grössere Herausforderung dar. Die folgenden Aufträge können mit einem oder beiden Programmen durchgeführt werden.
tanh
, optimizer tf.train.sgd(LERNRATE)
, loss tf.losses.meanSquaredError
.relu
(in allen Hidden Layern), optimizer tf.train.adam()
, loss tf.losses.meanSquaredError
.TIMESERIES_FEATURES
auszukommen. Halte fest, mit welchen Einstellungen du dein bestes Resultat erzielen konntest.Loading ⌛
Loading ⌛