Zurück zu allen Blogbeiträgen

Einführung TensorFlow

  • Coding
  • Deep Learning
  • Python
17. November 2017
·

Sebastian Heinz
CEO

TensorFlow ist aktuell eines der wichtigsten Frameworks zur Programmierung von neuronalen Netzen, Deep Learning Modellen und anderen Machine Learning Algorithmen. Es basiert auf einem C++ Low Level Backend, das jedoch über eine Python Library gesteuert wird. TensorFlow lässt sich sowohl auf CPU als auch GPU (Clustern) ausführen. Seit kurzem existiert auch ein R Package, mit dem TensorFlow genutzt werden kann. TensorFlow ist keine Software für Deep Learning oder Data Science Einsteiger sondern richtet sich klar an erfahrene Anwender, die über solide Programmierkenntnisse verfügen. Seit einiger Zeit gibt es jedoch Keras, eine High Level API, die mit vereinfachten Funktionen auf TensorFlow aufbaut und die Implementierung von Standardmodellen schnell und einfach gestaltet. Dies ist nicht nur für Deep Learning Einsteiger interessant sondern auch für Experten, die durch den Einsatz von Keras ihre Modelle schneller und effizienter prototypen können.

Der folgende Beitrag soll die zentralen Elemente und Konzepte von TensorFlow näher erläutern und anhand eines Praxisbeispiels verdeutlichen. Der Fokus liegt dabei nicht auf der formalen mathematischen Darstellung der Funktionsweise neuronaler Netze, sondern auf den grundlegenden Konzepten und Terminologien von TensorFlow sowie deren Umsetzung in Python.

Tensoren

In der ursprünglichen Bedeutung beschreibt ein Tensor den Absolutbetrag sog. Quaterionen, komplexer Zahlen, die den Wertebereich reeler Zahlen erweitern. Heutzutage ist diese Bedeutung jedoch nicht mehr gebräuchlich. Unter einem Tensor versteht man heute eine Verallgemeinerung von Skalaren, Vektoren und Matrizen. Ein zweidimensionaler Tensor ist also eine Matrix mit Zeilen und Spalten (also zwei Dimensionen). Insbesondere höherdimensionale Matrizen werden häufig als Tensoren bezeichnet. Die Bedeutung Tensor ist grundsätzlich jedoch unabhängig von der Anzahl der vorliegenden Dimensionen. Somit kann ein Vektor also als 1-dimensionaler Tensor beschrieben werden. In TensorFlow fließen also Tensoren - durch den sog. Graphen.

Der Graph

Die grundlegende Funktionsweise von TensorFlow basiert auf einem sog. Graphen. Dieser bezeichnet eine abstrakte Darstellung des zugrunde liegenden mathematischen Problems in Form eines gerichteten Diagramms. Das Diagramm besteht aus Knoten und Kanten die miteinander verbunden sind. Die Knoten des Graphen repräsentieren in TensorFlow Daten und mathematische Operationen. Durch die richtige Verbindung der Knoten kann ein Graph erstellt werden, der die notwendigen Daten und mathematischen Operationen zur Erstellung eines neuronalen Netzes beinhaltet. Das folgende Beispiel soll die grundlegende Funktionsweise verdeutlichen:

Beispiel graph

In der obenstehenden Abbildung sollen zwei Zahlen addiert werden. Die beiden Zahlen werden in den Variablen a und b gespeichert. Die Variablen fließen durch den Graphen bis zur quadratischen Box, an der eine Addition durchgeführt wird. Das Ergebnis der Addition wird in der Variablen c gespeichert. Die Variablen a, b und c können als Platzhalter, in TensorFlow "placeholder" genannt, verstanden werden. Alle Zahlen, die für a und b eingesetzt werden, werden nach dem gleichen Ablauf verarbeitet. Diese abstrakte Darstellung der durchzuführenden mathematischen Operationen in der Kern von TensorFlow. Der folgende Code zeigt die Umsetzung dieses einfachen Beispiels in Python:

# TensorFlow laden 
import tensorflow as tf 

# a und b als Platzhalter definieren 
a = tf.placeholder(dtype=tf.int8) 
b = tf.placeholder(dtype=tf.int8) 

# Die Addition definieren 
c = tf.add(a, b) 

# Den Graphen initialisieren 
graph = tf.Session() 

# Den Graphen an der Stelle c ausführen 
graph.run(c)



Zunächst wird die TensorFlow Library importiert. Danach werden die beiden Platzhalter a und b mittels tf.placeholder() definiert. Da TensorFlow auf einem C++ Backend basiert, müssen die Datentypen der Platzhalter im Voraus fix definiert und können nicht zur Laufzeit angepasst werden. Dies geschieht innerhalb der Funktion tf.placeholder() mit dem Argument dtype=tf.int8, was einem 8-bit Integer (Ganzzahl) entspricht. Über die Funktion tf.add()werden nun die beiden Platzhalter miteinander addiert und in der Variable c gespeichert. Mittels tf.Session() wird der Graph initialisiert und anschließend durch graph.run(c) an der Stelle c ausgeführt. Natürlich handelt es sich bei diesem Beispiel um eine triviale Operation. Die benötigten Schritte und Berechnungen in neuronalen Netzen sind deutlich komplexer. Die prinzipielle Funktionsweise der graphenbasierten Ausführung bleibt jedoch bestehen.

Platzhalter

Wie bereits zuvor beschrieben, spielen Platzhalter in TensorFlow eine zentrale Rolle. Platzhalter beinhalten in der Regel alle Daten, die zum Training des neuronalen Netzes benötigt werden. Hierbei handelt es sich normalerweise um Inputs (die Eingangssignale des Modells) und Outputs (die zu vorhersagenden Variablen).

