Aktywne Wpisy
Notrix +3
Geralt678 +7
Ja się poddaje blackpill dał mi znowu popalić i powiedział hola Przegrywie nie tym razem. Więc od początku znowu spróbowałem swoich sił w realu, spodobała mi się jedna różowa 5-6/10 sprzedawała pamiątki no to podbiłem, do niej gadka szmatką komplet noi spytałem o pracę rozmowa uśmiechy wymiana spojrzeń pytam i kiedy ma wolne ona mówi w weekend no to zaproponowałem kawę a ta uśmiechnęła się i powiedziała że nie może innym razem
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
@Darkus777: nie wiem, może przez to. Tak tylko strzelam
- 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.
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 :
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
@Darkus777: np.concat()
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 ([..], [..], [..], [..]).
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
https://imgur.com/a/rdVi2K3 - zbieram w liście float32, bo sam obraz jest tego typu.
Przeczytaj sobie wątek https://stackoverflow.com/questions/1316767/how-can-i-explicitly-free-memory-in-python
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 ;)