TensorFlow-Tutorial. Teil 4: Deep Learning

5 min read

TensorFlow-Tutorial. Teil 4

Simulation neuronaler Netze

Wir müssen ein neuronales Netzwerk aufbauen, Schicht für Schicht.

Wenn Sie dies noch nicht gemacht haben, importieren Sie TensorFlow in einen Workspace namens tf. Initialisieren Sie dann Graph mit der Graph() Funktion. Verwenden Sie diese Funktion, um die Berechnungen zu ermitteln. Beachten Sie, dass Sie mit Graph nichts berechnen, da es keine Variablen berücksichtigt. Das Diagramm definiert nur die Funktionen, die Sie später ausführen möchten.

Mit as_default() können Sie den Standardkontext festlegen. as_default() gibt den Kontextmanager zurück, der den Standardgraphen für Ihr Diagramm festlegt. Wenn Sie mehr als ein Diagramm in einem Prozess erstellen möchten, verwenden Sie diese Methode: Diese Funktion erstellt ein standardmäßiges globales Diagramm, dem alle Operationen hinzugefügt werden, wenn Sie nicht bewusst ein anderes erstellen.

Sie können nun Funktionen zur Spalte hinzufügen. Sie müssen ein neuronales Netzwerkmodell erstellen und dann bei der Kompilierung die Verlustfunktion, den Optimierer und die Metriken definieren. Wenn Sie mit TensorFlow arbeiten, können Sie dies in einem Schritt erledigen:

  • Zunächst geben Sie Platzhalter für Eingabedaten und Tags an, weil Sie noch keine “echten” Daten angeben. Erinnern Sie sich daran, dass Platzhalter nicht initialisierte Variablen sind, die von der Sitzung beim Start initialisiert werden. Wenn Sie die Sitzung schließlich starten, erhalten diese Platzhalter die Datensatzwerte, die Sie an run() übergeben!
  • Dann erstellen Sie ein Netzwerk. Zuerst müssen Sie die Eingabedaten mit der Funktion exitflatten() glätten, die ein Array von Dimensionen [None, 784] statt eines Arrays von Dimensionen [None, 28, 28] erstellt, das das ursprüngliche Array Ihrer Bilder in Grautönen ist.
  • Nachdem Sie die Datenglättung durchgeführt haben, müssen Sie eine vollständig verbundene Ebene erstellen, die Größenprotokolle erzeugt [Keine, 62]. Logits sind Funktionen, die mit der unskalierten Ausgabe früherer Schichten funktionieren und eine relative Skala verwenden, um die Linearität von Maßeinheiten zu überprüfen.
  • Nach dem Aufbau eines mehrschichtigen Perzeptrons können Sie die Funktion der Verluste definieren. Die Wahl der Verlustfunktion hängt von der Aufgabe ab, die Sie lösen. In unserem Fall verwenden Sie diesen:
sparse_softmax_cross_entropy_with_logits()
  • Mit dieser Funktion wird die spärliche Softmax-Kreuzentropie zwischen Logs und Tags berechnet. Das bedeutet, dass es die Fehlerwahrscheinlichkeit bei diskreten Klassifizierungsaufgaben misst, bei denen sich Klassen gegenseitig ausschließen. Das heißt, jedes Datenelement gehört nur zu einer Klasse. In diesem Fall enthält z.B. ein Verkehrszeichen nur eine Markierung. Beachten Sie, dass, obwohl die Regression zur Vorhersage kontinuierlicher Werte eingesetzt wird, die Klassifizierung zur Vorhersage diskreter Werte oder Klassen von Datenelementen verwendet wird. Sie führen eine Faltung dieser Funktion mit reduce_mean() durch, die den Mittelwert der Elemente entlang der Tensormessungen berechnet.
  • Sie müssen auch einen Trainingsoptimierer installieren. Einer der beliebtesten Optimierungsalgorithmen ist Stochastic Gradient Descent (SGD), ADAM und RMSprop. Wenn Sie einen Algorithmus ausgewählt haben, müssen Sie Parameter wie die Lerngeschwindigkeit einstellen. Dann wählen Sie den ADAM-Optimierer, bei dem die Lerngeschwindigkeit auf 0,001 eingestellt ist.
  • Zuletzt initialisieren Sie die Operationen, bevor Sie mit dem Training beginnen.
