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
  • Odpowiedz
@Darkus777: Jeśli lista przechowuje dane w innym formacie, to czemu nie? Jeśli to są zdjęcia, to można je przechowywać w int8, bo wartości są z przedziału [0,255]. Po zamianie na float32 będzie ważyć 4 razy więcej.
  • Odpowiedz
@skrzacik320: Ale w tej liście są elementy (array) które przechowują wartości typu float32, popatrz na zdjęcia to ktore wysłałem w innej wiadomości poprzez imgur. Nie są z tego przedziału bo to zdjęcia medyczne (DICOM) + ja je uprzednio normalizuje.
  • Odpowiedz
@Darkus777: No ok, jeśli ta lista, którą pokazałeś, po zamianie na numpy robi się 4 razy większa, to widzę tylko takie wyjaśnienia:
1. Elementy tych list się powtarzają, więc w wielu miejscach trzymane są tylko referencje do tych samych obiektów, które podczas konwersji na jedną array są kopiowane.
2. Numpy ma jakiś sposób przechowywania sparse, więc te wszystkie zera zabierają mniej miejsca, a Ty podczas konwersji to wyłączasz. Ja na
  • Odpowiedz
@Darkus777: A no widzisz. Czyli moja pierwsza teoria jest właściwa. Twoja lista trzyma nie osobne tablice, tylko referencje do wycinków (slices) tablicy z obrazem. Ty w linijce val.append(T2[z, ybegin:yend, xbegin:xend]) nie kopiujesz wycinka T2. Zmienna val trzyma wiele referncji do tych samych miejsc w tablicy T2, które później gdy robisz np.asarray(val) są kopiowane pomnażając wielkość tablicy.
  • Odpowiedz
@skrzacik320: Jestem zmuszony to zrobić ponieważ siec CNN z biblioteki keras, potrzebuje mieć na wejściu array ;)
x: Numpy array of training data (if the model has a single input), or list of Numpy arrays (if the model has multiple inputs).
  • Odpowiedz
@Darkus777: Ale sieć nie bierze na raz całego zbioru danych, tylko minibatche. Więc możesz zamieniać tylko te kawałki całej listy, które w danym momencie wrzucasz do modelu. Pewnie to wymaga napisania własnego iteratora, ale nie powinno to być trudne.

Tak się przy okazji zastanawiam, bo to co robisz wygląda na naiwną implementację warstwy conv2d. Tylko nie wiem, czemu robisz to jako preprocessing, a nie normalnie w modelu używając gotowych klas.
  • Odpowiedz
@skrzacik320: Wtedy trzeba by było stworzyć własny generator. Nie rozumiałem drugiego akapitu, m.in "czemu robisz to jako preprocessing, a nie normalnie w modelu używając gotowych klas. ". O jakie klasy chodzi?
  • Odpowiedz
Wtedy trzeba by było stworzyć własny generator.


@Darkus777: Co za problem. Losujesz num_samples z listy, scalasz w jedną listę, zamieniasz na np.array i zwracasz. Masz generator :-)

Chodzi mi o to, że to co tutaj opisałeś, wygląda jak to co robi warstwa conv2d. Skoro napisałeś, że potem to wrzucasz do modelu CNN, czyli właśnie do sieci zbudowanej z warstw conv2d, to nie bardzo rozumiem do czego to co tutaj robisz
  • Odpowiedz
@skrzacik320: Tylko, że ja nie wrzucam całego obrazu do sieci ;p Moim zadaniem jest segmentacja guza mózgu. Każde takie okno ma etykietę mówiącą czy w środkowym pikselu tego okna znajduje się tekstura guza, jeśli tak to weź jego otoczenie i przypisz mu etykietę. Jeśli nie, to znaczy, że to jest zdrowa tkanka. Do tego potrzebna jest maska stworzona z 4 różnych sekwencji tego samego obrazu ;P

A co do generatora
  • Odpowiedz