Informatik @ Exorciser
Action unknown: copypageplugin__copy
ï»ż

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.

Inhaltsverzeichnis

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

Abbildung 1: TensorFlow model mit layers und units3)

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, ReLU sind in der Tensorflow.js API - Advanced Activation dokumentiert (linke Spalte, einfach etwas nach unten scrollen, dann erscheinen diese sogleich).
✍ Auftrag – Layer und Activation
  1. 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.
  2. Verwende nun die 'relu' activation im Hidden Layer. Wie verÀndert sich das Resultat?
  3. FĂŒge einen zweiten Hidden Layer hinzu. Wie verĂ€ndert sich das Resultat?
  4. Spiele noch etwas mit verschiedenen Aktivierungsfunktionen und einem oder mehreren Hidden Layern herum.
  5. 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
  1. Starte das Programm so wie es ist.
  2. Verwende den „adam“ optimizer: optimizer: tf.train.adam(). Wie verĂ€ndert sich das Resultat?
  3. Verwende den „huberLoss“ loss: tf.losses.huberLoss. Wie verĂ€ndert sich das Resultat?
  4. Spiele noch etwas mit verschiedenen optimizern und loss herum
    ⚠ Nicht alle werden funktionieren - egal.
  5. 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, ReLU sind 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.

  1. 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, optimizer tf.train.sgd(LERNRATE), loss tf.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), optimizer tf.train.adam(), loss tf.losses.meanSquaredError.
  2. 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_FEATURES auszukommen. Halte fest, mit welchen Einstellungen du dein bestes Resultat erzielen konntest.Loading ⌛
Zeitreihe mit Sinus und Cosinus der Tagesstunde

Nur Zeitreihe

Eigene Notizen

Loading ⌛

1)
Verschiedene Anwendungsbeispiele fĂŒr TensorFlow sind zu finden auf https://www.tensorflow.org/about/case-studies
2)
TensorFlow-Webseite: https://www.tensorflow.org/
3)
eigene Darstellung, CC0 1.0
p/ki/timeseries2.txt · Zuletzt geÀndert: von Tscherter Vincent