Wpis z mikrobloga

Cześć!
Mam problem dot. zamiany listy tablic 2D (n x n) na numpy array. Gdy to zrobię zużycie RAM drastycznie rośnie. Miał ktoś z tym taki problem?
Zadanie realizuję w CoLab jak i u siebie na PC, lokalnie. Prześlę zużycie RAM w odpowiednich miejscach.
Scenariusz wygląda tak:
- wczytuje obraz

Gen RAM Free: 12.8 GB | Proc size: 447.8 MB

- dziele go na podobrazy o rozdzielczości 13 x 13

- otrzymuję "List of 6859434 images"
Gen RAM Free: 11.9 GB | Proc size: 2.1 GB
**Lista wessała 1.5GB, może być**

- następnie zamieniam listę za pomocą polecenia np.array(lista)
Xtrain = np.asarray(Xtrain,dtype=np.float32)
Xtest= np.asarray(Xtest,dtype=np.float32)

- otrzymuję "Shape of our training data: (6859434, 13, 13, 1)"
Gen RAM Free: 11.9 GB | Proc size: 8.1 GB

Jak widać, 6 GB zostało wessane poprzez zmianę list na array :/ jakieś pomysły? Nie chcę być zmuszony do kupienia 64GB RAM do PC...

#python #machinelearning
  • 38
@Darkus777:
- kasujesz listy po zrobieniu arrayow? Jak tworzysz numpy arraye z list to i tak stworzy się kopia
- sprawdzales rozmiar tych arrayow poleceniem sys.getsizeof() ? To pozwoli Ci kontrolować, co faktycznie zajmuje miejsce, a nie tylko kontrolować, ile całej pamięci zajmuje program.
@draxter: mogę zmienić na float16, to też jakieś rozwiązanie, ale "obcinam" sobie dokładnośc, może faktycznie bezinwazyjnie w kontekście nauki sieci neuronowej. Pozwoliłem zrobić sobie symulacje:
Dla float32 - 10 zdjęć - 9,91GB
Dla float16 - 10 zdjęć - 5,74GB
Tylko dziwi mnie to, bo przecież tablica powinna zajmować mniej od listy ;p
@tomasztomasz1234: Tak, kasuję. Operacją "del". Wg dokumentacji przy asarray nie trzeba, dla np.array masz jeszcze opcję:

copy :
@Darkus777: no nie, napisane jest, że

No copy is performed if the input is already an ndarray with matching dtype and order.

I pod tym, co Ty skopiowałeś pokazany jest przykład kodu właśnie jak robisz asarray na czymś, co już jest arrayem, a u Ciebie jak rozumiem robisz asrray na liście jako argumencie. Zresztą prosto możesz sprawdzić, czy asarray zrobił kopię czy nie:

a=np.asarray(b)
a is b

I jak zwróci True
@mrocznapszczola: Niestety to nie rozwiązuje mojego problemu. Oczywiście jeśli miałeś na myśli: numpy.concatenate.
Wytłumaczę szerzej, każdy mój element 15x15 jest obrazem czterokanałowym czyli jego wymiary wyglądają następująco (15,15,4). Wycinam 4 obrazki z każdego kanału a potem je łącze czyli mam cztery tablice o wymiarach (15,15,1) i łącze je w jeden o wymiarze (15,15,4), w tej samej iteracji. Więc każdy element to ([..], [..], [..], [..]).
@Darkus777: nie słuchaj tych cymbałów u góry.

Masz jakiś błąd w kodzie, bo w przypadku listy masz ewidentnie datatype uint8, a w przypadku arraya masz float32. Mówisz że nie, ale wystarczy że sobie policzysz:
6859434 obrazów x 15 x 15 x 1 bajt (jako że uint8) to wychodzi dokładnie 1,5 GB.
Przy zmianie na float32 masz oczywiście 4 razy więcej, więc 6 GB.
Lista musi zajmować praktycznie dokładnie tyle samo miejsca
@Rub3n: Tutaj masz dane dla 15x15, bo w wątku pisałem dla 13x13.
https://imgur.com/a/s7nNNj2
Łączna liczba obrazów 8574293
Lista (8574293,15, 15) to jest 1929,215925 GB. W poprzednim komentarzu pokazałem w trybie debug jak ta lista wygląda od środka, widać, że każdy element to float32 :/ Jako, że float32 to masz 4bajty czyli 7716,863700 GB dla array, co się zgadza bo 11.8GB - 4.1GB daje ~7,7GB ;)