2016-12-09 3 views
1

Ich mag Deep Learning mein Klassifikationsproblem anzuwenden, wenn die Größe der Graustufen-Bilder in meinem Dataset 200x200 ist. Derzeit teste ich DL auf einer sehr kleinen Teilmenge (152 Bilder) meiner großen Datensätze (über 15.000 Bilder); und ich bin mit Keras (Version '1.1.2') Bibliothek mit Theano (Version '0.9.0.dev4') Backend in Python (Python 2.7.12 :: Anaconda 4.2.0 (64-Bit)). Mein Code läuft in der CPU, aber es ist sehr langsam. Also bin ich zu GPU gewechselt. Allerdings bin ich unten Fehler bekommen:Nicht genügend Speicher mit Keras auf GPU

Using Theano backend. 
Using gpu device 0: GeForce GTS 450 (CNMeM is enabled with initial size: 70.0% of memory, cuDNN not available) 

Train on 121 samples, validate on 31 samples 
Epoch 1/200 
Traceback (most recent call last): 

    File "<ipython-input-6-247bada3ec1a>", line 2, in <module> 
    verbose=1, validation_data=(X_test, Y_test)) 

    File "/home/user1/anaconda2/envs/keras_env/lib/python2.7/site-packages/keras/models.py", line 652, in fit 
    sample_weight=sample_weight) 

    File "/home/user1/anaconda2/envs/keras_env/lib/python2.7/site-packages/keras/engine/training.py", line 1111, in fit 
    initial_epoch=initial_epoch) 

    File "/home/user1/anaconda2/envs/keras_env/lib/python2.7/site-packages/keras/engine/training.py", line 826, in _fit_loop 
    outs = f(ins_batch) 

    File "/home/user1/anaconda2/envs/keras_env/lib/python2.7/site-packages/keras/backend/theano_backend.py", line 811, in __call__ 
    return self.function(*inputs) 

    File "/home/user1/anaconda2/envs/keras_env/lib/python2.7/site-packages/theano/compile/function_module.py", line 886, in __call__ 
    storage_map=getattr(self.fn, 'storage_map', None)) 

    File "/home/user1/anaconda2/envs/keras_env/lib/python2.7/site-packages/theano/gof/link.py", line 325, in raise_with_op 
    reraise(exc_type, exc_value, exc_trace) 

    File "/home/user1/anaconda2/envs/keras_env/lib/python2.7/site-packages/theano/compile/function_module.py", line 873, in __call__ 
    self.fn() if output_subset is None else\ 

MemoryError: Error allocating 160579584 bytes of device memory (CNMEM_STATUS_OUT_OF_MEMORY). 
Apply node that caused the error: GpuElemwise{Composite{(i0 * (i1 + Abs(i1)))},no_inplace}(CudaNdarrayConstant{[[[[ 0.5]]]]}, GpuElemwise{Add}[(0, 0)].0) 
Toposort index: 60 
Inputs types: [CudaNdarrayType(float32, (True, True, True, True)), CudaNdarrayType(float32, 4D)] 
Inputs shapes: [(1, 1, 1, 1), (32, 32, 198, 198)] 
Inputs strides: [(0, 0, 0, 0), (1254528, 39204, 198, 1)] 
Inputs values: [CudaNdarray([[[[ 0.5]]]]), 'not shown'] 
Outputs clients: [[GpuContiguous(GpuElemwise{Composite{(i0 * (i1 + Abs(i1)))},no_inplace}.0)]] 

HINT: Re-running with most Theano optimization disabled could give you a back-trace of when this node was created. This can be done with by setting the Theano flag 'optimizer=fast_compile'. If that does not work, Theano optimizations can be disabled with 'optimizer=None'. 
HINT: Use the Theano flag 'exception_verbosity=high' for a debugprint and storage map footprint of this apply node. 

Ich versuchte, die vorgeschlagenen Lösungen (optimizer=fast_compile und optimizer=None), aber es hat nicht funktioniert. Ich weiß, dass das Problem mit den Bildgrößen zusammenhängt, weil es funktionierte, wenn ich die Bilder auf 50x50 änderte.

Wissen Sie, wie ich das Problem beheben kann in der Lage sein, es zu 200x200 Bilder anwenden?

Ich verwende Linux Mageia 5 und meine GPU Informationen:

02:00.0 VGA compatible controller: NVIDIA Corporation GF106 [GeForce GTS 450] (rev a1) 
[ 64.299] (--) NVIDIA(0): Memory: 1048576 kBytes 
[ 64.313] (II) NVIDIA: Using 12288.00 MB of virtual memory for indirect memory 
[ 64.439] (==) NVIDIA(0): Disabling shared memory pixmaps 

Ich bin nicht sicher, ob cuDNN mit einer richtigen Lösung für mein Problem ist, aber ich habe bereits versucht, es zu benutzen, indem optimizer_including=cudnn in .theanorc ; aber ich bin unten Störung zu erhalten:

AssertionError: cuDNN optimization was enabled, but Theano was not able to use it. We got this error: 
Device not supported 

Ich denke, es könnte sein, weil meine GPU-Kompatibilität 2.1 ist (das ist weniger als die cudnn GPU cc Anforderung (3.0 oder höher)).

Ich wäre dankbar, wenn Sie mir helfen könnte, das Problem zu beheben und DL auf meine große Datensätze laufen?

+0

Es ist schwierig, den Code zu sagen, ohne zu sehen, aber Sie die Bilder in kleineren Chargen an die gpu laden können? – Atirag

+0

cuDNN funktioniert nicht mit Ihrer GTS450 Fermi (GF106) GPU. cuDNN benötigt kepler GPUs. Es scheint, dass Sie auf Ihrer GPU nicht mehr genügend Speicher haben, und die GTS450 ist eine ziemlich alte Low-End-GPU ohne viel Arbeitsspeicher (1 GB). –

+0

@Airag Ich versuchte eine kleinere Batch-Größe, aber ich bekomme einen ähnlichen Fehler. – SaraG

Antwort

0

sagt es, dass Sie GPU aus der Erinnerung ist. Ändern Sie also die Batch-Größe und laden Sie nicht alle Daten direkt zur GPU, indem Sie die gemeinsam genutzte Variable verwenden, sondern zwischen ihnen iterieren. findet sonst eine andere GPU mit höherer Speicherkapazität

+0

Ich habe die Stapelgröße auf einen kleineren Wert geändert, das Problem wurde jedoch nicht behoben. Könnten Sie bitte Ihre zweite vorgeschlagene Lösung (Verwenden der gemeinsamen Variablen und Iteration zwischen ihnen) ein wenig mehr erarbeiten? Meinst du, dass ich meine Input-Bilder in verschiedene Teilmengen unterteilen muss und sie mithilfe gemeinsamer Variablen CNN in verschiedenen Iterationen in jeder Epoche zuführen? – SaraG

+0

Wenn Sie Ihre Bilder in die gemeinsam genutzte Variable einfügen, fügen Sie einfach die Größe der Patch-Größe und nicht die gesamte Datenmenge hinzu. und laden Sie in jeder Iteration erneut die neuen Bilder und aktualisieren Sie die gemeinsame Variable. Was ich hier sage, reduziert die Menge an Daten, die auf Ihrer GPU geladen werden – Feras