2017-01-29 5 views
8

Ich habe versucht, Bilder verschiedener Größen in TF-Datensätze zu speichern. Ich habe festgestellt, dass obwohl die Bilder verschiedene Größen haben, kann ich sie immer noch mit FixedLenFeature laden.Tensorflow VarLenFeature vs FixedLenFeature

Durch die Dokumentation Überprüfung auf FixedLenFeature und VarLenFeature, fand ich den Unterschied scheint zu sein, dass VarLenFeauture eine spärliche Tensor zurückgibt.

Könnte jemand einige Situationen zeigen eine FixedLenFeature oder VarLenFeature verwenden sollte?

+0

Welche Art Funktion u für das Speichern von Bilddaten verwenden? tf.train.BytesList? – Pietrko

+0

Ja, ich bin mit tf.train.Byteslist – ZijunLost

Antwort

10

Sie können Bilder laden wahrscheinlich beacause Sie diese Feature-Typen unter Verwendung von gespeicherten tf.train.BytesList() und ganzen Bilddaten ist ein großer Byte-Wert in einer Liste.

Wenn ich recht habe, verwenden Sie tf.decode_raw, um die Daten aus dem Bild zu erhalten, das Sie von TFRecord laden.

In Bezug auf Anwendungsfälle: Ich bin kein Experte, aber ich verwende VarLenFeature zum Speichern von Datensätzen für Objekterkennung Aufgabe. Es gibt eine variable Anzahl von Begrenzungsrahmen pro Bild (entspricht dem Objekt im Bild). Ich verwende objects_number Funktionen, um die Anzahl der Objekte (und Bboxes) zu verfolgen. Jede Bounding-Box ist die Liste von 4 Schwimmers Koordinaten

I folgenden Code bin mit laden:

features = tf.parse_single_example(
    serialized_example, 
    features={ 
     # We know the length of both fields. If not the 
     # tf.VarLenFeature could be used 
     'height': tf.FixedLenFeature([], tf.int64), 
     'width': tf.FixedLenFeature([], tf.int64), 
     'depth': tf.FixedLenFeature([], tf.int64), 
     # Label part 
     'objects_number': tf.FixedLenFeature([], tf.int64), 
     'bboxes': tf.VarLenFeature(tf.float32), 
     'labels': tf.VarLenFeature(tf.int64), 
     # Dense data 
     'image_raw': tf.FixedLenFeature([],tf.string) 

    }) 

# Get metadata 
objects_number = tf.cast(features['objects_number'], tf.int32) 
height = tf.cast(features['height'], tf.int32) 
width = tf.cast(features['width'], tf.int32) 
depth = tf.cast(features['depth'], tf.int32) 

# Actual data 
image_shape = tf.parallel_stack([height, width, depth]) 
bboxes_shape = tf.parallel_stack([objects_number, 4]) 

# BBOX data is actually dense convert it to dense tensor 
bboxes = tf.sparse_tensor_to_dense(features['bboxes'], default_value=0) 

# Since information about shape is lost reshape it 
bboxes = tf.reshape(bboxes, bboxes_shape) 
image = tf.decode_raw(features['image_raw'], tf.uint8) 
image = tf.reshape(image, image_shape) 

Beachten Sie, dass „image_raw“ ist feste Länge Merkmal (hat ein Element) und hält Werte des Typs "Bytes", jedoch kann ein Wert von "Byte-Typ" selbst eine variable Größe haben (es ist eine Bytefolge und kann viele Symbole enthalten). Also "image_raw" ist eine Liste mit einem Element vom Typ "Bytes", die sehr groß sein kann.

weiter zu erarbeiten, wie es funktioniert: Merkmale sind Wertelisten, die Werte spezifischen „Typ“ haben.

Datentypen für Funktionen Teilmenge von Datentypen für Tensoren sind, Sie haben:

  • int64 (64-Bit-Raum im Speicher)
  • Bytes (belegt wie im Speicher viele Bytes, wie Sie wollen)
  • Schwimmer (iDK nimmt 32-64 Bits im Speicher, wie viel)

Sie können prüfen, hereTensor s Datentypen.

So können Sie Daten mit variabler Länge ohne VarLenFeatures überhaupt speichern (eigentlich gut tun Sie es), aber zuerst müssten Sie es in Bytes/String-Funktion konvertieren, und dann dekodieren. Und das ist am häufigsten Methode.

+0

Hallo Danke, aber ich bin immer noch verwirrt über den letzten Satz: ‚Das Bildes Hinweis ist feste Länge Eigenschaft des Typs‚tf.string‘, wo String selbst variable Größe haben kann . " Könnten Sie das näher ausführen? – ZijunLost

+0

Natürlich aktualisiert die Antwort. – Pietrko

+0

Funktioniert das für Sie? – Pietrko