J'ai divisé un jeu de données en 10 fichiers tfrecords et je souhaite lire 100 points de données pour créer un lot de 10 séquences de 100 points de données. J'utilise la fonction suivante pour le faire. Le temps de chargement des données à partir des tfrecords commence lentement, puis atteint environ 0,65 seconde et après 100-200 appels sess.run, il passe à environ 10 secondes. Pouvez-vous s'il vous plaît signaler toute erreur ou suggestion qui pourrait aider à réduire le temps de lecture? De plus, le comportement que j'ai mentionné devient parfois plus erratique.La lecture de TFRecord devient lente
def get_data(mini_batch_size):
data = []
for i in range(mini_batch_size):
filename_queue = tf.train.string_input_producer([data_path + 'Features' + str(i) + '.tfrecords'])
reader = tf.TFRecordReader()
_, serialized_example = reader.read_up_to(filename_queue,step_size)
features = tf.parse_example(serialized_example,features={'feature_raw': tf.VarLenFeature(dtype=tf.float32)})
feature = features['feature_raw'].values
feature = tf.reshape(feature,[step_size, ConvLSTM.H, ConvLSTM.W, ConvLSTM.Di])
data.append(feature)
return tf.stack(data)
Même lorsque je tire d'un seul fichier comme suit, j'observe le même comportement. De plus, augmenter num_threads n'aide pas.
with tf.device('/cpu:0'):
filename_queue = tf.train.string_input_producer(['./Data/TFRecords/Features' + str(i) + '.tfrecords'])
reader = tf.TFRecordReader()
_, serialized_example = reader.read(filename_queue)
batch_serialized_example = tf.train.batch([serialized_example], batch_size=100, num_threads=1, capacity=100)
features = tf.parse_example(batch_serialized_example,features={'feature_raw': tf.VarLenFeature(dtype=tf.float32)})
feature = features['feature_raw'].values
data.append(feature)
data = tf.stack(data)
init_op = tf.group(tf.global_variables_initializer(),tf.local_variables_initializer())
sess = tf.Session(config=tf.ConfigProto(intra_op_parallelism_threads=1,inter_op_parallelism_threads=1,allow_soft_placement=True))
sess.run(init_op)
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
for i in range(1000):
t = time.time()
D = sess.run(data)
print(time.time()-t)
Je veux obtenir 100 exemples contigus de chaque fichier tfrecords pour créer une séquence. Ensuite, je veux tirer 10 telle séquence de 10 fichiers tfrecord différents pour créer un lot. Si j'utilise tf.train.shuffle_batch, il va mélanger dans la séquence 100 que je ne veux pas car il perdrait alors des informations temporelles. En outre, j'ai 10 fichier tfrecord avec chacun de 50GB. De plus, je n'essaie pas de charger des fichiers jpeg, mais des tenseurs en tant que fonctionnalités. J'espère que vous obtenez ma situation. –
Ensuite, n'utilisez pas le mélange aléatoire. Vous pouvez utiliser tf.train.batch si vous ne voulez pas mélanger. Si vous utilisez des informations temporelles, pourquoi ne pouvez-vous pas les stocker ensemble en un seul enregistrement? Vérifier: https://stackoverflow.com/questions/44464828/tfrecords-write-list-of-tensors-to-single-example/44479764#44479764 –
Pouvez-vous m'aider s'il vous plaît comment faire créer des lots dans le format que j'ai mentionné en utilisant tf, train.batch, c'est-à-dire lire à partir de plusieurs fichiers pour créer un lot? Je ne peux pas enregistrer 100 fonctions en une seule séquence dans tfrecords, car cela limiterait le nombre de séquences car je souhaite un chevauchement et si je les sauvegarde d'une manière chevauchante, cela prendrait beaucoup de place. –