Mailing

Zapraszam do dolączenia do mailingu. Maile przychodzą we wtorki rano. Poniżej przykłady maili, a na dole formularz do zapisu.

Zaopisując się otrzymasz:

  • serię maili z wiedzą
  • informacje o wydarzeniach, szkoleniach
  • informację o płatnych programach (z możliwością wyciszenia)

Wśród maili które otrzymasz znajdą się takie pozycje jak:

  • o co chodzi z tymi sieciami neuronowymi?
  • Podstawy CNN: konwolucje od zera bez obrazu
  • Podstawy CNN: z jakich klocków budować sieć konwolucyjną?
  • Trening y=ax+b
  • zastosowania: obrazy – do czego użyć sieci neuronowych?
  • (Image recognition…) 8 wniosków z metody uczenia sieci gdy brak etykiet
  • (YOLO…) koniec badań nad wykrywaniem obiektów z uwagi na nieetyczne wykorzystanie
  • (odczytywanie paragonów) jak zrobić automat do odczytu paragonów?
  • (Avatarify) być albo nie być sobą? Kim wtedy?
  • (data bias) jeździsz na deskorolce czy używasz suszarki?
  • (frameworki) moc frameworków, co mam wybrać?
  • (overfitting, double descent) czy overfitting może być dobry?
  • (segmentacja) jak działają sieci do segmentacji semantycznej?
  • dlaczego – czyli jak zinterpretować decyzje CNN
  • Dlaczego używamy CE loss w klasyfikacji?
  • YOLOv4 krok po kroku
  • Od zbioru danych do pierwszej sieci neuronowej
  • Czego potrzebuję by wytrenować sieć?
  • jakie hiperparametry do treningu?

Przykładowa wiadomość 1

Od zbioru danych do pierwszej sieci neuronowej

Cześć,

pamiętam gdy bardzo chciałem wytrenować pierwszą własną sieć,

**żeby to tylko nie było na zbiorze MNIST**.

Chciałem móc mieć własne zdjęcia, do nich etykiety, jakkolwiek - w nazwie pliku, katalogu, czy też jako kolumna w csv.

Cokolwiek, by tylko być w stanie wytrenować sieć, by rozpoznawała obiekty moje - wskazane przeze mnie.

Patrząc z perspektywy - zrozumienie jak działają sieci, ich trening jest mega ważne.

Wyrobienie tej intuicji - co się stanie gdy zrobię x - co zrobić by stało się y - jest możliwe dzięki praktycznym eksperymentom.

Super się sprawdza próba pokonania kolejnych swoich najlepszych wyników,

poprzez zmianę architektury czy przetwarzania.

W tym mailu chcę Ci przybliżyć wątpliwości i problemy które czekają Cię w procesie,

zarówno nauki sieci neuronowych, jak i później w ich praktycznym stosowaniu.

Wtedy też zaczynają mieć znacznie aspekty praktyczne, takie jak poniższe pytania:

- Czy to nowy problem? Może ktoś to już robił?
- Czy istnieją rozwiązania? **Może jest gotowy model na GitHubie**? Zobacz koniecznie podobne problemy i rozwiązania
- Jak działają te rozwiązania dla naszych danych? Czy na pewno trzeba trenować sieć?
- Czy mamy wiedzę domenową? Czy rozumiemy zagadnienie, rozwiązywany problem?
- Czy znamy cel dla modelu? Ma być dokładny, szybki, czy może ma nie pominąć żadnego przypadku danej klasy?
- Jakie błędy są ok, a jakie nie? Co tak na prawdę jest istotne?

Często przechodzimy od razu do implementacji własnego rozwiązania,

które poprawiamy nie wiedzą co jest istotne.

Można powiedzieć, że przyjmujemy kierunek ortogonalny do oczekiwanego,

jak szybko byśmy nie szli nie przybliża nas to do celu ani trochę.

**Może warto nieco wolniej, a w dobrym kierunku?**

Czy muszę zaprojektować własną sieć?

Czy warto to robić? Do każdego problemu?!

