2017-06-09 4 views
0

Ich extrahiere Merkmale aus Bildern mit einem konvolutionellen neuronalen Netzwerk. Das betreffende Netzwerk hat drei Ausgänge (drei Ausgangstensoren), die sich in der Größe unterscheiden. Ich möchte die extrahierten Merkmale in TFRecords speichern, ein Beispiel für jedes Bild:TFRecords: Liste der Tensoren einzeln schreiben Beispiel

Example: 
    image_id: 1 
    features/fc8: [output1.1, output1.2, output1.3] 
Example: 
    image_id: 2 
    features/fc8: [output2.1, output2.2, output2.3] 
.... 

Wie kann ich diese Struktur mit TFRecords erreichen?

Antwort

3

EDIT: Elegante Möglichkeit ist, tf.SequenceExample zu verwenden.

  1. Konvertieren der Daten tf.SequenceExample() -Format

    def make_example(features, image_id): 
    
        ex = tf.train.SequenceExample() 
        ex.context.feature['image_id'].int64_list.value.append(image_id) 
        fl_features = ex.feature_lists.feature_list['features/fc8'] 
    
        for feature in features: 
        fl_features.feature.add().bytes_list.value.append(frame.tostring()) 
        return ex 
    
  2. zum Schreiben TFRecord

    def _convert_to_tfrecord(output_file, feature_batch, ids_batch): 
    
        writer = tf.python_io.TFRecordWriter(output_file) 
    
        for features, id in zip(feature_batch, ids_batch): 
        ex = make_example(features, id) 
        writer.write(ex.SerializeToString()) 
        writer.close() 
    
  3. Parsing Beispiel

    def parse_example_proto(example_serialized): 
    
    context_features = { 
        'image_id': tf.FixedLenFeature([], dtype=tf.int64)} 
    sequence_features = { 
        'features/fc8': tf.FixedLenSequenceFeature([], dtype=tf.string)} 
    
    context_parsed, sequence_parsed = tf.parse_single_sequence_example(
        serialized=example_serialized, 
        context_features=context_features, 
        sequence_features=sequence_features) 
    return context_parsed['image_id'], sequence_features['features/fc8'] 
    
Verwendung

Hinweis: Die Funktionen hier sind in byte_list gespeichert, Sie können sie auch in float_list speichern.
Eine andere Möglichkeit ist tf.parse_single_example() zu verwenden, indem Sie die Beispiele als Lagerung:

image_id: 1 
features/fc8_1: output1.1 
features/fc8_2: output1.2 
features/fc8_3: output1.3 
+0

ich den zweiten Vorschlag wurde mit, aber ich dachte, dass es etwas eleganter sein, hat z.B. mit SequenceExample. Was ich nicht mag, ist die Tatsache, dass ich jetzt wissen müsste, wie viele Ausgaben es gibt. Für das erste Beispiel: Würden Sie dann tf.slice() zum Decodieren verwenden? – thertweck

+0

Bearbeitet, um SequenceExample() zu verwenden; Ich habe es verwendet, um JPEGs zu speichern, die verschiedene Größen für Videoarbeiten haben und dieser Code wurde für diesen Anwendungsfall getestet. –

+0

Ja das ist, was ich gesucht habe. Wie würdest du dann die einzelnen Tensoren auspacken? Ich benutze tf.unstack(), aber es benötigt die Anzahl der Tensoren, da die Form von sequence_features ['features/fc8'] (?,) Ist und leider keinen Tensor für den Parameter num akzeptiert. – thertweck

Verwandte Themen