2017-06-15 1 views
0

Je suis très novice en matière de ML avec Big Data et j'ai déjà joué avec des exemples de convolution génériques de Keras pour la classification chien/chat, mais lorsque j'applique une approche similaire à mon ensemble d'images, problèmes de mémoire.Problèmes de mémoire avec Keras Convolutional Network

Mon jeu de données est constitué d'images très longues d'une taille de 10048 x 1687 pixels. Pour contourner les problèmes de mémoire, j'utilise une taille de lot de 1, alimentant une image à la fois au modèle.

Le modèle a deux couches convolutives, chacune suivie d'un pool maximum qui, ensemble, rendent la couche aplatie environ 290 000 entrées juste avant la couche entièrement connectée.

Immédiatement après l'exécution cependant, l'utilisation de mémoire s'étouffe à sa limite (8 Go).

Mes questions sont les suivantes:

1) Quelle est la meilleure approche pour traiter les calculs de cette taille en Python localement (pas d'utilisation Cloud)? Existe-t-il d'autres bibliothèques python à utiliser?

+0

Si vous utilisez TensorFlow comme backend, vous pourrez diviser le réseau sur plusieurs GPU. – Mathias

Répondre

1

Découvrez ce que fait yield en python et l'idée des générateurs. Vous n'avez pas besoin de charger toutes vos données au début. Vous devriez rendre votre batch_size juste assez petit pour ne pas avoir d'erreurs de mémoire. Votre générateur peut ressembler à ceci:

def generator(fileobj, labels, memory_one_pic=1024, batch_size): 
    start = 0 
    end = start + batch_size 
    while True: 
    X_batch = fileobj.read(memory_one_pic*batch_size) 
    y_batch = labels[start:end] 
    start += batch_size 
    end += batch_size 
    if not X_batch: 
     break 
    if start >= amount_of_datasets: 
     start = 0 
     end = batch_size 
    yield (X_batch, y_batch) 

... plus tard, quand vous avez déjà votre architecture prête ...

train_generator = generator(open('traindata.csv','rb'), labels, batch_size) 
train_steps = amount_of_datasets//batch_size + 1 

model.fit_generator(generator=train_generator, 
        steps_per_epoch=train_steps, 
        epochs=epochs) 

Vous devriez également lire batch_normalization, ce qui contribue essentiellement à apprendre plus vite et avec une meilleure précision.

0

Lors de l'utilisation de train_generator(), vous devez également définir le paramètre max_q_size. Il est réglé sur 10 par défaut, ce qui signifie que vous chargez en 10 lots tout en utilisant seulement 1 (puisque train_generator() a été conçu pour diffuser des données provenant de sources externes qui peuvent être retardées comme le réseau, pas pour économiser de la mémoire). Je recommande de définir max_q_size=1 pour vos besoins.