# Platzhalter definieren 
X = tf.placeholder(dtype=tf.float32, shape=[None, p]) 
Y = tf.placeholder(dtype=tf.float32, shape=[None])

Im obigen Codebeispiel werden zwei Platzhalter definiert. X soll als Platzhalter für die Inputs des Modells dienen, Y als Platzhalter für die tatsächlich beobachteten Outputs in den Daten. Neben dem Datentyp der Platzhalter muss noch die Dimension der Tensoren definiert werden, die in den Platzhaltern gespeichert werden. Dies wird über das Funktionsargument shape gesteuert. Im Beispiel handelt es sich bei den Inputs um einen Tensor der Dimension [None, p] und bei dem Output um einen eindimensionalen Tensor. Der Parameter None weist TensorFlow an, diese Dimension flexibel zu halten, da im aktuellen Stadium noch unklar ist, welche Ausdehnung die Daten zum Trainieren des Modells haben werden.

Variablen

Neben Platzhaltern sind Variablen ein weiteres Kernkonzept der Funktionsweise von TensorFlow. Während Platzhalter zum Speichern der Input- und Outputdaten verwendet werden, sind Variablen flexibel und können Ihre Werte während der Laufzeit der Berechnung verändern. Der wichtigste Anwendungsbereich für Variablen in neuronalen Netzen sind die Gewichtungsmatrizen der Neuronen (Weights) und Biasvektoren (Biases), die während des Trainings stetig an die Daten angepasst werden. Im folgenden Codeblock werden die Variablen für ein einschichtiges, Feedforward Netz definiert.

# Anzahl der zu Inputs und Outputs 
n_inputs = 10 
n_outputs = 1 

# Anzahl der Neuronen 
n_neurons = 64 

# Hidden Layer: Variablen für Weights und Biases 
w_hidden = tf.Variable(weight_initializer([n_inputs, n_neurons])) 
bias_hidden = tf.Variable(bias_initializer([n_neurons])) 

# Output layer: Variablen für Weights und Biases 
w_out = tf.Variable(weight_initializer([n_neurons, n_outputs])) 
bias_out = tf.Variable(bias_initializer([n_outputs]))

Im Beispielcode werden n_inputs = 10 Inputs und n_outputs = 1 Outputs definiert. Die Anzahl der Neuronen im Hidden Layer beträgt n_neurons = 64. Im nächsten Schritt werden die benötigten Variablen instanziert. Für ein einfaches Feedforward Netz werden zunächst die Gewichtungsmatrizen und Biaswerte zwischen Input- und Hidden Layer benötigt. Diese werden in den Objekten w_hidden und bias_hidden mittels der Funktion tf.Variable() angelegt. Innerhalb von tf.Variable() wird weiterhin die Funktion weight_initializer() verwendet, auf die wir im nächsten Abschnitt genauer eingehen. Nach der Definition der benötigten Variablen zwischen Input- und Hidden Layer werden noch die Weights und Biases zwischen Hidden- und Output Layer instanziert.

Es ist wichtig zu verstehen, welche Dimensionen die benötigten Matrizen der Weights und Biases annehmen müssen, damit sie korrekt verarbeitet werden. Als Daumenregel für Gewichtungsmatrizen in einfachen Feedforward Netzen gilt, dass die zweite Dimension des vorhergehenden Layers die erste Dimension des aktuellen Layers darstellt. Was sich zunächst sehr komplex anhört ist schlussendlich nichts anderes als das Weiterreichen von Outputs von Layer zur Layer im Netz. Die Dimension der Biaswerte entspricht normalerweise der Anzahl der Neuronen im aktuellen Layer. Im obigen Beispiel wird somit aus der Anzahl Inputs und der Anzahl Neuronen eine Gewichtungsmatrix der Form [n_inputs, n_neurons] = [10, 64] sowie ein Biasvektor im Hidden Layer der Ausdehnung [bias_hidden] = [64]. Zwischen dem Hidden- und Output Layer hat die Gewichtungsmatrix die Form [n_neurons, n_outputs] = [64, 1] sowie der Biasvektor die Form [1].

Initialisierung

Bei der Definition der Variablen im Codeblock des vorhergehenden Abschnitts wurde die Funktionen weight_initializer() und bias_initializer() verwendet. Die Art und Weise, wie die initialen Gewichtungsmatrizen und Biasvektoren gefüllt werden, hat einen großen Einfluss darauf, wie schnell und wie gut sich das Modell an die vorliegenden Daten anpassen kann. Dies hängt damit zusammen, dass neuronale Netze und Deep Learning Modelle mittels numerischer Optimierungsverfahren trainiert werden, die immer von einer bestimmten Startposition aus beginnen die Parameter des Modells anzupassen. Wenn nun eine vorteilhafte Startposition für das Training des neuronalen Netzes gewählt wird, wirkt sich dies in der Regel positiv auf die Rechenzeit und Anpassungsgüte des Modells aus.

In TensorFlow sind verschiedenste Initialisierungsstrategien implementiert. Angefangen von einfachen Matrizen mit immer dem gleichen Wert, z.B. tf.zeros_initializer() über Zufallswerte, z.B. tf.random_normal_initializer() oder tf.truncated_normal_initializer() bis hin zu komplexeren Funktionen wie tf.glorot_normal_initializer() oder tf.variance_scaling_initializer(). Je nachdem, welche Initialisierung der Gewichte und Biaswerte vorgenommen wird, kann das Ergebnis des Modelltrainings mehr oder weniger stark variieren.

# Initializers 
weight_initializer = tf.variance_scaling_initializer(mode="fan_avg", distribution="uniform", scale=1) 
bias_initializer = tf.zeros_initializer()

In unserem Beispiel verwenden wir zwei verschiedene Initialisierungsstrategien für die Gewichte und Biaswerte. Während zur Initialisierung der Gewichtungen tf.variance_scaling_initializer() verwendet wird, nutzen wir tf.zeros_initializer() für die Biaswerte.

