2017-12-18 315 views
1

我想從numpy數組中創建tfrecord格式的數據集。我試圖存儲2D和3D座標。如何將numpy數組存儲爲tfrecord?

2D座標型的形狀(2,10)的numpy的陣列float64 三維座標型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或字節?我不知道如何去做這件事,因爲我對tensorflow完全陌生。任何幫助將是偉大的!感謝

回答

1

tf.train.Feature的類只支持列表(或1-d陣列)使用float_list參數時。根據您的資料,您可以嘗試以下方法之一:

  1. 拼合你的陣列中的數據將它傳遞給tf.train.Feature前:

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

    請注意,您可能需要另一個功能添加到表明這個數據應該如何重塑當你再次解析它(你可以使用爲目的的int64_list功能)。

  2. 將多維特徵拆分爲多個一維特徵。例如,如果c2d包含N * 2陣列x和y座標的,可以拆分特徵爲單獨train/coord2d/xtrain/coord2d/y特徵,每個包含x和分別y座標數據,。