2017-10-20 4 views
0

je le code suivant:tensorflow Dataset.from_tensor_slices prend trop de temps

data = np.load("data.npy") 
print(data) # Makes sure the array gets loaded in memory 
dataset = tf.contrib.data.Dataset.from_tensor_slices((data)) 

Le fichier est "data.npy" 3.3 Go. La lecture du fichier avec numpy prend quelques secondes, mais la ligne suivante qui crée l'objet de jeu de données tensorflow prend des âges à exécuter. Pourquoi donc? Que fait-il sous le capot?

Répondre

2

cette answer citant:

np.load d'un npz retourne juste un chargeur de fichier, pas les données réelles. C'est un "chargeur paresseux", chargeant le tableau particulier seulement quand on y accède.

C'est pourquoi c'est rapide.

Edit 1: pour développer un peu plus cette réponse, une autre citation de tensorflow's documentation:

Si toutes vos données d'entrée tenir dans la mémoire, la façon la plus simple de créer une Dataset d'eux est de convertir les à tf.Tensor objets et utiliser Dataset.from_tensor_slices().

Cela fonctionne bien pour un petit ensemble de données, mais gaspille de la mémoire --- parce que le contenu du tableau sera copié plusieurs fois --- et peut atteindre la limite de 2 Go pour le tampon de protocole tf.GraphDef.

Le lien montre également comment le faire efficacement.

+0

Si j'essaie d'imprimer le 'data', de sorte que je m'assure qu'il est effectivement chargé, cela prend encore quelques secondes, alors que' Dataset' prend quelques minutes. – niko

+0

Il n'imprime pas nécessairement toutes les données. L'imprimer ou non ne garantit pas qu'il soit réellement chargé. Je ne suis pas un expert en tensorflow mais juste en regardant le code, il semble que 'from_tensor_slices' boucle sur l'ensemble des données (et de manière plutôt lente aussi) ce qui va certainement * charger * toutes les données. OMI ceci peut probablement être accéléré mais en toute justice je n'ai pas essayé. À un certain point, il se peut que vous deviez lancer plus de matériel si votre machine est en train de s'étouffer avec 3,3 Go de mémoire. – Iguananaut

+0

J'ai mis à jour ma réponse pour vous donner un peu plus de détails. –