Design der Netzwerkarchitektur

Nach der Implementierung der benötigten Gewichtungs- und Biasvariablen wird im nächsten Schritt die Netzwerkarchitektur, auch Topologie genannt, erstellt. Hierbei werden sowohl Platzhalter als auch Variablen in Form von aufeinanderfolgenden Matrizenmultiplikationen miteinander kombiniert.

Weiterhin werden bei der Spezifikation der Topologie auch die Aktivierungsfunktionen der Neuronen festgelegt. Aktivierungsfunktionen führen eine nichtlineare Transformation der Outputs der Hidden Layer durch bevor diese an den nächsten Layer weitergegeben werden. Dadurch wird das gesamte System nichtlinear und kann sich dadurch sowohl an lineare als auch nichtlineare Funktionen anpassen. Es existieren zahllose Aktivierungsfunktionen für neuronale Netze, die sich im Laufe der Zeit entwickelt haben. Heutiger Standard bei der Entwicklung von Deep Learning Modellen ist die sog. Rectified Linear Unit (ReLU), die sich in vielen Anwendungen als vorteilhaft herausgestellt hat.

# Hidden layer 
hidden = tf.nn.relu(tf.add(tf.matmul(X, w_hidden), bias_hidden)) 

# Output layer 
out = tf.transpose(tf.add(tf.matmul(hidden, w_out), bias_out))

ReLU Aktivierungsfunktionen sind in TensorFlow mittels tf.nn.relu() implementiert. Die Aktivierungsfunktion nimmt den Output der Matrizenmultiplikation zwischen Platzhalter und Gewichtungsmatrix sowie der Addition der Biaswerte entgegen und transformiert diese, tf.nn.relu(tf.add(tf.matmul(X, w_hidden), bias_hidden)). Das Ergebnis der nichtlinearen Transformation wird als Output an den nächsten Layer weitergegeben, der diesen als Input einer erneuten Matrizenmultiplikation verwendet. Da es sich beim zweiten Layer bereits um den Output Layer handelt, wird in diesem Beispiel keine erneute ReLU Transformation durchgeführt. Damit die Dimensionalität des Output Layers mit derer der Daten übereinstimmt muss nochmals mittels tf.transpose() eine Transponierung der Matrix vorgenommen werden. Andernfalls kann es zu Problemen bei der Schätzung des Modells kommen.

Architektur von TensorFlow

Die oben stehende Abbildung soll die Architektur des Netzwerkes schematisch illustrieren. Das Modell besteht aus drei Teilen: (1) dem Input Layer, (2) dem Hidden Layer sowie (3) dem Output Layer. Diese Architektur nennt man Feedforward Netzwerk. Feedforward beschreibt die Tatsache, dass die Daten nur in eine Richtung durch das Netzwerk fließen. Andere Arten von neuronalen Netzen und Deep Learning Modellen beinhalten Architekturen, die es den Daten erlauben sich auch "rückwärts" oder in Schleifen im Netzwerk zu bewegen.

Kostenfunktion

Die Kostenfunktion (Cost Function) des neuronalen Netzes wird verwendet, um eine Maßzahl zur Bestimmung der Abweichung zwischen der Prognose des Modells und den tatsächlich beobachteten Daten zu berechnen. Hierzu stehen, je nachdem, ob es sich um eine Klassifikation oder Regression handelt, verschiedene Kostenfunktionen zur Verfügung. Für Klassifikationen wird heute zumeist die sog. Kreuzentropie (Cross Entropy) verwendet, für Regressionen die mittlere quadratische Abweichung (Mean Squared Error, MSE). Grundsätzlich kann jede mathematisch differenzierbare Funktion als Kostenfunktion verwendet werden.

# Cost function 
mse = tf.reduce_mean(tf.squared_difference(out, Y))

Im obigen Beispiel wird die mittlere quadratische Abweichung als Kostenfunktion implementiert. Hierzu stehen in TensorFlow die beiden Funktionen tf.reduce_mean() sowie tf.squared_difference() zur Verfügung, die einfach miteinander kombiniert werden können. Man sieht, dass die Funktionsargumente von tf.squared_difference() zum einen der Platzhalter Y ist, der die tatsächlich beobachteten Outputs enthält sowie das Objekt out, das die vom Modell erzeugten Prognosen beinhaltet. An der Kostenfunktion laufen also die tatsächlich beobachteten Daten mit den Modellprognosen zusammen und werden miteinander verglichen.

Optimierer

Der Optimierer (Optimizer) hat die Aufgabe, auf Basis der berechneten Modellabweichungen der Kostenfunktion, die Gewichte und Biaswerte des Netzes während des Trainings anzupassen. Um dies zu tun, werden von TensorFlow sog. Gradienten der Kostenfunktion berechnet, die die Richtung anzeigen, in der die Gewichte und Biaswerte angepasst werden müssen, um die Kostenfunktion des Modells zu minimieren. Die Entwicklung von schnellen und stabilen Optimierern ist ein großer Forschungszweig im Bereich neuronaler Netze und Deep Learning.

# Optimizer 
opt = tf.train.AdamOptimizer().minimize(mse)

Hier wird der sog. tf.AdamOptimizer()verwendet, der im Moment einer der am häufigsten angewendeten Optimierer ist. Adam steht für Adaptive moment estimation und ist eine methodische Kombination von zwei anderen Optimierungstechniken (AdaGrad und RMSProp). An dieser Stelle gehen wir nicht auf die mathematischen Details der Optimierer ein, da dies den Scope dieser Einführung deutlich sprengen würde. Wichtig zu verstehen ist, dass es verschiedene Optimierer gibt, die auf unterschiedlichen Strategien zur Berechnung der benötigten Anpassungen der Gewichtungs- und Biaswerte basieren.