# Import `tensorflow` 

import tensorflow as tf

# Placeholder initialization

x = tf.placeholder(dtype = tf.float32, shape = [None, 28, 28])
y = tf.placeholder(dtype = tf.int32, shape = [None])

# Smoothing input data

images_flat = tf.contrib.layers.flatten(x)

# Fully linked layerПолностью подключенный слой 

logits = tf.contrib.layers.fully_connected(images_flat, 62, tf.nn.relu)

# Loss function definition

losstf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(labels = y, logits = logits))

# Optimizer definition

train_op = tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss)

# Logits conversion into index labels

correct_pred = tf.argmax(logits, 1)

# Accuracy definition

accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))

Sie haben gerade erfolgreich Ihr erstes neuronales Netzwerk mit TensorFlow erstellt!

Wenn Sie möchten, können Sie auch die Werte der (meisten) Variablen ausgeben, um eine kurze Zusammenfassung der gerade programmierten Werte zu erhalten:

print("images_flat: ", images_flat)

print("logits: ", logits)

print("loss: ", loss)

print("predicted_labels: ", correct_pred)

Ein Hinweis. Wenn Sie sehen, dass das Fehlermodul ‘pandas’ kein attribut ‘computation’ hat, aktualisieren Sie die Dask-Pakete, indem Sie den Befehl pip install – upgrade dask auf der Befehlszeile ausführen.

Einführung eines neuronalen Netzwerks

Nachdem Sie nun Schicht für Schicht ein Netzwerkmodell zusammengestellt haben, können Sie es jetzt ausführen! Initialisieren Sie zu diesem Zweck zuerst die Sitzung mit der Funktion Session(), in die Sie den im vorherigen Abschnitt definierten Graph übertragen. Sie können die Sitzung dann mit run() starten, an die Sie die initialisierten Operationen in Form einer init-Variablen übergeben.

Mit dieser initialisierten Sitzung kann dann der Trainingszyklus gestartet werden. In diesem Fall wählen Sie 201, weil Sie den letzten loss_value registrieren möchten. In der Schleife müssen Sie die Sitzung mit dem Lernoptimierer und den Verlustmetriken (oder der Genauigkeit) starten, die Sie im vorherigen Abschnitt definiert haben. Außerdem müssen Sie das Argument der Funktion feed_dict übergeben, mit dessen Hilfe Sie Daten an das Modell übergeben. Nach jeweils 10 Zyklen erhalten Sie ein Log, das Ihnen mehr Informationen über Ihre Verluste gibt.

Möchten Sie eine andere Konfiguration ausprobieren? Sie müssen dies wahrscheinlich mit sess.close() tun, wenn Sie Ihre Sitzung als sess definieren, wie im folgenden Block:

tf.set_random_seed(1234)

sess = tf.Session()

sess.run(tf.global_variables_initializer())

for i in range(201):

print('EPOCH', i)

_, accuracy_val = sess.run([train_op, accuracy], feed_dict={x: images28, y: labels})

if i % 10 == 0:

print("Loss: ", loss)

print('DONE WITH EPOCH')

Sie können auch den nächsten Block starten, aber denken Sie daran, dass er die Sitzung sofort schließt, so wie im ersten Teil dieses Tutorials zu sehen ist:

tf.set_random_seed(1234)

with tf.Session() as sess:

sess.run(tf.global_variables_initializer())

for i in range(201):

_, loss_value = sess.run([train_op, loss], feed_dict={x: images28, y: labels})

if i % 10 == 0:

print("Loss: ", loss)

