我有一个要写入tfrecord文件的numpy数组。 input X
和label y
的数组尺寸均为[200,46,72,72]
,用于训练模型,我想读取tfrecord文件以获取[72,72]
的切片,以用于输入和标签数据。
我尝试应用以下stackoverflow answer
问题在于此方法实际上慢,可能是由于在200*46
上循环的元素数量所致。
当我将整个numpy array
作为bytes
的功能而不是floatlist
的功能时,我没有这个问题,但是我不知道如何获取[72,72]
的切片每批。
def npy_to_tfrecords(X,y):
# write records to a tfrecords file
output_file = 'E:\\Documents\\Datasets\\tfrecordtest\\test.tfrecord'
writer = tf.python_io.TFRecordWriter(output_file)
# Loop through all the features you want to write
for i in range(X.shape[0]) :
for j in range(X.shape[1]) :
#let say X is of np.array([[...][...]])
#let say y is of np.array[[0/1]]
print(f"{i},{j}")
# Feature contains a map of string to feature proto objects
feature = {}
feature['X'] = tf.train.Feature(float_list=tf.train.FloatList(value=X[i,j:,:].flatten()))
feature['y'] = tf.train.Feature(float_list=tf.train.FloatList(value=y[i,j:,:].flatten()))
# Construct the Example proto object
example = tf.train.Example(features=tf.train.Features(feature= feature) )
# Serialize the example to a string
serialized = example.SerializeToString()
# write the serialized objec to the disk
writer.write(serialized)
writer.close()
为了阅读,我大致使用以下代码
dataset = tf.data.TFRecordDataset(filenames)
dataset = dataset.map(_parse_function, num_parallel_calls=6)
dataset.apply(tf.contrib.data.shuffle_and_repeat(SHUFFLE_BUFFER))
dataset = dataset.batch(BATCH_SIZE)
iterator = dataset.make_one_shot_iterator()
input_data, label_data = iterator.get_next()
当我将
numpy arrays
保存为bytes
时,parse_function
返回 整个数组,我不知道如何写一个parse_function
返回切片。
numpy arrays
保存到tfrecord
tfrecord
文件并从用于模型的批次中获取slices
中保存的numpy arrays