Samouczek dotyczący sztucznej sieci neuronowej z przykładami TensorFlow ANN
Co to jest sztuczna sieć neuronowa?
An Sztuczna sieć neuronowa (ANN) to system komputerowy inspirowany biologicznymi sieciami neuronowymi, służący do tworzenia sztucznych mózgów w oparciu o zbiór połączonych jednostek zwanych sztucznymi neuronami. Został zaprojektowany do analizowania i przetwarzania informacji tak, jak ludzie. Sztuczna sieć neuronowa ma możliwości samouczenia się, co pozwala uzyskać lepsze wyniki w miarę dostępności większej ilości danych.

Sztuczna sieć neuronowa (ANN) składa się z czterech głównych obiektów:
- Warstwy: cała nauka odbywa się w warstwach. Istnieją 3 warstwy 1) Wejście 2) Ukryte i 3) Wyjście
- Funkcja i etykieta: Dane wejściowe do sieci (funkcje) i dane wyjściowe z sieci (etykiety)
- Funkcja utraty: Metryka używana do szacowania wyników fazy uczenia się
- Optimizer: Usprawnij naukę poprzez aktualizację wiedzy w sieci
Sieć neuronowa pobierze dane wejściowe i umieści je w zestawie warstw. Sieć musi ocenić swoje działanie za pomocą funkcji straty. Funkcja straty daje sieci wyobrażenie o ścieżce, którą musi pokonać, zanim opanuje wiedzę. Sieć musi doskonalić swoją wiedzę za pomocą optymalizatora.
Jeśli spojrzysz na powyższy rysunek, zrozumiesz leżący u jego podstaw mechanizm.
Program pobiera pewne wartości wejściowe i umieszcza je w dwóch w pełni połączonych warstwach. Wyobraź sobie, że masz problem z matematyką. Pierwszą rzeczą, którą robisz, jest przeczytanie odpowiedniego rozdziału, aby rozwiązać problem. Wykorzystujesz swoją nową wiedzę, aby rozwiązać problem. Istnieje duże prawdopodobieństwo, że nie uzyskasz zbyt dobrego wyniku. To samo dotyczy sieci. Kiedy po raz pierwszy widzi dane i dokonuje prognozy, nie będzie ona idealnie zgodna z rzeczywistymi danymi.
Aby doskonalić swoją wiedzę, sieć korzysta z optymalizatora. W naszej analogii optymalizator można traktować jako ponowne przeczytanie rozdziału. Czytając ponownie, zyskujesz nowe spostrzeżenia/lekcję. Podobnie sieć korzysta z optymalizatora, aktualizuje swoją wiedzę i testuje nową wiedzę, aby sprawdzić, ile jeszcze musi się nauczyć. Program będzie powtarzał ten krok, aż do uzyskania możliwie najmniejszego błędu.
W naszej analogii do problemu matematycznego oznacza to, że czytasz rozdział podręcznika wiele razy, aż w pełni zrozumiesz treść kursu. Nawet po wielokrotnym przeczytaniu, jeśli ciągle popełniasz błąd, oznacza to, że osiągnąłeś pojemność wiedzy przy obecnym materiale. Musisz użyć innego podręcznika lub przetestować inną metodę, aby poprawić swój wynik. W przypadku sieci neuronowej jest to ten sam proces. Jeśli błąd jest daleki od 100%, ale krzywa jest płaska, oznacza to, że przy obecnej architekturze nie może się niczego nauczyć. Sieć musi być lepiej zoptymalizowana, aby poprawić wiedzę.
Sieć neuronowa Architektura
Sztuczna sieć neuronowa ArchiStruktura składa się z następujących komponentów:
- Warstwy
- Funkcja aktywacji
- Funkcja utraty
- Optimizer
Warstwy
Warstwa to miejsce, w którym odbywa się cała nauka. Wewnątrz warstwy znajduje się nieskończona ilość ciężarków (neuronów). Typowa sieć neuronowa jest często przetwarzana przez gęsto połączone warstwy (zwane także warstwami w pełni połączonymi). Oznacza to, że wszystkie wejścia są podłączone do wyjścia.
Typowa sieć neuronowa pobiera wektor wejściowy i skalar zawierający etykiety. Najwygodniejszą konfiguracją jest klasyfikacja binarna zawierająca tylko dwie klasy: 0 i 1.
Sieć pobiera dane wejściowe, wysyła je do wszystkich podłączonych węzłów i oblicza sygnał za pomocą aktywacja funkcja.