Beachten Sie, dass die Funktion global_variables_initializer() verwendet wird, da die Funktion initialize_all_variables() nicht mehr aktuell ist.

Sie haben Ihr Modell erfolgreich gelehrt! Das war nicht allzu schwer, nicht wahr?

Bewertung Ihres neuronalen Netzwerks

Das neuronale Netzwerk ist noch nicht fertig. Es wird noch untersucht. Verschaffen Sie sich einen Eindruck davon, wie Ihr Modell funktioniert, indem Sie 10 Zufallsbilder auswählen und die vorhergesagten Tags mit den realen vergleichen.

Lassen Sie uns matplotlib verwenden und Verkehrszeichen zum visuellen Vergleich anzeigen:

# Import `matplotlib`

import matplotlib.pyplot as plt
import random

# Choosing 10 random images

sample_indexes = random.sample(range(len(images28)), 10)
sample_images = [images28[i] for i in sample_indexes]
sample_labels = [labels[i] for i in sample_indexes]

# Launching operaion "correct_pred"

predicted = sess.run([correct_pred], feed_dict={x: sample_images})[0]

# Output true and predicted labels

print(sample_labels) print(predicted)

# Output predicted and true images

fig = plt.figure(figsize=(10, 10))
for i in range(len(sample_images)):
truth = sample_labels[i]
prediction = predicted[i]
plt.subplot(5, 2,1+i)
plt.axis('off') color='green' if truth == prediction else 'red'
plt.text(40, 10, "Truth: {0}\nPrediction: {1}".format(truth, prediction), fontsize=12, color=color)
plt.imshow(sample_images[i], cmap="gray")

plt.show()

Beim Betrachten von Zufallsbildern gibt es jedoch nicht viele Informationen darüber, wie gut das Modell tatsächlich funktioniert. Dazu werden Testdaten benötigt.

Beachten Sie, dass die Funktion load_data() verwendet wird.

# Import `skimage`

from skimage import transform

# Loading checking data

test_images, test_labels = load_data(test_data_directory)

# Processing 28x28 pxl images

test_images28 = [transform.resize(image, (28, 28)) for image in test_images]

# Conversion into grey tones

from skimage.color import rgb2gray
test_images28 = rgb2gray(np.array(test_images28))

# Output predictions and full checking dataset

predicted = sess.run([correct_pred], feed_dict={x: test_images28})[0]

# Computating coincidences 

match_count = sum([int(y == y_) for y, y_ in zip(test_labels, predicted)])

# Computating accuracy

accuracy = match_count / len(test_labels)

# Output accuracy

print("Accuracy: {:.3f}".format(accuracy))

Vergessen Sie nicht, die Sitzung mit sess.close() zu schließen, wenn Sie den Befehl mit tf.Session() als sess: nicht verwendet haben, um die TensorFlow-Sitzung zu starten.

Was ist der nächste Schritt mit dem Modell?

Wenn Sie mit diesem Datensatz und Modell weiterarbeiten möchten, versuchen Sie Folgendes:

  • Wenden Sie die regularisierte LDA auf die Daten an, bevor Sie sie dem Modell hinzufügen. Dieser Vorschlag stammt aus einem der Originalarbeiten von Forschern, die diesen Datensatz gesammelt und analysiert haben.
  • Achten Sie auf Lern- und Testfehler beim Training mit neuronalen Netzen. Unterbrechen Sie das Lernen, wenn beide Fehler abnehmen und plötzlich zunehmen – das ist ein Zeichen dafür, dass das neuronale Netzwerk begonnen hat, sich umzuschulen.
  • Probieren Sie verschiedene Optimierer aus.

Wie kann man Deep Learning in Ihrem Umfeld einsetzen?

Möchten Sie mehr über KI erfahren und wie Sie es in Ihrem Unternehmen einsetzen können?

Diese und weitere Fragen beantwortet gerne das AI United Team per Email oder in dem Q&A Bereich.

Quelle

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.