A czy można nie?

Otóż można nie!

Ale warto to zrobić by się nauczyć i zrozumieć jak one działają.

Wiele architektur jest opracowanych i porównanych na dużych zbiorach danych

przez dziesiątki osób w zespołach, wytrenowane przez **wiele GPU-miesięcy, czy wręcz lat** (!)

Na szczęście community tworzące sieci neuronowe jest bardzo otwarte,

także jeśli chodzi o udostępnianie kodów, ba, nawet wytrenowanych modeli (!)

A jak być może wiesz nowe architektury sieci do klasyfikacji obrazu pojawiają się częściej niż comiesiąc (serio).

Wykorzystując sprawdzoną architekturę otrzymujesz obietnicę sukcesu :-)

Czy mój zbiór wystarczy?

**Ile potrzebuję mieć zdjęć?**

100, 1000, a może wystarczy mi 1 lub 0?

Czy do każdego zdjęcia potrzebuję mieć etykietę?

Wielu naukowców pracuje nad tym aby zmniejszyć tę liczbę.

Tu warto skorzystać, nie dość, że z gotowych archtiektur,

to jeszcze z gotowych modeli (czyli sieci wytrenowanych na dużych zbiorach).

No, ale mój problem jest wyjątkowy!

Jeżeli, Twoje zdjęcia pochodzą z kamer, to RACZEJ nie będą one zaskoczeniem.

Można wykorzystać jeden z gotowych modeli dostosowując go wykorzystując

**transfer learning** (podmieniamy końcówkę sieci - klasyfikator - i dotrenowujemy na naszym zbiorze)

To jest jedno z podejść, które pomoże.

A ile tych zdjęć potrzeba?

No niestety nie ma prostej odpowiedzi, zależy to od tego czy Twoje obiekty występują w różnym:

- oświetleniu (dzień, noc, cień, wiele źródeł światła, ...)
- barwie, nasyceniu, kontraście, teksturze (np. ubrania bywają różne)
- otoczeniu (czy masz zdjęcia **niedźwiedzia polarnego na sacharze**?)
- kształcie i rozmiarze (resorak, dwuosobowy Smart, Van, autobus czy ciężarówka - to wszystko samochody, nie?)

Im więcej tych różnic tym więcej potrzeba przykładów.

Idealnie by mieć po równo przykładów per cechę (nawet, wręcz szczególnie, jeżeli jakaś cecha występuje mega rzadko - wtedy dobrze mieć jej tyle co tej częstej)

Jak i czy przetworzyć zdjęcia na wejściu sieci?

Czy zmienić przestrzeń barw?

Może wystarczy mi skala szarości, zamiast RGB?

Jaką zastosować obróbkę obrazów?

- usunięcie szumów (filtr medianowy, gaussian blur, a może odjęcie obrazu średniego?)
- zmiana rozdzielczości (na mniejszą lub większą - zob. Super Resolution)
- wyciąć obiekt precyzyjnie? (czy się nie rusza, czy łatwo go znaleźć?)
- Zmiana przestrzeni barw (HSV, HSL, Lab, TSL, YUV, XYZ, YCbCr, ...)
- przekształcenie afiniczne (translacja, rotacja, skala), undistort; widok z góry itp.
- może segmentacja semantyczna by coś wyszczególnić? Czyli rozwiążmy problem trudniejszy by rozwiązać prostszy.
- Normalizacja vs standaryzacja
- Enhancement - **uwypuklenie cech** - np. CLAHE, ZCA whitening

Jest wiele sposobów, które możesz wykorzystać by wstępnie przetworzyć dane.

Dobrze jest wyrobić sobie intuicję odnośnie tych rozwiązań.

Brakuje mi zdjęć, trudno je uzyskać, czy jest jakiś sposób?

Co możesz zrobić w takiej sytuacji, bo warto o tym mówić,

to zdarza się tak często, że raczej na pewno przytrafi się i Tobie.

Możesz próbować dane generować na podstawie przykładów, które już masz!

Zastosuj zmiany

