2

Ich habe einige Bilddaten in eine Instanz in Google Cloud kopiert (8 vCPUs, 64 GB Speicher, Tesla K80 GPU) und stoße in Speicherprobleme, wenn ich die Rohdaten in Features umwandle und die Datenstruktur der Ausgabe ändere. Schließlich möchte ich die abgeleiteten Merkmale im Neuronalen Netz Keras/Tensorflow verwenden.Beim Erstellen von Features (Konvertieren von Bildern in abgeleitete Features [Anzahl Arrays]) ist nicht genügend Arbeitsspeicher verfügbar?

Prozess

Nachdem die Daten in einem Speicher bucket kopieren, betreibe ich eine build_features.py Funktion, um die Rohdaten in verarbeiteten Daten für das neuronale Netzwerk zu konvertieren. In dieser Pipeline nehme ich zuerst jedes Rohbild und lege es in eine Liste x (die die abgeleiteten Merkmale speichert).

Da ich mit einer großen Anzahl von Bildern arbeite (Zehntausende Bilder vom Typ float32 und Abmessungen 250x500x3), wird die Liste x ziemlich groß. Jedes Element von x ist ein nupy Array, das das Bild in Form 250x500x3 speichert.

Problem 1 - reduziert Speicher als Liste x wächst

I 2 Screenshots nahm die Abnahme verfügbaren Speicher zeigen, wie x (unten) wächst. Ich bin schließlich in der Lage, diesen Schritt abzuschließen, aber ich bin nur mit ein paar GB Speicher übrig, also möchte ich definitiv das beheben (in Zukunft möchte ich mit größeren Datensätzen arbeiten). Wie kann ich Features so erstellen, dass ich nicht auf die Größe von x beschränkt bin?

enter image description here enter image description here

Problem 2 - Speicherfehler, wenn x in numpy Array Umwandlung

der Schritt, wo die Instanz tatsächlich ist die folgende fehlschlägt:

x = np.array(x) 

Die Fehlermeldung ist:

Traceback (most recent call last): 
    File "build_features.py", line 149, in <module> 
    build_features(pipeline='9_11_2017_fan_3_lights') 
    File "build_features.py", line 122, in build_features 
    x = np.array(x) 
MemoryError 

Wie kann ich diesen Schritt so anpassen, dass der Speicher nicht ausreicht?

Antwort

2

Ihr Code hat zwei Kopien von jedem Bild - in der Liste, und eine in der Reihe:

images = [] 
for i in range(many): 
    images[i] = load_img(i) # here's the first image 

x = np.array(images) # joint them all together into a second copy 

Laden Sie einfach die Bilder direkt in das Array

x = np.zeros((many, 250, 500, 3) 
for i in range(many): 
    x[i] = load_img(i) 

was bedeutet, dass Sie halten nur eine Kopie von einem Bild auf einmal.

x0 = load_img(0) 
x = np.zeros((many,) + x0.shape, x0.dtype) 
for i in range(1, many): 
    x[i] = load_img(i) 

Having said:


Wenn Sie nicht die Größe kennen oder dtype des Bildes vor der Zeit oder wollen nicht, um es hart Code können Sie verwenden Sie sind hier auf einem schwierigen Weg. Wenn Sie nicht genügend Speicherplatz haben, um Ihr Dataset zweimal im Speicher zu speichern, haben Sie auch keinen Platz zum Berechnen y = x + 1.

Sie möchten vielleicht mit np.float16 betrachten mehr Speicherplatz zu kaufen, auf Kosten der Präzision

+0

Aber in meinem Fall der ersten Liste x und die numpy Array x den gleichen Namen haben. Überschreibe ich also nicht das erste Array und speichere 2 Kopien nicht? – megashigger

+1

@megashigger: Die Liste kann nur zerstört werden, nachdem das Array erstellt wurde. Es gibt also einen Überlappungszeitraum, wenn beide vorhanden sind. Sie haben Recht, wenn Sie diese Zeile ausführen, wird die Speicherbelegung wieder auf ungefähr die ursprüngliche zurückfallen – Eric

Verwandte Themen