Session

Die TensorFlow Session ist das Grundgerüst zur Ausführung des Graphen. Die Session wird mit dem Kommando tf.Session() gestartet. Bevor die Session nicht gestartet wurde, kann keine Berechnung innerhalb des Graphen erfolgen.

# Session starten 
graph = tf.Session()

In dem Codebeispiel wird eine TensorFlow Session in dem Objekt graph instanziert und kann im Folgenden an einer beliebigen Stelle im Graphen ausgeführt werden. In den aktuellen Entwicklungsversionen (Dev-Builds) von TensorFlow entstehen Ansätze den Code auch ohne die Definition einer Session auszuführen. Aktuell ist dies jedoch nicht im Stable Build enthalten.

Training

Nachdem die notwendigen Bestandteile des neuronalen Netzes definiert wurden, können diese nun im Rahmen des Modelltrainings miteinander verbunden werden. Das Training von neuronalen Netzen läuft heute in der Regel über ein sog. "Minibatch Training" ab. Minibatch bedeutet, dass wiederholt zufällige Stichproben der Inputs und Outputs verwendet werden, um die Gewichtungen und Biaswerte des Netzes anzupassen. Hierzu wird ein Parameter definiert, der die Größe der Zufallsstichprobe (Batches) der Daten steuert. Hierbei ist es häufig so, dass die Daten ohne Zurücklegen gezogen werden, sodass jede Beobachtung im Datensatz für eine Trainingsrunde (auch Epoche genannt) nur einmal dem Netz präsentiert wird. Die Anzahl der Epochen wird ebenfalls als Parameter durch den Anwender definiert.

Die einzelnen Batches werden über die zuvor erstellten Platzhalter X und Y mittels Feed Dictionary in den TensorFlow Graphen übergeben und entsprechend im Modells verwendet. Dies geschieht in Kombination mit der zuvor definierten Session.

# Aktuellen Batch in Netzwerk übergeben 
graph.run(opt, feed_dict={X: data_x, Y: data_y})

Im obigen Beispiel wird der Optimierungsschritt opt im Graphen durchgeführt. Damit TensorFlow die notwendigen Berechnungen ausführen kann, müssen über das Argument feed_dict Daten in den Graphen übergeben werden, die für die Berechnungen an die Stelle der Platzhalter X und Y treten sollen.

Nach der Übergabe mittels feed_dict wird X über die Multiplikation mit der Gewichtungsmatrix zwischen Input und Hidden Layer in das Netz eingespeist und durch die Aktivierungsfunktion nichtlinear transformiert. Anschließend wird das Ergebnis des Hidden Layers wiederum mit der Gewichtungsmatrix zwischen Hidden und Output Layer multipliziert und an den Output Layer weitergereicht. Hier wird durch die Kostenfunktion die Differenz zwischen der Prognose des Netzes und den tatsächlich beobachteten Werten Y berechnet. Auf Basis des Optimierers werden nun für jeden einzelnen Gewichtungsparameter im Netz die Gradienten berechnet. Die Gradienten wiederum sind die Basis auf denen eine Anpassung der Gewichtungen in Richtung der Minimierung der Kostenfunktion durchgeführt wird. Diesen Vorgang nennt man auch Gradient Descent. Anschließend wird der soeben beschriebene Prozess mit dem nächsten Batch erneut durchgeführt. Das neuronale Netz bewegt sich also in jeder Iteration näher in Richtung der Kostenminimierung, sprich in Richtung einer kleineren Abweichung zwischen Prognose und beobachteten Werten.

Anwendungsbeispiel

Im folgenden Beispiel sollen die zuvor vermittelten Konzepte nun anhand eines praktischen Beispiels dargestellt werden. Zur Durchführung benötigen wir zunächst einige Daten auf Basis derer das Modell trainiert werden kann. Diese können mittels der in sklearn enthaltenen Funktion sklearn.datasets.make_regression() einfach und schnell simuliert werden.

# Anzahl der zu Inputs, Neuronen und Outputs 
n_inputs = 10 
n_neurons = 64 
n_outputs = 1 

# Daten für das Modell simulieren 
from sklearn.datasets import make_regression 
data_x, data_y = make_regression(n_samples=1000, n_features=n_inputs, n_targets=n_outputs)

Wie im obigen Beispiel verwenden wir 10 Inputs und 1 Output zur Erstellung eines neuronalen Netzes zur Prognose des beobachteten Outputs. Anschließend definieren wir Platzhalter, Initialisierung, Variablen, Netzarchitektur, Kostenfunktion, Optimierer und Session in TensorFlow.

# Platzhalter definieren 
X = tf.placeholder(dtype=tf.float32, shape=[None, n_inputs]) 
Y = tf.placeholder(dtype=tf.float32, shape=[None]) 

# Initializers 
weight_initializer = tf.variance_scaling_initializer(mode="fan_avg", distribution="uniform", scale=1) 
bias_initializer = tf.zeros_initializer() 

# Hidden Layer: Variablen für Weights und Biases 
w_hidden = tf.Variable(weight_initializer([n_inputs, n_neurons])) 
bias_hidden = tf.Variable(bias_initializer([n_neurons])) 

# Output layer: Variablen für Weights und Biases 
w_out = tf.Variable(weight_initializer([n_neurons, n_outputs])) 
bias_out = tf.Variable(bias_initializer([n_outputs])) 

# Hidden Layer 
hidden = tf.nn.relu(tf.add(tf.matmul(X, w_hidden), bias_hidden)) 

# Output Layer 
out = tf.transpose(tf.add(tf.matmul(hidden, w_out), bias_out)) 

# Kostenfunktion 
mse = tf.reduce_mean(tf.squared_difference(out, Y)) 

# Optimizer 
opt = tf.train.AdamOptimizer().minimize(mse) 