- kontrastu, jasności, gamma
- nasycenia, balansu bieli, (**uwaga - barwy nie ruszamy**)
- odbicia, obroty, scala, przesunięcia, przekoszenia
- może symulowany brak kalibracji kamery?
- wytnij/zasłoń losowy fragment obrazu
- wykonaj style transfer
- a może dodaj warunki pogodowe?

W tym celu oczywiście możesz skorzystać z pomocnych bibliotek, takich jak **Albumentations** oraz **Kornia**.

No miałem Ci jeszcze napisać odnośnie poniższych pytań:

- Jak zaprojektować architekturę sieci?
- Jaki framework użyć do uczenia?
- Czego potrzebuję by wytrenować sieć?
- O czym warto pamiętać podczas treningu?
- Skąd będę wiedzieć czy to już?
- Co mam zrobić, by moja sieć działała lepiej na produkcji, danych testowych?
- A czy to może działać szybciej?!

Podeślę za tydzień, ok?

Bo dużo tego wyszło.

Pozdrawiam,

Karol

Przykładowa wiadomość 2

Czego potrzebuję by wytrenować sieć?

Cześć,

W poprzednim mailu przybliżałem Tobie wątpliwości i problemy które czekają Cię w procesie,
zarówno nauki sieci neuronowych, jak i później w ich praktycznym stosowaniu.
Jak pamiętasz padło wiele pytań, między innymi:

- Czy muszę zaprojektować własną sieć?
- Czy mój zbiór wystarczy?
- Jak i czy przetworzyć zdjęcia na wejściu sieci?
- Brakuje mi zdjęć, trudno je uzyskać, czy jest jakiś sposób?

No a dziś kontynuacja upragniona, także nie przedłużam:

Jak zaprojektować architekturę sieci?

Po pierwsze - czy tego w zasadzie potrzebujesz skoro istnieje wiele dobry architektur?

Jeżeli już - to koniecznie porównaj kluczowe parametry (czas obliczeń, accuracy, precision, a może recall?)

**Kiedy raczej nie warto projektować własnej sieci?**

- gdy masz zdjęcia większe niż 64x64px
- gdy twoje obiekty występują w bardzo wielu konfiguracjach
- chcesz uzyskać najwyższą możliwą dokładność szybko
- chcesz mieć dobre wyniki w racjonalnym czasie

Projektując własną sieć możesz skorzystać z warstw konwolucyjnych,

tak, by zamienić obraz przestrzenny na jednowymiarowy wektor wartości,

czyli **wektor cech**, który zostanie wykorzystany do klasyfikacji czy też regresji.

Czyli ogólnie - budujesz model dzielący się na dwie części ekstrakcję cech oraz klasyfikację/regresję w zależności co jest Twoim celem.

Jaki framework użyć do uczenia?

Najpopularniejsze to oczywiście TensorFlow i PyTorch.

W specyficznych przypadkach może wydać Ci się zasadne użycie Tencent NCNN, który jest dostępny na wielu architekturach sprzętowych.

**Kerasa** (polecam) nie wymieniłem, bo to część TensorFlow od pewnego czasu.

W ramach PyTorcha możesz użyć **PyTorch Lightning** (polecam), albo PyTorch Lightning Flash

Zaczynając warto korzystać z Kerasa lub PyTorch Lightninga.

Jest jeszcze PyTorch Lightning Flash, ale jest to młoda biblioteka.

Zdecydowanie warto zaczynać przygodę z Kerasem - pozwala łatwo budować własne architektury,

w podstawowej wersji masz metodę fit, która robi całą magię treningu.

Dla pełniejszego zrozumienia co się dzieje warto zobaczyć "Keras: Writing a training loop from scratch", albo zaimplementować pętlę treningu w PyTorchu.

Jeżeli chcesz używać najnowszych architektur, które powstają obecnie,

to zdecydowanie sprawdź PyTorcha oraz repozytorium **TIMM**.

Czego potrzebuję by wytrenować sieć?

