web-dev-qa-db-fra.com

comment stocker des tableaux numpy en tant que tfrecord?

J'essaie de créer un ensemble de données au format tfrecord à partir de tableaux numpy. J'essaie de stocker des coordonnées 2D et 3D.

Les coordonnées 2D sont un tableau numpy de forme (2,10) de type float64 Les coordonnées 3d sont un tableau numpy de forme (3,10) de type float64

voici mon code:

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


train_filename = 'train.tfrecords'  # address to save the TFRecords file
writer = tf.python_io.TFRecordWriter(train_filename)


for c in range(0,1000):

    #get 2d and 3d coordinates and save in c2d and c3d

    feature = {'train/coord2d': _floats_feature(c2d),
                   'train/coord3d': _floats_feature(c3d)}
    sample = tf.train.Example(features=tf.train.Features(feature=feature))
    writer.write(sample.SerializeToString())

writer.close()

quand je lance cela, j'obtiens l'erreur:

  feature = {'train/coord2d': _floats_feature(c2d),
  File "genData.py", line 19, in _floats_feature
return tf.train.Feature(float_list=tf.train.FloatList(value=value))
  File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\google\protobuf\internal\python_message.py", line 510, in init
copy.extend(field_value)
  File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\google\protobuf\internal\containers.py", line 275, in extend
new_values = [self._type_checker.CheckValue(elem) for elem in elem_seq_iter]
  File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\google\protobuf\internal\containers.py", line 275, in <listcomp>
new_values = [self._type_checker.CheckValue(elem) for elem in elem_seq_iter]
  File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\google\protobuf\internal\type_checkers.py", line 109, in CheckValue
raise TypeError(message)
TypeError: array([-163.685,  240.818, -114.05 , -518.554,  107.968,  427.184,
    157.418, -161.798,   87.102,  406.318]) has type <class 'numpy.ndarray'>, but expected one of: ((<class 'numbers.Real'>,),)

Je ne sais pas comment résoudre ce problème. dois-je stocker les fonctionnalités sous forme d'int64 ou d'octets? Je n'ai aucune idée de la façon de procéder, car je suis complètement nouveau sur tensorflow. Toute aide est la bienvenue! Merci

15
csbk

Le tf.train.Feature la classe ne prend en charge que listes (ou tableaux 1-D) lors de l'utilisation de float_list argument. Selon vos données, vous pouvez essayer l'une des approches suivantes:

  1. Aplatissez les données de votre tableau avant de les transmettre à tf.train.Feature:

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

    Notez que vous devrez peut-être ajouter une autre fonctionnalité pour indiquer comment ces données doivent être remodelées lorsque vous les analysez à nouveau (et vous pouvez utiliser un int64_list fonction à cet effet).

  2. Divisez l'entité multidimensionnelle en plusieurs entités 1-D. Par exemple, si c2d contient un N * 2 tableau de coordonnées x et y, vous pouvez diviser cette fonction en train/coord2d/x et train/coord2d/y entités, contenant chacune les données des coordonnées x et y, respectivement.

15
mrry