# Session starten 
graph = tf.Session()

‍Nun beginnt das Training des Modells. Hierfür benötigen wir zunächst einen äußeren Loop, der über die Anzahl der definierten Epochen ausgeführt wird. Innerhalb jeder Iteration des äußeren Loops werden die Daten zufällig in Batches eingeteilt und nacheinander in einem inneren Loop dem Netzwerk präsentiert. Nach Beendigung einer Epoche wird der MSE, also die mittlere quadratische Abweichung des Modells zu den tatsächlich Beobachteten Daten berechnet und ausgegeben.

# Batch Größe 
batch_size = 256 

# Anzahl möglicher Batches 
max_batch = len(data_y) // batch_size 

# Anzahl Epochen 
n_epochs = 100 

# Training des Modells 
for e in range(n_epochs): 
    # Zufällige Anordnung von X und Y für Minibatch Training 
    shuffle_indices = np.random.randint(low=0, high=n, size=n) 
    data_x = data_x[shuffle_indices] 
    data_y = data_y[shuffle_indices] 
 
    # Minibatch training 
    for i in range(0, max_batch): 
       # Batches erzeugen 
        start = i * batch_size 
        end = start + batch_size 
        batch_x = data_x[start:end] 
        batch_y = data_y[start:end] 

        # Aktuellen Batch in Netzwerk übergeben 
        net.run(opt, feed_dict={X: batch_x, Y: batch_y}) 

    # Pro Epoche den MSE anzeigen 
    mse_train = graph.run(mse, feed_dict={X: data_x, Y: data_y}) 
    print('MSE: ' + str(mse))

Insgesamt werden dem Netzwerk 15 Batches pro Epoche präsentiert. Innerhalb von 100 Epochen ist das Modell in der Lage den MSE von anfangs 20.988,60 auf 55,13 zu reduzieren (Anmerkung: diese Werte unterscheiden sich von Ausführung zu Ausführung aufgrund der zufälligen Initialisierung der Gewichte und Biaswerte sowie der zufälligen Ziehung der Batches). Die untenstehende Abbildung zeigt den Verlauf der mittleren quadratischen Abweichung während des Trainings.

Verlauf MSE-Training

Es ist zu sehen, dass das Modell mit einer ausreichend hohen Anzahl an Epochen in der Lage ist, den Trainingsfehler auf nahe 0 zu reduzieren. Was sich zunächst vorteilhaft anhört ist für echte Machine Learning Projekte ein Problem. Die Kapazität neuronaler Netze ist häufig so hoch, dass sie die Trainingsdaten einfach "auswendig lernen" und auf neuen, ungesehenen Daten schlecht generalisieren. Man spricht hierbei von einem sog. Overfitting der Trainingsdaten. Aus diesem Grund wird häufig bereits während des Trainings der Prognosefehler auf ungesehenen Testdaten überwacht. In der Regel wird das Training des Modells an der Stelle abgebrochen, an der der Prognosefehler der Testdaten wieder anzusteigen beginnt. Dies nennt man Early Stopping.

Zusammenfassung und Ausblick

Mit TensorFlow ist es Google gelungen, einen Meilenstein im Bereich Deep Learning Forschung zu setzen. Durch die geballte intellektuelle Kapazität von Google ist es gelungen eine Software zu erschaffen, die sich bereits nach sehr kurzer Zeit als Quasi-Standard bei der Entwicklung von neuronalen Netzen und Deep Learning Modellen etablieren konnte. Auch bei statworx arbeiten wir in der Data Science Beratung erfolgreich mit TensorFlow, um für unsere Kunden Deep Learning Modelle und neuronale Netze zu entwickeln.

Linkedin Logo
Marcel Plaschke
Head of Strategy, Sales & Marketing
Beratung vereinbaren
Zugehörige Leistungen
No items found.

Weitere Blogartikel

  • Artificial Intelligence
AI Trends Report 2025: Die 16 Trends im Überblick
Tarik Ashry
05. Februar 2025
Mehr erfahren
  • Artificial Intelligence
  • Data Science
  • Human-centered AI
Explainable AI in der Praxis: Mit der richtigen Methode die Black Box öffnen
Jonas Wacker
15. November 2024
Mehr erfahren
  • Artificial Intelligence
  • Data Science
  • GenAI
Wie ein CustomGPT Effizienz und Kreativität bei hagebau fördert
Tarik Ashry
06. November 2024
Mehr erfahren
  • Artificial Intelligence
  • Data Culture
  • Data Science
  • Deep Learning
  • GenAI
  • Machine Learning
AI Trends Report 2024: statworx COO Fabian Müller zieht eine Zwischenbilanz
Tarik Ashry
05. September 2024
Mehr erfahren
  • Artificial Intelligence
  • Human-centered AI
  • Strategy
Der AI-Act ist da – diese Risikoklassen sollte man kennen
Fabian Müller
05. August 2024
Mehr erfahren
  • Artificial Intelligence
  • GenAI
  • statworx
Zurück in die Zukunft: Die Geschichte von Generativer KI (Episode 4)
Tarik Ashry
31. Juli 2024
Mehr erfahren
  • Artificial Intelligence
  • GenAI
  • statworx
Zurück in die Zukunft: Die Geschichte von Generativer KI (Episode 3)
Tarik Ashry
24. Juli 2024
Mehr erfahren
  • Artificial Intelligence
  • GenAI
  • statworx
Zurück in die Zukunft: Die Geschichte von Generativer KI (Episode 2)
Tarik Ashry
17. Juli 2024
Mehr erfahren
  • Artificial Intelligence
  • GenAI
  • statworx
Zurück in die Zukunft: Die Geschichte von Generativer KI (Episode 1)
Tarik Ashry
10. Juli 2024
Mehr erfahren
  • Artificial Intelligence
  • GenAI
  • statworx
