web-dev-qa-db-fra.com

Tensorflow TFRecord: impossible d'analyser l'exemple sérialisé

J'essaie de suivre ce guide afin de sérialiser mes données d'entrée au format TFRecord mais je continue de frapper cette erreur en essayant de le lire:

InvalidArgumentError: Key: my_key. Impossible d'analyser l'exemple sérialisé.

Je ne sais pas où je vais mal. Voici une reproduction minimale du problème que je ne peux pas surmonter.

Sérialiser certains exemples de données:

with tf.python_io.TFRecordWriter('train.tfrecords') as writer:
  for idx in range(10):
        example = tf.train.Example(
            features=tf.train.Features(
                feature={
                    'label': tf.train.Feature(int64_list=tf.train.Int64List(value=[1,2,3])),
                    'test': tf.train.Feature(float_list=tf.train.FloatList(value=[0.1,0.2,0.3])) 
                }
            )
        )

        writer.write(example.SerializeToString())
  writer.close()

Fonction d'analyse et de désérialisation:

def parse(tfrecord):
  features = {
      'label': tf.FixedLenFeature([], tf.int64, default_value=0),
      'test': tf.FixedLenFeature([], tf.float32, default_value=0.0),
  }
  return tf.parse_single_example(tfrecord, features)

dataset = tf.data.TFRecordDataset('train.tfrecords').map(parse)
getnext = dataset.make_one_shot_iterator().get_next()

Lorsque vous essayez d'exécuter ceci:

with tf.Session() as sess:
  v = sess.run(getnext)
  print (v)

Je déclenche le message d'erreur ci-dessus.

Est-il possible de dépasser cette erreur et de désérialiser mes données?

6
Stewart_R

tf.FixedLenFeature () est utilisé pour lire les tableaux de données à taille fixe. Et la forme des données doit être définie au préalable. Mise à jour de la fonction d'analyse vers

def parse(tfrecord):
   return tf.parse_single_example(tfrecord, features={
       'label': tf.FixedLenFeature([3], tf.int64, default_value=[0,0,0]),
       'test': tf.FixedLenFeature([3], tf.float32, default_value=[0.0, 0.0, 0.0]),
   })

Devrait faire le travail.

7
Vlad-HC

Comme alternative, si vos longueurs d'entités en entrée ne sont pas fixes et sont de tailles arbitraires, vous pouvez également utiliser tf.io.FixedLenSequenceFeature() avec les arguments allow_missing = True Et default_value=0 (En cas de type int et 0,0 pour float) qui ne nécessite pas que la fonction d'entrée soit de taille fixe contrairement à tf.io.FixedLenFeature(). Vous pouvez trouver plus d'informations ici .

1
Rishabh Sahrawat