- zdjęć z etykietami (albo bez do wykorzystania w podejściu Self-Supervised)
- architektury sieci - własna/wybrana z gotowych
- funkcji preprocessingu (**minimum to normalizacja danych**)
- definicji klas i ich liczby, albo specyfikacji regresji (pamiętaj by wyjście znormalizować do okolic zera!)
- oczywiście kryterium optymalizacji - CE Loss dla klasyfikacji, np. MSE/MAE dla regresji
- mocy obliczeniowej - przy obrazach warto mieć możliwość uruchomienia obliczeń na laptopie z kartą Nvidia (najlepiej z końcówką nazwy na 70/80/90), desktopa lub maszyny w chmurze z GPU Nvidia'i, ale nauczyć się możesz używając Google Colab
- Warto śledzić wyniki eksperymentów, porównywać (TensorBoard, HParams, MLFlow, itp.)

O czym warto pamiętać podczas treningu?

- o zapisywaniu wyników
- **o walidacji na jednym i tym samym zbiorze, na którym nie trenujemy**
- o odłożeniu danych testowych jak najpóźniej (sprawdzamy na zbiorze do walidacji, a gdy już wszystkie możliwości poprawy modelu wyczerpiemy robimy test) - ważne - nie oglądamy danych testowych
- o odpowiednim wysyceniu kart graficznych, by trening dobrze wykorzystywał dostępne zasoby
- o zapisywaniu wynikowego modelu (co kilka epok, ostatniego, a może najlepszego?)
- o zapisaniu decyzji podczas projektowania modelu, zmiany architektury czy zmiany parametrów
- Wybór callbacków uruchamianych podczas treningu
    - Early Stopping - by zapobiec overfittingowi
    - Model checkpointer - by zapisywać modele często
    - live loss plot - jeżeli trenujesz w Colabie/notebooku
    - TensorBoard - aby porównywać kolejne sesje treningowe
    - HParams - by sprawdzić jaka kombinacja hiperparametrów dała najlepszy wynik
    - MLFlow - zamiast TB do śledzenia, ale nie tylko, bo to całe MLOps

Skąd będę wiedzieć czy to już?

A może model może być dokładniejszy, gdyby coś?

**Koniecznie obserwuj metryki**!

Jeżeli wyświetlisz sobie parallel plot np. w HParams to od razu zauważysz,

która kombinacja parametrów była najlepsza.

Warto śledzić też koszt treningu na zbiorze walidacyjnym (rób walidację co jakiś czas, co epokę lub co kilka).

Jeżeli loss zacznie wzrastać - może to świadczyć o overfittingu (możesz iść w stronę Double Descent, ale warto po prostu zatrzymać trening, pokombinować z regularyzacją, z data augmentation itp.)

Możesz też sobie postanowić, że wystarczy cokolwiek lepiej niż X.

Co mam zrobić, by moja sieć działała lepiej na produkcji, danych testowych?

Jeśli Twoim zbiorem testowym są nowe dane pochodzące z produkcji - warto zwrócić uwagę na:

- okresowość, sezonowość, a może wypadła jakaś globalna pandemia ostatnio?
- degradację parametrów - zabrudzenie obiektywu, pogorszenie oświetlaczy, zmiana kompresji przy zapisie itp.
- warto by **data augmentation produkowało dane podobne do produkcji/testu**

A czy to może działać szybciej?!

Zwykle spodziewasz się odpowiedzi, że owszem.

Co możesz zrobić?

- Kwantyzacja - wykorzystanie niższej precyzji obliczeń GPU - FP16, INT8 (inferencja i trening)
- **TensorRT - przyspieszenie inferencji modelu**
- Zwiększenie Batcha - niekoniecznie znacznie przyspieszy
- Zidentyfikować wąskiego gardła (dysk, preproc, gpu, postproc) - działa zawsze, bo to uniwersalne podejście
- Wybróbować Nvidia Triton Inference Server - zarządza GPU celem maksymalnego performance'u

Mam nadzieję, że ten mail trochę uzupełnił poprzednią treść.

Do następnego!

Pozdrawiam,

Karol

Comments are closed.

Close