Direkt zum Hauptinhalt

TensorFlow™ auf Databricks

Illustration

Platzhalter

Bisher haben wir Variablen zum Verwalten unserer Daten verwendet, es gibt jedoch eine grundlegendere Struktur, den Platzhalter. Ein Platzhalter ist einfach eine Variable, der wir zu einem späteren Zeitpunkt Daten zuweisen. Damit können wir unsere Operationen erstellen und unseren Datenverarbeitungsgraphen entwickeln, ohne die Daten zu benötigen. In der TensorFlow-Terminologie geben wir dann über diese Platzhalter per Feed Daten in den Graphen ein.

 

import tensorflow as tf

x = tf.placeholder("float", None)
y = x * 2

with tf.Session() as session:
    result = session.run(y, feed_dict={x: [1, 2, 3]})
    print(result)

 

Dieses Beispiel funktioniert ein wenig anders als unsere vorherigen. Schlüsseln wir es also auf.

Zuerst importieren wir TensorFlow wie gewohnt. Dann erstellen wir einen Platzhalter namens x, d. h. einen Platz im Speicher, an dem wir später einen Wert speichern.

Anschließend erstellen wir einen Tensor, der die Operation zum Multiplizieren von x mit 2 darstellt. Beachten Sie, dass wir noch keine Anfangswerte für x definiert haben.

Wir haben jetzt eine Operation (y) definiert und können sie nun in einer Sitzung ausführen. Wir erstellen ein Sitzungsobjekt und führen dann einfach die Variable y aus. Dies bedeutet, dass wir, wenn wir einen viel größeren Graphen von Operationen definiert haben, die Möglichkeit haben, nur ein kleines Segment des Graphen auszuführen. Diese Subgraph-Auswertung ist tatsächlich ein kleines Verkaufsargument von TensorFlow und eines, das in vielen anderen Bibliotheken, die ähnlich funktionieren, nicht vorhanden ist.

Das Ausführen von y erfordert Kenntnisse über die Werte von x. Wir definieren diese innerhalb des Arguments feed_dict für run. Wir geben hier an, dass die Werte von x [1, 2, 3] sind. Wir führen y aus. Das Ergebnis dieser Operation lautet [2, 4, 6].

Platzhalter müssen keine statische Größe haben. Aktualisieren wir unser Programm, damit x eine beliebige Länge annehmen kann. Dazu ändern wir die Definition von x wie folgt:

 

x = tf.placeholder("float", None)

 

Wenn wir nun die Werte von x in feed_dict definieren, können wir eine beliebige Anzahl von Werten haben. Der Code sollte immer noch funktionieren und zum selben Ergebnis führen, aber jetzt funktioniert er auch mit einer beliebigen Anzahl von Werten in feed_dict.

Platzhalter können auch mehrere Dimensionen haben und ermöglichen so die Speicherung von Arrays. Im folgenden Beispiel erstellen wir eine 3 x 2-Matrix und speichern darin einige Zahlen. Danach verwenden wir dieselbe Operation wie zuvor, um die Zahlen elementweise zu verdoppeln.

 

import tensorflow as tf

x = tf.placeholder("float", [None, 3])
y = x * 2

with tf.Session() as session:
    x_data = [[1, 2, 3],
              [4, 5, 6],]
    result = session.run(y, feed_dict={x: x_data})
    print(result)

 

Die erste Dimension des Platzhalters ist None, was bedeutet, dass wir eine beliebige Anzahl von Zeilen haben können. Die zweite Dimension ist auf 3 festgelegt, was bedeutet, dass jede Zeile drei Spalten mit Daten enthalten muss.

Wir können dies erweitern, um eine beliebige Anzahl von None-Dimensionen nzunehmen. In diesem Beispiel laden wir das Bild unserer letzten Lektion hoch und erstellen dann einen Platzhalter, der einen Ausschnitt dieses Bildes speichert. Der Ausschnitt ist ein 2D-Segment des Bildes, aber jedes „Pixel“ besteht aus drei Komponenten (Rot, Grün, Blau). Daher benötigen wir None für die ersten beiden Dimensionen, benötigen aber 3 (oder None würde funktionieren) für die letzte Dimension. Anschließend verwenden wir die slice-Methode von TensorFlow, um einen Ausschnitt aus dem Bild zu entnehmen und zu bearbeiten.

 

import tensorflow as tf
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import os

# First, load the image again
dir_path = os.path.dirname(os.path.realpath(__file__))
filename = dir_path + "/MarshOrchid.jpg"
raw_image_data = mpimg.imread(filename)

image = tf.placeholder("uint8", [None, None, 3])
slice = tf.slice(image, [1000, 0, 0], [3000, -1, -1])

with tf.Session() as session:
    result = session.run(slice, feed_dict={image: raw_image_data})
    print(result.shape)

plt.imshow(result)
plt.show()

 

  1. Sehen Sie sich in der offiziellen Dokumentation die anderen Funktionen für Arrays in TensorFlow an.
  2. Teilen Sie das Bild in vier „Ecken“ auf und fügen Sie es dann wieder zusammen.
  3. Konvertieren Sie das Bild in Graustufen. Eine Möglichkeit dafür wäre, nur einen einzigen Farbkanal zu nehmen und diesen anzuzeigen. Eine andere Möglichkeit wäre, den Durchschnitt der drei Kanäle als graue Farbe zu verwenden.