запись numpy в tfrecord выполняется медленно при циклическом переключении функций с помощью tfrecordwriter - PullRequest
0 голосов
/ 15 мая 2019

У меня есть пустой массив, который я хочу записать в файл tfrecord. Размеры массива для input X и label y равны [200,46,72,72] для обучения моей модели. Я хочу прочитать файл tfrecord, чтобы получить срезы [72,72] как для входных данных, так и для данных меток.

Я пытался применить следующий stackoverflow ответ

Проблема в том, что этот метод действительно медленный , вероятно, из-за количества элементов, зацикленных на 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, который возвращает ломтики.

Резюме:

  • сохранить 2 numpy arrays до tfrecord
  • прочитайте tfrecord файл и получите slices сохраненного numpy arrays в пакетах, использованных для модели
...