MNIST dataset – sieci neuronowe, część 0 (przygotowanie)

Zaczynamy cykl związany z sieciami neuronowymi. Zaczniemy od przygotowania danych.

W kilku kolejnych postach posłużymy się danymi z ręcznie pisanymi liczbami. Zbiór ten nazywa się MNIST i jest bardzo popularny w świecie datalogów. Można go pobrać z tego miejsca. Klasyfikacja ręcznie pisanych liczb to takie hello world w sieciach neuronowych.

W kolejnych częściach:

  • zbudujemy narzędziownię w R (w oparciu o bibliotekę Keras)
  • zbudujemy prostą sieć neuronową i sprawdzimy jakie daje efekty
  • zbudujemy sieć konwolucyjną (CNN) i sprawdzimy czy daje lepsze efekty, spróbujemy ją również rozbudować

Pliki jednak nie są w super przyjaznej formie (na przykład w Excelu nie da się ich otworzyć) – na początek więc przetworzymy je na czytelną formę.

Zgodnie z opisem zbiór dzieli się na cztery pliki. Mamy więc dwie (dane treningowe i testowe) paczki: plik określający literki oraz dane opisujące ich wygląd. Pliki są binarne, przetworzymy je na pliki CSV.

Ściągamy pliki .GZ i rozpakowujemy je. W dalszej części wpisu zajmiemy się tylko plikiem z danymi treningowymi. Sama konwersja danych testowych jest identyczna.

Pierwszy krok to labelki, czyli jaką liczbę pokazują dane? To prosta sprawa – wystarczy poszczególne bajty zamienić na wartości liczbowe:

I już! Kolejne elementy tablicy to po prostu liczby mówiące nam co widzimy na obrazku.

Obrazki są nieco trudniejsze w obsłudze. Każda liczba zapisana jest w postaci obrazka 28 na 28 pikseli. Początek pliku to jakieś dane informacyjne (opisane na stronie ze zbiorem), a później mamy 60 tysięcy ciągów 784 bajtów (28*28) opisujących wygląd pisanych liczb (60 tysięcy).

Wybieramy zatem po te 784 bajtów, układamy je w wiersz, na początku wiersza dodajemy odpowiedni label i całość upychamy w wielką tablicę:

Proces jest pracochłonny, dlatego od razu zapisujemy wynik do pliku CSV:

Podobne zabiegi trzeba dokonać dla danych testowych (odpowiednio modyfikując ścieżkę do plików i przesunięcie – w danych testowych opisujących obraz nie ma kilku bajtów).

Zobaczmy ile jest liczb w danych treningowych?

Rozkład jest mniej więcej równomierny.

Na razie mamy do czynienia z danymi w postaci cyferek, ale czy możemy je pokazać? Napiszemy funkcję, która z całych danych treningowych wybierze jeden wiersz i jego zawartość pokaże w formie graficznej.

Jedyne co trzeba zrobić to ciąg 784 liczb (o wartości od 0 do 255 co odpowiada stopniowi zaczernienia punktu) złożyć w macierz 28×28 punktów i ją pokazać. Dodatkowo, aby obraz nie był odbity w pionie (punkt 0,0 jest w lewym dolnym rogu dla wykresów, ale dla obrazków jest to lewy górny róg) musimy go obrócić.

Zamiast podwójnego fora można użyć kombinacji apply() z rev() .

Pokażmy jakąś losową liczbę:

Działa.

Teraz zróbmy coś podobnego, ale z pomocą ggplot. I żeby nie było tak samo – weźmiemy 12 losowo wybranych szóstek:

Jak widać szóstki są różne, proces kategoryzacji danych testowych będzie zatem dość trudny. Ale to w kolejnej części.

Spróbujmy zobaczyć uśrednione wartości dla każdej z liczb. Wykorzystamy w znacznym stopniu powyższy kod. Zamiast rysować pojedyncze szóstki – przygotujemy 10 wierszy (liczby od 0 do 9) z uśrednionymi danymi:

Widać, że niektóre z liczb są w miarę “zwarte”, w pewnym sensie można wyróżnić miejsca, przez które musi przechodzić linia w każdym z wariantów zapisu danej liczby. To cenna obserwacja, zapamiętajcie ją.

A na koniec niespodzianka: zamiast przygotowywać dane w CSV z oryginalnego zbioru MNIST można je po prostu ściągnąć z Kaggle.com. Dalsze części opierać się będą właśnie na danych z Kaggle.

3 komentarze do wpisu „MNIST dataset – sieci neuronowe, część 0 (przygotowanie)

Dodaj komentarz