2

In der TensorFlow Dokumentation bei GitHub, gibt es diesen Code ein:TensorFlow: Warum müssen nicht-spärliche Elemente beim Analysieren eines TF-Beispiels aus TFRecord-Dateien einmal umgeformt werden?

# Reshape non-sparse elements just once: 
for k in self._keys_to_features: 
    v = self._keys_to_features[k] 
    if isinstance(v, parsing_ops.FixedLenFeature): 
    example[k] = array_ops.reshape(example[k], v.shape) 

Ich frage mich, warum es notwendig ist, einen FixedLenFeature Tensor neu zu gestalten, nachdem es von einer TFRecord Datei Parsen.

In der Tat, was ist der Unterschied zwischen einem FixedLenFeature und VarLenFeature und was ist ihre Relevanz für einen Tensor? Ich lade Bilder in diesem Fall, also warum sollten sie alle als FixedLenFeature klassifiziert werden? Was ist ein Beispiel für ein VarLenFeature?

Antwort

1

Tensoren sind auf der Festplatte ohne Forminformationen in einem Example protocol buffer format gespeichert (TFRecord-Dateien sind Sammlungen von Beispielen). Die Dokumentation in der Datei .proto beschreibt die Dinge ziemlich gut, aber der grundlegende Punkt ist, dass Tensor-Einträge in Reihen-Haupt-Reihenfolge ohne Forminformationen gespeichert werden, so dass diese bereitgestellt werden müssen, wenn die Tensoren gelesen werden. Beachten Sie, dass die Situation beim Speichern von Tensoren im Speicher ähnlich ist: Die Forminformationen werden separat gespeichert, und das Ändern eines Tensors ändert nur die Metadaten (Dinge wie Transponieren können auf der anderen Seite teuer sein).

VarLenFeatures sind Sequenzen wie Sätze, die sich als normale Tensoren nur schwer zusammensetzen lassen, da die resultierende Form zerlumpt wäre. Die parse_example documentation hat einige gute Beispiele. Bilder haben eine feste Länge, wenn sie einen Stapel von ihnen laden, haben sie alle die gleiche Form (z. B. sind sie alle 32x32 Pixel, so dass ein Stapel von 10 die Form 10x32x32 haben kann).

+0

Bedeutung zu sagen ist es in Ordnung, wenn ich meine TFRecord-Dateien erstellt habe, ist es in Ordnung, dass meine Bilder alle nicht die gleiche Form haben, denn bevor ich sie in den Stapel laden würde ich sie bereits umgeformt haben? Ist es richtig zu sagen, dass wir für Bilder nicht VarLenFeatures verwenden können, da es uns einen spärlichen Tensor geben würde (der nicht für Bilder geeignet ist)? – kwotsin

+0

Das Problem ist, wenn es um das Stapeln der Bilder geht. Sie können Arrays mit variabler Länge von der Festplatte lesen, aber die einzige effiziente Möglichkeit, ein Image-Modell zu trainieren, besteht darin, sie in ein dichtes, gestapeltes Format zu bringen, was bedeutet, dass Sie alle Größen ändern müssen. Wenn man also spärliche Tensoren liest, ihre Größe ändert, sie dicht macht, dann ist es eine perfekte Eingabepipeline, sie zu dosieren. –

+0

Ist es richtig zu sagen, dass, wenn ich alle meine Bilder auf die gleiche Größe (zB 500x500) skaliert hätte, auch wenn ich sie später durch Vorverarbeitung in eine kleinere Größe (zB 299x299) verkleinern muss, ist es effizienter diese zu lesen Bilder, weil ich den Inhalt als FixedLenFeature angeben würde, während ich die TF-Beispiele lese? Da die TF-Beispiele nacheinander gelesen werden, wie unterscheidet sich FixedLenFeature von VarLenFeature, wenn die Maschine keine Kenntnis von den Formen anderer Beispiele hat, die sie zuvor gelesen hat (dies ist nur eine Annahme)? – kwotsin

Verwandte Themen