Deep Learning z Keras - przygotowywanie danych
Zanim prześlemy dane do naszej sieci, należy je przekonwertować do formatu wymaganego przez sieć. Nazywa się to przygotowywaniem danych do sieci. Zwykle polega na przekształceniu wielowymiarowych danych wejściowych na jednowymiarowy wektor i normalizacji punktów danych.
Zmiana kształtu wektora wejściowego
Obrazy w naszym zbiorze danych składają się z 28 x 28 pikseli. To musi zostać zamienione na jednowymiarowy wektor o rozmiarze 28 * 28 = 784, aby wprowadzić go do naszej sieci. Robimy to, dzwoniąc doreshape metoda na wektorze.
X_train = X_train.reshape(60000, 784)
X_test = X_test.reshape(10000, 784)
Teraz nasz wektor uczący będzie składał się z 60000 punktów danych, z których każdy będzie składał się z pojedynczego wektora wymiaru o rozmiarze 784. Podobnie, nasz wektor testowy będzie składał się z 10000 punktów danych jednego wektora wymiarowego o rozmiarze 784.
Normalizowanie danych
Dane, które zawiera wektor wejściowy, mają obecnie dyskretną wartość między 0 a 255 - poziomy skali szarości. Normalizacja tych wartości pikseli między 0 a 1 pomaga w przyspieszeniu treningu. Ponieważ zamierzamy używać stochastycznego spadku gradientu, normalizacja danych pomoże również zmniejszyć ryzyko utknięcia w lokalnych optymach.
Aby znormalizować dane, reprezentujemy je jako typ zmiennoprzecinkowy i dzielimy przez 255, jak pokazano w poniższym fragmencie kodu -
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255
Przyjrzyjmy się teraz, jak wyglądają znormalizowane dane.
Badanie znormalizowanych danych
Aby wyświetlić znormalizowane dane, wywołamy funkcję histogramu, jak pokazano tutaj -
plot.hist(X_train[0])
plot.title("Digit: {}".format(y_train[0]))
Tutaj wykreślamy histogram pierwszego elementu X_trainwektor. Drukujemy również cyfrę reprezentowaną przez ten punkt danych. Tutaj pokazano wynik uruchomienia powyższego kodu -
Zauważysz gęstą gęstość punktów o wartości bliskiej zeru. Są to czarne punkty na obrazie, które oczywiście stanowią główną część obrazu. Reszta punktów skali szarości, które są zbliżone do koloru białego, reprezentują cyfrę. Możesz sprawdzić rozkład pikseli dla innej cyfry. Poniższy kod drukuje histogram cyfry o indeksie 2 w zestawie danych uczących.
plot.hist(X_train[2])
plot.title("Digit: {}".format(y_train[2])
Wynik uruchomienia powyższego kodu pokazano poniżej -
Porównując powyższe dwie figury, zauważysz, że rozkład białych pikseli na dwóch obrazach różni się, co wskazuje na reprezentację innej cyfry - „5” i „4” na dwóch powyższych zdjęciach.
Następnie zbadamy dystrybucję danych w naszym pełnym zestawie danych szkoleniowych.
Badanie dystrybucji danych
Zanim wytrenujemy nasz model uczenia maszynowego w naszym zbiorze danych, powinniśmy znać rozkład unikatowych cyfr w naszym zbiorze danych. Nasze obrazy przedstawiają 10 różnych cyfr w zakresie od 0 do 9. Chcielibyśmy poznać liczbę cyfr 0, 1 itd. W naszym zbiorze danych. Możemy uzyskać te informacje za pomocąunique metoda Numpy.
Użyj następującego polecenia, aby wydrukować liczbę unikatowych wartości i liczbę wystąpień każdej z nich
print(np.unique(y_train, return_counts=True))
Po uruchomieniu powyższego polecenia zobaczysz następujące dane wyjściowe -
(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=uint8), array([5923, 6742, 5958, 6131, 5842, 5421, 5918, 6265, 5851, 5949]))
Pokazuje, że istnieje 10 różnych wartości - od 0 do 9. Istnieje 5923 wystąpień cyfry 0, 6742 wystąpień cyfry 1 i tak dalej. Tutaj pokazano zrzut ekranu wyjścia -
Na ostatnim etapie przygotowania danych musimy zakodować nasze dane.
Kodowanie danych
W naszym zbiorze danych mamy dziesięć kategorii. W ten sposób zakodujemy nasze dane wyjściowe w tych dziesięciu kategoriach przy użyciu kodowania na gorąco. Do kodowania używamy metody to_categorial narzędzi Numpy. Po zakodowaniu danych wyjściowych każdy punkt danych zostanie przekształcony w jednowymiarowy wektor o rozmiarze 10. Na przykład cyfra 5 będzie teraz reprezentowana jako [0,0,0,0,0,1,0,0,0 , 0].
Zakoduj dane za pomocą następującego fragmentu kodu -
n_classes = 10
Y_train = np_utils.to_categorical(y_train, n_classes)
Możesz sprawdzić wynik kodowania, drukując pierwsze 5 elementów skategoryzowanego wektora Y_train.
Użyj poniższego kodu, aby wydrukować pierwsze 5 wektorów -
for i in range(5):
print (Y_train[i])
Zobaczysz następujący wynik -
[0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
[1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]
[0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
Pierwszy element reprezentuje cyfrę 5, drugi oznacza cyfrę 0 i tak dalej.
Na koniec będziesz musiał również sklasyfikować dane testowe, co odbywa się za pomocą następującego stwierdzenia -
Y_test = np_utils.to_categorical(y_test, n_classes)
Na tym etapie Twoje dane są w pełni przygotowane do wprowadzenia do sieci.
Następna jest najważniejsza część, czyli szkolenie naszego modelu sieci.