web-dev-qa-db-fra.com

Obtenir la longueur d'un jeu de données dans Tensorflow

source_dataset = tf.data.TextLineDataset('primary.csv')
target_dataset = tf.data.TextLineDataset('secondary.csv')
dataset = tf.data.Dataset.Zip((source_dataset, target_dataset))
dataset = dataset.shard(10000, 0)
dataset = dataset.map(lambda source, target: (tf.string_to_number(tf.string_split([source], delimiter=',').values, tf.int32),
                                              tf.string_to_number(tf.string_split([target], delimiter=',').values, tf.int32)))
dataset = dataset.map(lambda source, target: (source, tf.concat(([start_token], target), axis=0), tf.concat((target, [end_token]), axis=0)))
dataset = dataset.map(lambda source, target_in, target_out: (source, tf.size(source), target_in, target_out, tf.size(target_in)))

dataset = dataset.shuffle(NUM_SAMPLES)  #This is the important line of code

Je souhaite mélanger complètement l'ensemble de mes données, mais shuffle() nécessite plusieurs échantillons à extraire et tf.Size() ne fonctionne pas avec tf.data.Dataset.

Comment puis-je mélanger correctement?

6
Evan Weissburg

Je travaillais avec tf.data.FixedLengthRecordDataset () et je rencontrais un problème similaire . Dans mon cas, j'essayais de ne prendre qu'un certain pourcentage des données brutes. longueur fixe, une solution pour moi était la suivante:

totalBytes = sum([os.path.getsize(os.path.join(filepath, filename)) for filename in os.listdir(filepath)])
numRecordsToTake = tf.cast(0.01 * percentage * totalBytes / bytesPerRecord, tf.int64)
dataset = tf.data.FixedLengthRecordDataset(filenames, recordBytes).take(numRecordsToTake)

Dans votre cas, ma suggestion serait de compter directement en python le nombre d'enregistrements dans 'primary.csv' et 'secondary.csv'. Sinon, je pense que pour vous, définir l'argument buffer_size ne nécessite pas vraiment de compter les fichiers. Selon la réponse acceptée sur la signification de buffer_size , un nombre supérieur au nombre d'éléments de l'ensemble de données garantira un brassage uniforme dans l'ensemble du jeu de données. Il suffit donc de mettre un très grand nombre (ce qui surpasserait la taille du jeu de données) devrait fonctionner.

1
Ringo