Piotr Nowak, Jakub Ledwoń
Projekt w Overleaf:
https://www.overleaf.com/read/kkkkrwvjbgyn#24acfa
Projekt wymaga Pythona 3.10 lub 3.11.
Projekt wykorzystuje PyTorch i może działać zarówno na CPU, jak i GPU (CUDA). Do działania na GPU wymagane są:
- karta NVIDIA z obsługą CUDA
- zainstalowany PyTorch z obsługą CUDA (np.
cu121) - aktualne sterowniki NVIDIA
pip install -r requirements.txt
UWAGA! Jeśli chcesz używać GPU, zainstaluj PyTorch osobno: pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 , lub inne w zależności od wersji karty
Funckja aktywacji w każdej warstwie to ReLU. Liczba klas jest równa 10
- Warstwa konwolucyjna 32x32
- Warstwa konwolucyjna i pooling 16x16
- Warstwa konwolucyjna i pooling 8x8
- Warstwa konwolucyjna i pooling 4x4
- Warstwa feed-forward 256x4x4 -> 512
- Warstwa feed-forward 512 -> 10
Rozpiska funkcji z pliku statistics.py:
timer: Wypisuje czas przejścia dla 1 batchacount_parameters: Wypisuje ilość parametrów, MAC-ów oraz schemat modeluroc_and_statistics: Zwraca wykres ROC oraz raport klasyfikacji (czyli recall, precision, f1-score dla wszystkich klas oraz accuracy)
Pruning mamy w dwóch wariantach: unstructured (usuwanie pojedyńczych wag) oraz structured (usuwanie grup wag). Dodatkowo każdy z nich może zostać przeprowadzony z wykorzystaniem regularyzacji L1 lub L2. W przypadku tego projektu używamy pruningu wbudowanego w bibliotekę PyTorch (lub fRAmEWOrk jeżeli chce któs być biznesowym ważniakiem) - co oznacza, że możemy porównać różnice w wykorzystaniu regularyzacji tylko dla structured pruningu, gdyż dla unstructured efektywnie nie ma implementacji L2. Oficjalny powód jest taki, że nie ma to wpływu na wynik końcowy.
apply_structured_pruning: robi structured pruning L1 lub L2 - zależy co wybierzeszapply_unstructured_pruning: robi unstructured WAŻNE: parametr 'part_step'(domyślnie False) słuzy do decydowania czy chcemy zrobić kilka takich pruningów pod rząd - wtedy ten parametr musi być True dla wszytskich poza ostatnim. Na sam koniec pruningu wypisuje informacje o ilości zerowych parametrów, wszystkich parametró oraz sparcity
-
Unstructured (L1/L2): Trening modelu -> Analiza wyników na danych testowych ->
apply_unstructured_pruning-> Dotrenowanie modelu -> Analiza wyników na danych testowych Ważne! Tutaj jeżeli unstructured pruning ma part_step = True, to nie uda się użyćcount_parameters- wynika to z tego, że na sieci jest maska, która jest niekompatybilna z tą funkcją - można jej użyć dopiero po zroobieniu pruningu z part_step = False -
Structured L1/L2: Trening modelu -> Analiza wyników na danych testowych ->
apply_structured_pruning-> Dotrenowanie modelu -> Analiza wyników na danych testowych
python main.py