Generative KI als Denkmaschine? Ein medientheoretischer Blick
Tarik Ashry
13. Juni 2024
Mehr erfahren
  • Artificial Intelligence
  • GenAI
  • statworx
Maßgeschneiderte KI-Chatbots: Hohe Leistung und schnelle Integration vereint
Tarik Ashry
10. April 2024
Mehr erfahren
  • Artificial Intelligence
  • Data Culture
  • Human-centered AI
Wie Führungskräfte die Datenkultur im Unternehmen stärken können
Tarik Ashry
21. Februar 2024
Mehr erfahren
  • Artificial Intelligence
  • Data Culture
  • Human-centered AI
KI in der Arbeitswelt: Wie wir Skepsis in Zuversicht verwandeln
Tarik Ashry
08. Februar 2024
Mehr erfahren
  • Artificial Intelligence
  • Data Science
Wie wir für Microsoft einen Chatbot mit echtem Wissen entwickelt haben
Team statworx
27. September 2023
Mehr erfahren
  • Data Science
  • Data Visualization
  • Frontend Solution
Warum Frontend-Entwicklung in Data Science-Anwendungen nützlich ist
Jakob Gepp
30. August 2023
Mehr erfahren
  • Artificial Intelligence
  • Human-centered AI
  • statworx
the byte - Wie wir ein KI-gesteuertes Pop-up Restaurant aufgebaut haben
Sebastian Heinz
14. Juni 2023
Mehr erfahren
  • Artificial Intelligence
  • Recap
  • statworx
Big Data & AI World 2023 Recap
Team statworx
24. Mai 2023
Mehr erfahren
  • Data Science
  • Human-centered AI
  • Statistics & Methods
Die Black-Box entschlüsseln – 3 Explainable AI Methoden zur Vorbereitung auf den AI-Act
Team statworx
17. Mai 2023
Mehr erfahren
  • Artificial Intelligence
  • Human-centered AI
  • Strategy
Wie der AI-Act die KI-Branche verändern wird: Alles, was man jetzt darüber wissen muss
Team statworx
11. Mai 2023
Mehr erfahren
  • Artificial Intelligence
  • Human-centered AI
  • Machine Learning
Genderdarstellung in der KI – Teil 2: Automatisierte Erzeugung genderneutraler Versionen von Gesichtsbildern
Team statworx
03. Mai 2023
Mehr erfahren
  • Artificial Intelligence
  • Data Science
  • Statistics & Methods
Ein erster Einblick in unser Forecasting Recommender Tool
Team statworx
26. April 2023
Mehr erfahren
  • Artificial Intelligence
  • Data Science
Vom Können, Tun und Wollen – Warum Datenkultur und Death Metal einiges miteinander gemeinsam haben
David Schlepps
19. April 2023
Mehr erfahren
  • Artificial Intelligence
  • Human-centered AI
  • Machine Learning
GPT-4 – Eine Einordnung der wichtigsten Neuerungen
Mareike Flögel
17. März 2023
Mehr erfahren
  • Artificial Intelligence
  • Data Science
  • Strategy
Das Geheimnis der Datenkultur entschlüsseln: Diese Faktoren beeinflussen Kultur und Erfolg von Unternehmen
Team statworx
16. März 2023
Mehr erfahren
  • Artificial Intelligence
  • Deep Learning
  • Machine Learning
Wie man KI-generierte Avatare mit Hilfe von Stable Diffusion und Textual Inversion erstellt
Team statworx
08. März 2023
Mehr erfahren
  • Artificial Intelligence
  • Human-centered AI
  • Strategy
Knowledge Management mit NLP: So einfach verarbeitet man E-Mails mit KI
Team statworx
02. März 2023
Mehr erfahren
  • Artificial Intelligence
  • Deep Learning
  • Machine Learning
3 Anwendungsfälle, wie ChatGPT die Kommunikation in Unternehmen revolutionieren wird
Ingo Marquart
16. Februar 2023
Mehr erfahren
  • Recap
  • statworx
Ho ho ho – weihnachtlicher Küchenabriss
Julius Heinz
22. Dezember 2022
Mehr erfahren
  • Artificial Intelligence
  • Deep Learning
  • Machine Learning
Real-time Computer Vision: Gesichter erkennen mit einem Roboter
Sarah Sester
30. November 2022
Mehr erfahren
  • Data Engineering
  • Tutorial
Data Engineering – From Zero to Hero
Thomas Alcock
23. November 2022
Mehr erfahren
  • Recap
  • statworx
statworx @ UXDX Conf 2022
Markus Berroth
18. November 2022
Mehr erfahren
  • Artificial Intelligence
  • Machine Learning
  • Tutorial
Paradigmenwechsel in NLP: 5 Ansätze, um bessere Prompts zu schreiben
Team statworx
26. Oktober 2022
Mehr erfahren
  • Recap
  • statworx
statworx @ vuejs.de Conf 2022
Jakob Gepp
14. Oktober 2022
Mehr erfahren
  • Data Engineering
  • Data Science
Überwachung und Protokollierung von Anwendungen und Infrastruktur: Metriken und (Ereignis-)Protokolle
Team statworx
29. September 2022
Mehr erfahren
  • Coding
  • Data Science
  • Machine Learning
Zero-Shot Textklassifikation
Fabian Müller
29. September 2022
Mehr erfahren
  • Cloud Technology
  • Data Engineering
  • Data Science
Wie du dein Data Science Projekt fit für die Cloud machst
Alexander Broska
14. September 2022
Mehr erfahren
  • Artificial Intelligence
  • Human-centered AI
  • Machine Learning
Geschlechter­darstellung in der KI – Teil 1: Verwendung von StyleGAN zur Erforschung von Geschlechter­vielfalt bei der Bild­bearbeitung
Isabel Hermes
18. August 2022
Mehr erfahren
  • Artificial Intelligence
  • Human-centered AI
