CNTK - Tworzenie pierwszej sieci neuronowej
W tym rozdziale zajmiemy się tworzeniem sieci neuronowej w CNTK.
Zbuduj strukturę sieci
Aby zastosować koncepcje CNTK do zbudowania naszego pierwszego NN, będziemy używać NN do klasyfikowania gatunków kwiatów tęczówki na podstawie właściwości fizycznych szerokości i długości działek oraz szerokości i długości płatków. Zbiór danych, którego będziemy używać, zbiór danych tęczówki opisujący właściwości fizyczne różnych odmian kwiatów tęczówki -
- Długość działki
- Szerokość działki
- Długość płatka
- Szerokość płatka
- Klasa tj. Iris setosa lub iris versicolor lub iris virginica
Tutaj będziemy budować zwykły NN zwany wyprzedzającym NN. Zobaczmy kroki implementacji, aby zbudować strukturę NN -
Step 1 - Najpierw zaimportujemy niezbędne komponenty, takie jak nasze typy warstw, funkcje aktywacji i funkcję, która pozwala nam zdefiniować zmienną wejściową dla naszego NN, z biblioteki CNTK.
from cntk import default_options, input_variable
from cntk.layers import Dense, Sequential
from cntk.ops import log_softmax, relu
Step 2- Następnie stworzymy nasz model za pomocą funkcji sekwencyjnej. Po utworzeniu będziemy go karmić wybranymi warstwami. Tutaj utworzymy dwie odrębne warstwy w naszym NN; jeden z czterema neuronami, a drugi z trzema neuronami.
model = Sequential([Dense(4, activation=relu), Dense(3, activation=log_sogtmax)])
Step 3- W końcu, aby skompilować NN, połączymy sieć ze zmienną wejściową. Posiada warstwę wejściową z czterema neuronami i warstwę wyjściową z trzema neuronami.
feature= input_variable(4)
z = model(feature)
Stosowanie funkcji aktywacji
Istnieje wiele funkcji aktywacji do wyboru, a wybór odpowiedniej funkcji aktywacji z pewnością wpłynie na to, jak dobrze będzie działał nasz model głębokiego uczenia.
Na warstwie wyjściowej
Wybór activation funkcja w warstwie wyjściowej będzie zależeć od rodzaju problemu, który zamierzamy rozwiązać za pomocą naszego modelu.
W przypadku problemu regresji powinniśmy użyć linear activation function na warstwie wyjściowej.
W przypadku problemu z klasyfikacją binarną powinniśmy użyć pliku sigmoid activation function na warstwie wyjściowej.
W przypadku problemu z klasyfikacją wieloklasową powinniśmy użyć softmax activation function na warstwie wyjściowej.
Tutaj zbudujemy model do przewidywania jednej z trzech klas. Oznacza to, że musimy użyćsoftmax activation function w warstwie wyjściowej.
Na ukrytej warstwie
Wybór activation funkcja w warstwie ukrytej wymaga pewnych eksperymentów w celu monitorowania wydajności, aby zobaczyć, która funkcja aktywacji działa dobrze.
W przypadku problemu klasyfikacyjnego musimy przewidzieć prawdopodobieństwo, że próbka należy do określonej klasy. Dlatego potrzebujemyactivation functionto daje nam wartości probabilistyczne. Aby osiągnąć ten cel,sigmoid activation function może nam pomóc.
Jednym z głównych problemów związanych z funkcją sigmoidy jest problem znikającego gradientu. Aby przezwyciężyć taki problem, możemy skorzystaćReLU activation function który ukrywa wszystkie wartości ujemne do zera i działa jako filtr przechodzący dla wartości dodatnich.
Wybór funkcji straty
Kiedy już mamy strukturę naszego modelu NN, musimy ją zoptymalizować. Do optymalizacji potrzebujemy plikuloss function. w odróżnieniuactivation functions, mamy do wyboru bardzo mniej funkcji strat. Jednak wybór funkcji straty będzie zależał od rodzaju problemu, który zamierzamy rozwiązać za pomocą naszego modelu.
Na przykład w przypadku problemu klasyfikacji powinniśmy użyć funkcji straty, która może zmierzyć różnicę między przewidywaną klasą a klasą rzeczywistą.
funkcja straty
W przypadku problemu klasyfikacji rozwiążemy za pomocą naszego modelu NN, categorical cross entropyfunkcja straty jest najlepszym kandydatem. W CNTK jest zaimplementowany jakocross_entropy_with_softmax z których można importować cntk.losses pakiet w następujący sposób -
label= input_variable(3)
loss = cross_entropy_with_softmax(z, label)
Metryka
Mając strukturę naszego modelu NN i funkcję straty do zastosowania, mamy wszystkie składniki, aby rozpocząć tworzenie przepisu na optymalizację naszego modelu uczenia głębokiego. Zanim jednak zagłębimy się w tę kwestię, powinniśmy poznać metryki.
cntk.metrics
CNTK ma pakiet o nazwie cntk.metricsz którego możemy zaimportować metryki, których będziemy używać. Podczas budowania modelu klasyfikacji będziemy używaćclassification_error matric, który wygeneruje liczbę z przedziału od 0 do 1. Liczba od 0 do 1 wskazuje procent poprawnie przewidywanych próbek -
Najpierw musimy zaimportować metrykę z cntk.metrics pakiet -
from cntk.metrics import classification_error
error_rate = classification_error(z, label)
Powyższa funkcja w rzeczywistości wymaga danych wyjściowych NN i oczekiwanej etykiety jako danych wejściowych.