Navigation: đ Teil 1 - đ Teil 2 Loading âLoading â
đ Zeitreihenvorhersage mit TensorFlow 2
đŻ 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.
1. Was ist TensorFlow?
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.
2. Herumexperimentieren mit TensorFlow.js
đĄ 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.
2.1 Layer und Activation

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.
- Activation
- Die gÀngigen Aktivierungsfunktionen sind:
elu,hardSigmoid,linear,relu,relu6,selu,sigmoid,softmax,softplus,softsign,tanh. Sie sind auf dieser Webseite beschrieben. - Die âadvancedâ Aktivierungsfunktionen
LeakyReLU,PReLU,ReLUsind in der Tensorflow.js API - Advanced Activation dokumentiert (linke Spalte, einfach etwas nach unten scrollen, dann erscheinen diese sogleich).
â Auftrag â Layer und Activation
- Starte das Programm so wie es ist (1 Hidden Layer mit 'tanh' activation). Ăndere die activation 'linear' im Output Layer nicht, diese activation erlaubt es beliebig grosse Zahlen vorherzusagen. Z.B. 'tanh' kann nur Zahlen im Bereich -1 und +1 produzieren.
- Verwende nun die 'relu' activation im Hidden Layer. Wie verÀndert sich das Resultat?
- FĂŒge einen zweiten Hidden Layer hinzu. Wie verĂ€ndert sich das Resultat?
- Spiele noch etwas mit verschiedenen Aktivierungsfunktionen und einem oder mehreren Hidden Layern herum.
- Loading âWenn du dir nun zutraust, verschiedene Aktivierungsfunktionen und ein oder mehrere Hidden Layer einzustellen, dann bestĂ€tige mit âErledigtâ sonst hole Hilfe.
2.2 Optimizer und LOSS
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
- Die TensorFlow.js optimizer sind auf TensorFlow.js API - Optimizers aufgelistet und beschrieben (linke Spalte, einfach etwas nach unten scrollen, dann erscheinen diese sogleich).
- Loss
- Die TensorFlow.js loss Funktionen sind auf TensorFlow.js API - Training Losses aufgelistet und beschrieben (linke Spalte, einfach etwas nach unten scrollen, dann erscheinen diese sogleich).
â Auftrag â Layer und Activation
- Starte das Programm so wie es ist.
- Verwende den âadamâ optimizer:
optimizer: tf.train.adam(). Wie verĂ€ndert sich das Resultat? - Verwende den âhuberLossâ loss:
tf.losses.huberLoss. Wie verÀndert sich das Resultat? - Spiele noch etwas mit verschiedenen optimizern und loss herum
â ïž Nicht alle werden funktionieren - egal. - Loading âWenn du dir nun zutraust, verschiedene optimizer und loss einzustellen, dann bestĂ€tige mit âErledigtâ sonst hole Hilfe.
3. Labor und Auftrag
- Activation
- Die gÀngigen Aktivierungsfunktionen sind:
elu,hardSigmoid,linear,relu,relu6,selu,sigmoid,softmax,softplus,softsign,tanh. Sie sind auf dieser Webseite beschrieben. - Die âadvancedâ Aktivierungsfunktionen
LeakyReLU,PReLU,ReLUsind in der TensorFlow.js API - Advanced Activation dokumentiert (linke Spalte, einfach etwas nach unten scrollen, dann erscheinen diese sogleich).
- Optimizer
- Die TensorFlow.js optimizer sind auf TensorFlow.js API - Optimizers aufgelistet und beschrieben (linke Spalte, einfach etwas nach unten scrollen, dann erscheinen diese sogleich).
- Loss
- Die TensorFlow.js loss Funktionen sind auf TensorFlow.js API - Training Losses aufgelistet und beschrieben (linke Spalte, einfach etwas nach unten scrollen, dann erscheinen diese sogleich).
â Auftrag
đĄ 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.
- Vergleiche die folgenden beiden AnsÀtze:
- âTraditionellerâ Ansatz: Möglichst gutes Resultat mit möglichst wenig Hidden Neuronen erzielen (mit nur 1 Hidden Layer). HĂ€ufig werden fĂŒr diesen Ansatz genutzt: activation
tanh, optimizertf.train.sgd(LERNRATE), losstf.losses.meanSquaredError. - Moderner âDeep Learningâ Ansatz: Mehr als ein Hidden Layer und genĂŒgend Hidden Neuronen verwenden. HĂ€ufig werden fĂŒr diesen Ansatz genutzt: activation
relu(in allen Hidden Layern), optimizertf.train.adam(), losstf.losses.meanSquaredError.
- Spiele mit allen Möglichkeiten etwas herum (Anzahl Epochen, Anzahl Zeitreihenpunkte, Anzahl der Hidden Layer und Neuronen, Aktivierungsfunktionen, optimizer und allenfalls Lernrate, loss). Versuche mit möglichst wenigen
TIMESERIES_FEATURESauszukommen. Halte fest, mit welchen Einstellungen du dein bestes Resultat erzielen konntest.Loading â
Zeitreihe mit Sinus und Cosinus der Tagesstunde
Nur Zeitreihe
Eigene Notizen
Loading â