statworx AI Principles: Warum wir eigene KI-Prinzipien entwickeln
Team statworx
04. August 2022
Mehr erfahren
  • Data Engineering
  • Data Science
  • Python
Wie Du Deinen Code und Deine Abhängigkeiten in Python scannst
Thomas Alcock
21. Juli 2022
Mehr erfahren
  • Data Engineering
  • Data Science
  • Machine Learning
Data-Centric AI: Von Model-First zu Data-First KI-Prozessen
Team statworx
13. Juli 2022
Mehr erfahren
  • Artificial Intelligence
  • Deep Learning
  • Human-centered AI
  • Machine Learning
DALL-E 2: Warum Diskriminierung in der KI-Entwicklung nicht ignoriert werden kann
Team statworx
28. Juni 2022
Mehr erfahren
  • R
Das helfRlein Package – Eine Sammlung nützlicher Funktionen
Team statworx
23. Juni 2022
Mehr erfahren
  • Recap
  • statworx
Unfold 2022 in Bern – by Cleverclip
Team statworx
11. Mai 2022
Mehr erfahren
  • Artificial Intelligence
  • Data Science
  • Human-centered AI
  • Machine Learning
Vorurteile in KI abbauen
Team statworx
08. März 2022
Mehr erfahren
  • Artificial Intelligence
  • Cloud Technology
  • Data Science
  • Sustainable AI
Wie du als Data Scientist deinen KI CO₂ Fußabdruck verringerst
Team statworx
02. Februar 2022
Mehr erfahren
  • Recap
  • statworx
2022 und die Reise zu statworx next
Sebastian Heinz
06. Januar 2022
Mehr erfahren
  • Recap
  • statworx
5 Highlights vom Digital Festival Zürich 2021
Team statworx
25. November 2021
Mehr erfahren
  • Data Science
  • Human-centered AI
  • Machine Learning
  • Strategy
Warum Data Science und KI-Initiativen scheitern – eine Reflektion zu nicht-technischen Faktoren
Team statworx
22. September 2021
Mehr erfahren
  • Artificial Intelligence
  • Data Science
  • Human-centered AI
  • Machine Learning
  • statworx
Kolumne: Mensch und Maschine Seite an Seite
Sebastian Heinz
03. September 2021
Mehr erfahren
  • Coding
  • Data Science
  • Python
Wie man mit Call Graph automatisch Projektgrafiken erstellt
Team statworx
25. August 2021
Mehr erfahren
  • Coding
  • Python
  • Tutorial
statworx Cheatsheets – Python Basics Cheatsheet für Data Science
Team statworx
13. August 2021
Mehr erfahren
  • Data Science
  • statworx
  • Strategy
STATWORX meets DHBW – Data Science Real-World Use Cases
Team statworx
04. August 2021
Mehr erfahren
  • Data Engineering
  • Data Science
  • Machine Learning
Machine Learning Modelle bereitstellen und skalieren mit Kubernetes
Team statworx
29. Juli 2021
Mehr erfahren
  • Cloud Technology
  • Data Engineering
  • Machine Learning

3 Szenarien zum Deployment von Machine Learning Workflows mittels MLflow
Team statworx
30. Juni 2021
Mehr erfahren
  • Artificial Intelligence
  • Deep Learning
  • Machine Learning

Car Model Classification III: Erklärbarkeit von Deep Learning Modellen mit Grad-CAM
Team statworx
19. Mai 2021
Mehr erfahren
  • Artificial Intelligence
  • Coding
  • Deep Learning
Car Model Classification II: Deployment von TensorFlow-Modellen in Docker mit TensorFlow Serving
Team statworx
12. Mai 2021
Mehr erfahren
  • Coding
  • Deep Learning
Car Model Classification I: Transfer Learning mit ResNet
Team statworx
05. Mai 2021
Mehr erfahren
  • Artificial Intelligence
  • Deep Learning
  • Machine Learning
Car Model Classification IV: Integration von Deep Learning Modellen mit Dash
Dominique Lade
05. Mai 2021
Mehr erfahren
  • AI Act
Potenzial noch nicht ausgeschöpft – Ein Kommentar zur vorgeschlagenen KI-Regulierung der EU
Team statworx
Mehr erfahren
  • Artificial Intelligence
  • Deep Learning
  • statworx
Creaition – Revolutionierung des Designprozesses mit Machine Learning
Team statworx
31. März 2021
Mehr erfahren
  • Artificial Intelligence
  • Data Science
  • Machine Learning
5 Typen von Machine Learning Algorithmen (Mit Anwendungsfällen)
Team statworx
24. März 2021
Mehr erfahren
  • Recaps
  • statworx
2020 – Ein Rückblick für mich und GPT-3
Sebastian Heinz
23. Dezember 2020
Mehr erfahren
  • Artificial Intelligence
  • Deep Learning
  • Machine Learning
5 praxisnahe Beispiele für NLP Use Cases
Team statworx
12. November 2020
Mehr erfahren
  • Data Science
  • Deep Learning
Die 5 wichtigsten Use Cases für Computer Vision
Team statworx
05. November 2020
Mehr erfahren
  • Data Science
  • Deep Learning
Neue Trends im Natural Language Processing – Wie NLP massentauglich wird
Dominique Lade
29. Oktober 2020
Mehr erfahren
  • Data Engineering
5 Technologien, die jeder Data Engineer kennen sollte
Team statworx
22. Oktober 2020
Mehr erfahren
  • Artificial Intelligence
  • Data Science
  • Machine Learning
Generative Adversarial Networks: Wie mit Neuronalen Netzen Daten generiert werden können
Team statworx
15. Oktober 2020
Mehr erfahren
  • Coding
  • Data Science
  • Deep Learning
