2016-12-20 5 views
4

Ich möchte Tensorflow-Datensätze erstellen, um mein Modell zu füttern; bis jetzt benutze ich den folgenden Code, um uint8 numpy Array zu TFRecord-Format zu speichern;Tensorflow-Datensatz mit float numpy Array

def _int64_feature(value): 
    return tf.train.Feature(int64_list=tf.train.Int64List(value=[value])) 


def _bytes_feature(value): 
    return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value])) 


def _floats_feature(value): 
    return tf.train.Feature(float_list=tf.train.FloatList(value=[value])) 


def convert_to_record(name, image, label, map): 
    filename = os.path.join(params.TRAINING_RECORDS_DATA_DIR, name + '.' + params.DATA_EXT) 

    writer = tf.python_io.TFRecordWriter(filename) 

    image_raw = image.tostring() 
    map_raw = map.tostring() 
    label_raw = label.tostring() 

    example = tf.train.Example(features=tf.train.Features(feature={ 
     'image_raw': _bytes_feature(image_raw), 
     'map_raw': _bytes_feature(map_raw), 
     'label_raw': _bytes_feature(label_raw) 
    }))   
    writer.write(example.SerializeToString()) 
    writer.close() 

, die ich mit diesem Beispielcode lesen

features = tf.parse_single_example(example, features={ 
    'image_raw': tf.FixedLenFeature([], tf.string), 
    'map_raw': tf.FixedLenFeature([], tf.string), 
    'label_raw': tf.FixedLenFeature([], tf.string), 
}) 

image = tf.decode_raw(features['image_raw'], tf.uint8) 
image.set_shape(params.IMAGE_HEIGHT*params.IMAGE_WIDTH*3) 
image = tf.reshape(image_, (params.IMAGE_HEIGHT,params.IMAGE_WIDTH,3)) 

map = tf.decode_raw(features['map_raw'], tf.uint8) 
map.set_shape(params.MAP_HEIGHT*params.MAP_WIDTH*params.MAP_DEPTH) 
map = tf.reshape(map, (params.MAP_HEIGHT,params.MAP_WIDTH,params.MAP_DEPTH)) 

label = tf.decode_raw(features['label_raw'], tf.uint8) 
label.set_shape(params.NUM_CLASSES) 

und das funktioniert gut. Nun möchte ich dasselbe mit meinem Array "map" machen, das ein float numpy array ist, anstelle von uint8, und ich konnte keine Beispiele dafür finden; Ich habe versucht die Funktion _floats_feature, die funktioniert, wenn ich einen Skalar, aber nicht mit Arrays übergeben; mit uint8 kann die Serialisierung mit der Methode tostring() erfolgen;

Wie kann ich ein float numpy Array serialisieren und wie kann ich das zurück lesen?

Antwort

6

FloatList und BytesList erwarten ein iterable. Sie müssen also eine Liste von Floats übergeben. Entfernen Sie die zusätzlichen Klammern in Ihrem _float_feature, dh

def _floats_feature(value): 
    return tf.train.Feature(float_list=tf.train.FloatList(value=value)) 

numpy_arr = np.ones((3,)).astype(np.float) 
example = tf.train.Example(features=tf.train.Features(feature={"bytes": _floats_feature(numpy_arr)})) 
print(example) 

features { 
    feature { 
    key: "bytes" 
    value { 
     float_list { 
     value: 1.0 
     value: 1.0 
     value: 1.0 
     } 
    } 
    } 
} 
2

ich auf der Yaroslavs Antwort erweitern.

Int64List, BytesList und FloatList erwarten ein iterator of the underlying elements (wiederholtes Feld). In Ihrem Fall können Sie eine Liste als Iterator verwenden.

Sie erwähnten: es funktioniert, wenn ich einen Skalar, aber nicht mit Arrays übergeben. Und das wird erwartet, denn wenn Sie einen Skalar übergeben, erstellt Ihr _floats_feature ein Array von einem Float-Element (genau wie erwartet). Aber wenn Sie ein Array übergeben, erstellen Sie eine Liste von Arrays und übergeben diese an eine Funktion, die eine Liste von Floats erwartet.

entfernen So gerade Aufbau des Arrays aus Ihrer Funktion: float_list=tf.train.FloatList(value=value)

1

Yaroslavs Beispiel schlug fehl, wenn ein nd Array der Eingang war.

numpy_arr = np.ones ((3,3)) AsType (np.float)

Ich fand, dass es funktionierte, wenn ich numpy_arr.ravel() als Eingabe verwendete. Aber gibt es einen besseren Weg?

+0

Yaroslav erwähnt, dass Sie eine Liste von Schwimmern benötigen, num_arr ist keine Liste, also müssten Sie es irgendwie abflachen und dann seine Form reparieren, bevor Sie es an das Modell übergeben. – cberkay