Powyższy rysunek przedstawia ten pomysł. Pierwsza warstwa to wartości wejściowe, druga warstwa, zwana warstwą ukrytą, otrzymuje ważone dane wejściowe z poprzedniej warstwy
- Pierwszy węzeł to wartości wejściowe
- Neuron jest rozkładany na część wejściową i funkcję aktywacji. Lewa część otrzymuje wszystkie dane wejściowe z poprzedniej warstwy. Prawa część to suma wejść wejściowych do funkcji aktywacji.
- Wartość wyjściowa obliczona na podstawie warstw ukrytych i wykorzystana do przewidywania. W przypadku klasyfikacji jest on równy numerowi klasy. W przypadku regresji przewidywana jest tylko jedna wartość.
Funkcja aktywacji
Funkcja aktywacji węzła definiuje wyjście przy danym zestawie wejść. Potrzebujesz funkcji aktywacji, aby sieć mogła uczyć się wzorców nieliniowych. Powszechną funkcją aktywacji jest a Relu, rektyfikowana jednostka liniowa. Funkcja zwraca zero dla wszystkich wartości ujemnych.
Pozostałe funkcje aktywacji to:
- Liniowy po kawałku
- esicy
- Tanh
- Nieszczelny Relu
Najważniejszą decyzją, jaką należy podjąć podczas budowy sieci neuronowej, jest:
- Ile warstw w sieci neuronowej
- Ile ukrytych jednostek dla każdej warstwy
Sieć neuronowa z wieloma warstwami i ukrytymi jednostkami może nauczyć się złożonej reprezentacji danych, ale powoduje to, że obliczenia sieci są bardzo kosztowne.
Funkcja utraty
Po zdefiniowaniu warstw ukrytych i funkcji aktywacji należy określić funkcję straty i optymalizator.
W przypadku klasyfikacji binarnej powszechną praktyką jest stosowanie binarnej funkcji straty entropii krzyżowej. W regresji liniowej stosuje się błąd średniokwadratowy.
Funkcja straty jest ważną metryką pozwalającą oszacować wydajność optymalizatora. Podczas szkolenia wskaźnik ten zostanie zminimalizowany. Należy dokładnie dobrać tę ilość w zależności od rodzaju problemu, z jakim się borykamy.
Optimizer
Funkcja straty jest miarą wydajności modelu. Optymalizator pomoże poprawić wagi sieci w celu zmniejszenia strat. Dostępne są różne optymalizatory, ale najpowszechniejszym jest Stochastic Gradient Descent.
Konwencjonalne optymalizatory to:
- Momentum optymalizacja,
- Przyspieszony gradient Niestierowa,
- AdaGrad,
- Optymalizacja Adama
Ograniczenia sieci neuronowej
Oto ograniczenia sieci neuronowej:
Przeładowanie
Częstym problemem w przypadku złożonych sieci neuronowych są trudności w generalizowaniu niewidzianych danych. Sieć neuronowa z wieloma wagami może bardzo dobrze identyfikować konkretne szczegóły w zestawie treningowym, ale często prowadzi to do nadmiernego dopasowania. Jeśli dane są niezrównoważone w grupach (tj. nie ma wystarczającej ilości danych dostępnych w niektórych grupach), sieć będzie się bardzo dobrze uczyć podczas treningu, ale nie będzie miała zdolności do generalizowania takiego wzorca na nigdy wcześniej niewidziane dane.
W uczeniu maszynowym istnieje kompromis między optymalizacją a generalizacją.
Optymalizacja modelu polega na znalezieniu najlepszych parametrów, które minimalizują utratę zbioru uczącego.
Uogólnienie mówi jednak, jak model zachowuje się w przypadku niewidocznych danych.
Aby zapobiec przechwytywaniu przez model określonych szczegółów lub niepożądanych wzorców danych treningowych, możesz użyć różnych technik. Najlepszą metodą jest posiadanie zrównoważonego zestawu danych z wystarczającą ilością danych. Sztuka redukcji nadmiernego dopasowania nazywa się regularyzacja. Przyjrzyjmy się niektórym konwencjonalnym technikom.
Rozmiar sieci
Wiadomo, że sieć neuronowa z zbyt wieloma warstwami i ukrytymi jednostkami jest wysoce wyrafinowana. Prostym sposobem na zmniejszenie złożoności modelu jest zmniejszenie jego rozmiaru. Nie ma najlepszej praktyki definiowania liczby warstw. Należy zacząć od małej ilości warstw i zwiększać ich rozmiar, aż do znalezienia modelu nadmiernie dopasowanego.
Regularyzacja wagi
Standardową techniką zapobiegania nadmiernemu dopasowaniu jest dodanie ograniczeń do wag sieci. To ograniczenie powoduje, że rozmiar sieci przyjmuje tylko małe wartości. Ograniczenie jest dodawane do funkcji straty błędu. Istnieją dwa rodzaje regularyzacji:
L1: Lasso: Koszt jest proporcjonalny do wartości bezwzględnej współczynników wagowych
L2: Grzbiet: Koszt jest proporcjonalny do kwadratu wartości współczynników wagowych
Spadkowicz
Rzucanie to dziwna, ale przydatna technika. Sieć z przerwami oznacza, że niektóre wagi zostaną losowo ustawione na zero. Wyobraź sobie, że masz tablicę wag [0.1, 1.7, 0.7, -0.9]. Jeśli w sieci neuronowej występuje zanik, przyjmie on wartość [0.1, 0, 0, -0.9] z losowo rozłożonym 0. Parametrem kontrolującym zanik jest współczynnik zaniku. Szybkość określa, ile wag należy ustawić na zera. Powszechne jest posiadanie stawki od 0.2 do 0.5.
Przykład sieci neuronowej w TensorFlow
Zobaczmy przykład sztucznej sieci neuronowej w działaniu, jak sieć neuronowa działa w przypadku typowego problemu klasyfikacji. Istnieją dwa wejścia, x1 i x2 z losową wartością. Wyjście jest klasą binarną. Celem jest sklasyfikowanie etykiety na podstawie dwóch cech. Aby wykonać to zadanie, architektura sieci neuronowej jest zdefiniowana następująco:
- Dwie ukryte warstwy
- Pierwsza warstwa ma cztery w pełni połączone neurony
- Druga warstwa ma dwa w pełni połączone neurony
- Funkcja aktywacji to Relu
- Dodaj regularyzację L2 z szybkością uczenia się 0.003
Sieć będzie optymalizować wagę przez 180 epok przy wielkości partii wynoszącej 10. W poniższym filmie z przykładowym SSN możesz zobaczyć, jak wagi ewoluują i jak sieć ulepsza mapowanie klasyfikacji.
Po pierwsze, sieć przypisuje wszystkim wagom losowe wartości.
- Przy losowych wagach, tj. bez optymalizacji, strata wyjściowa wynosi 0.453. Poniższy obrazek przedstawia sieć w różnych kolorach.
- Ogólnie rzecz biorąc, kolor pomarańczowy reprezentuje wartości ujemne, podczas gdy kolory niebieskie przedstawiają wartości dodatnie.
- Punkty danych mają tę samą reprezentację; niebieskie to etykiety pozytywne, a pomarańczowe to etykiety negatywne.
W drugiej ukrytej warstwie linie są pokolorowane zgodnie ze znakiem wag. Pomarańczowe linie przypisują ujemne wagi, a niebieska dodatnie wagi.
Jak widać, w mapowaniu wyjściowym sieć popełnia sporo błędów. Zobaczmy jak sieć zachowa się po optymalizacji.
Poniższy obrazek przykładu SSN przedstawia wyniki zoptymalizowanej sieci. Po pierwsze, można zauważyć, że sieć pomyślnie nauczyła się klasyfikować punkt danych. Możesz zobaczyć na zdjęciu wcześniej; początkowa waga wynosiła -0.43, natomiast po optymalizacji uzyskano wagę -0.95.
Pomysł można uogólnić dla sieci z większą liczbą ukrytych warstw i neuronów. Można się pobawić w link.
Jak trenować sieć neuronową za pomocą TensorFlow
Oto krok po kroku proces uczenia sieci neuronowej za pomocą TensorFlow ANN przy użyciu estymatora API DNNClassifier.
Wykorzystamy zbiór danych MNIST do szkolenia Twojej pierwszej sieci neuronowej. Uczenie sieci neuronowej za pomocą TensorFlow nie jest bardzo skomplikowane. Etap wstępnego przetwarzania wygląda dokładnie tak samo, jak w poprzednich tutorialach. Będziesz postępować w następujący sposób:
- Krok 1: Zaimportuj dane
- Krok 2: Przekształć dane
- Krok 3: Skonstruuj tensor
- Krok 4: Zbuduj model
- Krok 5: Trenuj i oceniaj model
- Krok 6: Ulepsz model
Krok 1) Zaimportuj dane
Przede wszystkim musisz zaimportować niezbędną bibliotekę. Możesz zaimportować zbiór danych MNIST za pomocą nauki scikit, jak pokazano w przykładzie sieci neuronowej TensorFlow poniżej.
Zestaw danych MNIST jest powszechnie używanym zestawem danych do testowania nowych technik lub algorytmów. Ten zestaw danych to zbiór obrazów o wymiarach 28×28 pikseli z ręcznie napisaną cyfrą od 0 do 9. Obecnie najniższy błąd w teście wynosi 0.27 procenta z komitetem 7 sieci neuronowych splotowych.
import numpy as np import tensorflow as tf np.random.seed(1337)
Możesz tymczasowo pobrać scikit Learn pod tym adresem. Skopiuj i wklej zestaw danych w wygodnym folderze. Aby zaimportować dane do Pythona, możesz użyć fetch_mldata z scikit Learn. Wklej ścieżkę pliku wewnątrz fetch_mldata, aby pobrać dane.
from sklearn.datasets import fetch_mldata
mnist = fetch_mldata(' /Users/Thomas/Dropbox/Learning/Upwork/tuto_TF/data/mldata/MNIST original')
print(mnist.data.shape)
print(mnist.target.shape)
Następnie importujesz dane i uzyskujesz kształt obu zbiorów danych.
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(mnist.data, mnist.target, test_size=0.2, random_state=42) y_train = y_train.astype(int) y_test = y_test.astype(int) batch_size =len(X_train) print(X_train.shape, y_train.shape,y_test.shape )
Krok 2) Przekształć dane
W poprzednim samouczku dowiedziałeś się, że należy przekształcić dane, aby ograniczyć wpływ wartości odstających. W tym samouczku dotyczącym sieci neuronowych przekształcisz dane za pomocą skalera min-max. Formuła to:
(X-min_x)/(max_x - min_x)
Scikit dowiaduje się, że ma już do tego funkcję: MinMaxScaler()
## resclae from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() # Train X_train_scaled = scaler.fit_transform(X_train.astype(np.float64)) # test X_test_scaled = scaler.fit_transform(X_test.astype(np.float64))
Krok 3) Skonstruuj tensor
Znasz już sposób tworzenia tensora w Tensorflow. Zestaw pociągowy można przekonwertować na kolumnę numeryczną.
feature_columns = [tf.feature_column.numeric_column('x', shape=X_train_scaled.shape[1:])]
Krok 4) Zbuduj model
Architektura sieci neuronowej zawiera 2 ukryte warstwy z 300 jednostkami dla pierwszej warstwy i 100 jednostkami dla drugiej. Używamy tych wartości na podstawie własnego doświadczenia. Możesz dostroić te wartości i zobaczyć, jak wpływają na dokładność sieci.
Aby zbudować model, użyj estymatora DNNClassifier. Możesz dodać liczbę warstw do argumentów feature_columns. Musisz ustawić liczbę klas na 10, ponieważ w zestawie treningowym znajduje się dziesięć klas. Znasz już składnię obiektu estymatora. Argumenty cechy kolumny, liczba klas i model_dir są dokładnie takie same jak w poprzednim tutorialu. Nowy argument ukryty_jednostka kontroluje liczbę warstw i liczbę węzłów podłączonych do sieci neuronowej. W poniższym kodzie znajdują się dwie ukryte warstwy, z których pierwsza łączy 300 węzłów, a druga 100 węzłów.
Aby zbudować estymator, użyj tf.estimator.DNNClassifier z następującymi parametrami:
- feature_columns: Zdefiniuj kolumny, które mają być używane w sieci
- hide_units: Zdefiniuj liczbę ukrytych neuronów
- n_classes: Zdefiniuj liczbę klas do przewidzenia
- model_dir: Zdefiniuj ścieżkę TensorBoard
estimator = tf.estimator.DNNClassifier(
feature_columns=feature_columns,
hidden_units=[300, 100],
n_classes=10,
model_dir = '/train/DNN')
Krok 5) Wytrenuj i oceń model
Możesz użyć metody numpy, aby wytrenować model i ocenić go
# Train the estimator
train_input = tf.estimator.inputs.numpy_input_fn(
x={"x": X_train_scaled},
y=y_train,
batch_size=50,
shuffle=False,
num_epochs=None)
estimator.train(input_fn = train_input,steps=1000)
eval_input = tf.estimator.inputs.numpy_input_fn(
x={"x": X_test_scaled},
y=y_test,
shuffle=False,
batch_size=X_test_scaled.shape[0],
num_epochs=1)
estimator.evaluate(eval_input,steps=None)
Wyjście:
{'accuracy': 0.9637143,
'average_loss': 0.12014342,
'loss': 1682.0079,
'global_step': 1000}
Obecna architektura zapewnia dokładność zestawu ewaluacyjnego na poziomie 96 procent.
Krok 6) Ulepsz model
Można spróbować ulepszyć model dodając parametry regularyzacji.
Użyjemy optymalizatora Adam ze współczynnikiem rezygnacji 0.3, L1 dla X i L2 dla y. W sieci neuronowej TensorFlow możesz kontrolować optymalizator za pomocą pociągu obiektów, po którym następuje nazwa optymalizatora. TensorFlow to wbudowane API dla optymalizatora Proximal AdaGrad.
Aby dodać regularizację do głębokiej sieci neuronowej, możesz użyć tf.train.ProximalAdagradOptimizer z następującym parametrem
- Szybkość uczenia się: learning_rate
- Regularyzacja L1: l1_regularization_strength
- Regularyzacja L2: l2_regularization_strength
estimator_imp = tf.estimator.DNNClassifier(
feature_columns=feature_columns,
hidden_units=[300, 100],
dropout=0.3,
n_classes = 10,
optimizer=tf.train.ProximalAdagradOptimizer(
learning_rate=0.01,
l1_regularization_strength=0.01,
l2_regularization_strength=0.01
),
model_dir = '/train/DNN1')
estimator_imp.train(input_fn = train_input,steps=1000)
estimator_imp.evaluate(eval_input,steps=None)
Wyjście:
{'accuracy': 0.95057142,
'average_loss': 0.17318928,
'loss': 2424.6499,
'global_step': 2000}
Wartości wybrane w celu zmniejszenia nadmiernego dopasowania nie poprawiły dokładności modelu. Twój pierwszy model miał dokładność 96%, podczas gdy model z regularyzatorem L2 ma dokładność 95%. Możesz wypróbować różne wartości i zobaczyć, jak wpływa to na dokładność.
Podsumowanie
W tym samouczku dowiesz się, jak zbudować sieć neuronową. Sieć neuronowa wymaga:
- Liczba ukrytych warstw
- Liczba w pełni podłączonych węzłów
- Funkcja aktywacji
- Optimizer
- Liczba klas
W TensorFlow ANN możesz trenować sieć neuronową pod kątem problemu klasyfikacji za pomocą:
- tf.estimator.DNNClassifier
Estymator wymaga określenia:
- feature_columns=feature_columns,
- ukryte_jednostki=[300, 100]
- n_klas=10
- katalog_modelu
Model można ulepszyć, stosując różne optymalizatory. W tym samouczku nauczyłeś się używać optymalizatora Adama Grada z szybkością uczenia się i dodawać kontrolę zapobiegającą nadmiernemu dopasowaniu.