Finetuning von Tesseract-OCR für deutsche Rechnungen
Team statworx
08. Oktober 2020
Mehr erfahren
  • Artificial Intelligence
  • Machine Learning
Whitepaper: Ein Reifegradmodell für Künstliche Intelligenz
Team statworx
06. Oktober 2020
Mehr erfahren
  • Data Engineering
  • Data Science
  • Machine Learning
Machine Learning Modelle mit Hilfe von Docker Containern bereitstellen
Thomas Alcock
01. Oktober 2020
Mehr erfahren
  • Recap
  • statworx
STATWORX 2.0 – Das neue Headquarter in Frankfurt ist eröffnet
Julius Heinz
24. September 2020
Mehr erfahren
  • Machine Learning
  • Python
  • Tutorial
Wie man eine Machine Learning API mit Python und Flask erstellt
Team statworx
29. Juli 2020
Mehr erfahren
  • Data Science
  • Statistics & Methods
Modellregularisierung – The Bayesian Way
Thomas Alcock
15. Juli 2020
Mehr erfahren
  • Recap
  • statworx
Auf zu neuen Abenteuern: Soft Opening des STATWORX Büros
Team statworx
14. Juli 2020
Mehr erfahren
  • Data Engineering
  • R
  • Tutorial
Wie Du ShinyApps in Docker-Images einbauen kannst
Team statworx
15. Mai 2020
Mehr erfahren
  • Coding
  • Python
Making Of: Eine kostenlose API für COVID-19-Daten
Sebastian Heinz
01. April 2020
Mehr erfahren
  • Frontend
  • Python
  • Tutorial
Wie Du ein Dashboard In Python baust – Plotly Dash Step-by-Step Tutorial
Alexander Blaufuss
26. März 2020
Mehr erfahren
  • Coding
  • R
Warum heißen sie so?! – Ursprung und Bedeutung von R-Paketnamen
Team statworx
19. März 2020
Mehr erfahren
  • Data Visualization
  • R
Gemeinschaftsdetektion mit Louvain und Infomap
Team statworx
04. März 2020
Mehr erfahren
  • Coding
  • Data Engineering
  • Data Science
Testen von REST-APIs mit Newman
Team statworx
26. Februar 2020
Mehr erfahren
  • Coding
  • Frontend
  • R
Dynamische UI-Elemente in Shiny - Teil 2
Team statworx
19. Februar 2020
Mehr erfahren
  • Coding
  • Data Visualization
  • R
Animierte Plots mit ggplot und gganimate
Team statworx
14. Februar 2020
Mehr erfahren
  • Machine Learning
Machine Learning Goes Causal II: Der kausale Bruder des Random Forests
Team statworx
05. Februar 2020
Mehr erfahren
  • Artificial Intelligence
  • Machine Learning
  • Statistics & Methods
Machine Learning Goes Causal I: Warum Kausalität wichtig ist
Team statworx
29.01.2020
Mehr erfahren
  • Data Engineering
  • R
  • Tutorial
Wie man REST-APIs mit R Plumber erstellt
Stephan Emmer
23. Januar 2020
Mehr erfahren
  • Recaps
  • statworx
statworx 2019 – Ein Jahresrückblick
Sebastian Heinz
20. Dezember 2019
Mehr erfahren
  • Artificial Intelligence
  • Deep Learning
Deep Learning – Überblick und Einstieg
Team statworx
04. Dezember 2019
Mehr erfahren
  • Coding
  • Machine Learning
  • R
Abstimmung von Random Forest auf Zeitreihendaten
Team statworx
21. November 2019
Mehr erfahren
  • Data Science
  • R
Kombination von Preiselastizitäten und Verkaufsprognosen zur Verkaufssteigerung
Team statworx
06. November 2019
Mehr erfahren
  • Data Engineering
  • Python
Von überall aus auf deinen Spark-Cluster zugreifen – mit Apache Livy
Team statworx
30. Oktober 2019
Mehr erfahren
  • Recap
  • statworx
STATWORX auf Tour: Wein, Burgen & Wandern!
Team statworx
18. Oktober 2019
Mehr erfahren
  • Data Science
  • R
  • Statistics & Methods
Wie man eine Kreuzvalidierung zur Evaluation der Modellperformance von Grund auf selbst erstellt
Team statworx
02. Oktober 2019
Mehr erfahren
  • Data Science
  • Machine Learning
  • R
Zeitreihenvorhersage mit Random Forest
Team statworx
25. September 2019
Mehr erfahren
  • Coding
  • Frontend
  • R
Dynamische UI Elemente in Shiny – Teil 1
Team statworx
11. September 2019
Mehr erfahren
  • Machine Learning
  • R
  • Statistics & Methods
Was dem MAPE fälschlicherweise vorgeworfen wird, seine WAHREN Schwächen und BESSERE Alternativen!
Team statworx
16. August 2019
Mehr erfahren
  • Coding
  • Python
Web Scraping 101 in Python mit Requests & BeautifulSoup
Team statworx
31. Juli 2019
Mehr erfahren
  • Coding
  • Frontend
  • R
Einstieg in Flexdashboards in R
Thomas Alcock
19. Juli 2019
Mehr erfahren
  • Recap
  • statworx
statworx Sommer-Barbecue 2019
Team statworx
21. Juni 2019
Mehr erfahren
  • Data Visualization
  • R
Interaktive Netzwerkvisualisierung mit R
Team statworx
12. Juni 2019
Mehr erfahren
  • Deep Learning
  • Python
  • Tutorial
Verwendung von Reinforcement Learning zum Spielen von Super Mario Bros auf NES mit TensorFlow
Sebastian Heinz
29. Mai 2019
Mehr erfahren
No items found.
This is some text inside of a div block.
This is some text inside of a div block.