web-dev-qa-db-ja.com

numpy配列をtfrecordとして保存する方法は?

Numpy配列からtfrecord形式のデータセットを作成しようとしています。 2Dおよび3D座標を保存しようとしています。

2d座標はfloat64型の形状(2,10)のnumpy配列です3d座標はfloat64型の形状(3,10)のnumpy配列です

これは私のコードです:

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()

これを実行するとエラーが発生します:

  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'>,),)

これを修正する方法がわかりません。機能をint64またはバイトとして保存する必要がありますか?私はテンソルフローに完全に慣れていないので、どうすればいいのかわかりません。どんな助けでも素晴らしいです!ありがとう

15
csbk

tf.train.Feature引数を使用する場合、float_listクラスはlists(または1-D配列)のみをサポートします。データに応じて、次のいずれかの方法を試すことができます。

  1. tf.train.Featureに渡す前に、配列内のデータをフラット化します。

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

    もう一度解析するときにこのデータを再形成する方法を示すために、別の機能を追加する必要がある場合があります(そのためにint64_list機能を使用できます)。

  2. 多次元フィーチャーを複数の1-Dフィーチャーに分割します。たとえば、c2dにx座標とy座標のN * 2配列が含まれている場合、その機能を個別のtrain/coord2d/xおよびtrain/coord2d/y機能に分割し、それぞれにx-とおよびy座標データ。

15
mrry