2017-10-18 3 views
0

J'ai un fichier tfrecords stockant des images sous forme de bytestrings. Je veux définir la colonne de fonctionnalité pour cela comme tf.feature_column.numeric_column("image", shape=[64, 64], dtype=tf.float32) mais comme il n'est pas stocké comme une liste flottante dans le fichier tfrecords, cela ne fonctionne pas.Décoder les octets bruts dans tfrecords dans la fonction tf.feature_column.numeric_column

J'ai ensuite essayé d'utiliser l'argument normalizer_fn de numeric_column que j'ai défini comme.

def decode(image_bytestring): 
    img = tf.reshape(tf.decode_raw(image_bytestring, tf.uint8), [28, 28]) 
    img = tf.cast(img, tf.float32) 
    return img 

... 

examples = tf.parse_example(
      serialized_batch, 
      tf.feature_column.make_parse_example_spec(feature_columns)) 

Le premier problème est cependant que la spécification d'analyse syntaxique FixedLenFeature(shape=(28, 28), dtype=tf.float32, default_value=None) générée par cette feature_column dit pour analyser un float32 quand il est effectivement stocké comme une chaîne qui provoque une erreur. Donc, la fonction de décodage n'est pas utilisée.

Existe-t-il un moyen de contourner cela lors de l'utilisation de tf.feature_column autre que de stocker l'image en tant que float_list dans le tfrecord à la place?

On dirait que le fait d'avoir un système de type statique aurait été agréable pour garantir le bon type d'entité à partir de la fonction de mappage.

Répondre

1

Peut-être que vous pouvez simplement stocker des images sous forme d'octets de chaîne, et suivez la manière habituelle de lire les images?

feature_map = { 'image': tf.FixedLenFeature([], dtype=tf.string,default_value='') } 
features = tf.parse_single_example(example_serialized, feature_map) 
image_buffer = features['image'] 
image = tf.image.decode_image(image_buffer, ...)