AI z Pythonem - Deep Learning
Sztuczna sieć neuronowa (ANN) to wydajny system obliczeniowy, którego motyw przewodni został zapożyczony z analogii biologicznych sieci neuronowych. Sieci neuronowe to jeden z typów modeli uczenia maszynowego. W połowie lat osiemdziesiątych i na początku lat dziewięćdziesiątych w sieciach neuronowych dokonano wielu ważnych postępów architektonicznych. W tym rozdziale dowiesz się więcej o Deep Learning, podejściu sztucznej inteligencji.
Głębokie uczenie się pojawiło się w wyniku gwałtownego rozwoju obliczeniowego dekady jako poważny konkurent w tej dziedzinie. Zatem uczenie głębokie jest szczególnym rodzajem uczenia maszynowego, którego algorytmy są inspirowane strukturą i funkcją ludzkiego mózgu.
Machine Learning v / s Deep Learning
Głębokie uczenie się jest obecnie najpotężniejszą techniką uczenia maszynowego. Jest tak potężny, ponieważ uczą się najlepszego sposobu przedstawiania problemu, ucząc się, jak go rozwiązać. Porównanie głębokiego uczenia i uczenia maszynowego znajduje się poniżej -
Zależność danych
Pierwsza różnica polega na wydajności DL i ML, gdy rośnie skala danych. Gdy dane są duże, algorytmy głębokiego uczenia działają bardzo dobrze.
Zależność od komputera
Algorytmy głębokiego uczenia potrzebują do perfekcyjnego działania wysokiej klasy maszyn. Z drugiej strony algorytmy uczenia maszynowego mogą działać również na słabszych maszynach.
Ekstrakcja cech
Algorytmy uczenia głębokiego mogą wyodrębniać funkcje wysokiego poziomu i próbować się na nich uczyć. Z drugiej strony ekspert musi zidentyfikować większość funkcji wyodrębnionych przez uczenie maszynowe.
Czas wykonania
Czas wykonania zależy od wielu parametrów używanych w algorytmie. Uczenie głębokie ma więcej parametrów niż algorytmy uczenia maszynowego. W związku z tym czas wykonania algorytmów DL, zwłaszcza czas uczenia, jest znacznie dłuższy niż algorytmów ML. Ale czas testowania algorytmów DL jest krótszy niż algorytmów ML.
Podejście do rozwiązywania problemów
Uczenie głębokie rozwiązuje problem od końca do końca, podczas gdy uczenie maszynowe wykorzystuje tradycyjny sposób rozwiązywania problemu, tj. Poprzez rozbicie go na części.
Konwolucyjna sieć neuronowa (CNN)
Konwolucyjne sieci neuronowe są takie same jak zwykłe sieci neuronowe, ponieważ są również zbudowane z neuronów, które mają możliwe do nauczenia wagi i odchylenia. Zwykłe sieci neuronowe ignorują strukturę danych wejściowych, a wszystkie dane są konwertowane na tablicę 1-D przed wprowadzeniem ich do sieci. Ten proces jest odpowiedni dla zwykłych danych, jednak jeśli dane zawierają obrazy, proces ten może być uciążliwy.
CNN z łatwością rozwiązuje ten problem. Uwzględnia strukturę 2D obrazów podczas ich przetwarzania, co pozwala im wyodrębnić właściwości charakterystyczne dla obrazów. W ten sposób głównym celem sieci CNN jest przejście z surowych danych obrazu w warstwie wejściowej do właściwej klasy w warstwie wyjściowej. Jedyna różnica między zwykłymi sieciami NN i CNN polega na przetwarzaniu danych wejściowych i typie warstw.
Przegląd architektury CNN
Pod względem architektonicznym zwykłe sieci neuronowe otrzymują dane wejściowe i przekształcają je przez szereg ukrytych warstw. Każda warstwa jest połączona z drugą za pomocą neuronów. Główną wadą zwykłych sieci neuronowych jest to, że nie skalują się one dobrze do pełnych obrazów.
Architektura CNN ma neurony ułożone w 3 wymiarach zwanych szerokością, wysokością i głębokością. Każdy neuron w bieżącej warstwie jest podłączony do małego fragmentu danych wyjściowych z poprzedniej warstwy. Jest to podobne do nałożenia pliku×filtr na obrazie wejściowym. To używaMfiltry, aby uzyskać wszystkie szczegóły. TeM filtry to ekstraktory cech, które wyodrębniają cechy takie jak krawędzie, rogi itp.
Warstwy używane do konstruowania CNN
Następujące warstwy są używane do konstruowania CNN -
Input Layer - Pobiera nieprzetworzone dane obrazu bez zmian.
Convolutional Layer- Ta warstwa jest podstawowym budulcem sieci CNN, który wykonuje większość obliczeń. Ta warstwa oblicza zwoje między neuronami i różnymi plamami na wejściu.
Rectified Linear Unit Layer- Stosuje funkcję aktywacji na wyjściu poprzedniej warstwy. Dodaje nieliniowość do sieci, dzięki czemu można ją dobrze uogólniać na dowolny typ funkcji.
Pooling Layer- Łączenie pomaga nam zachować tylko ważne części w miarę postępów w sieci. Warstwa puli działa niezależnie na każdym wycinku głębokości wejścia i zmienia jego rozmiar przestrzennie. Wykorzystuje funkcję MAX.
Fully Connected layer/Output layer - Ta warstwa oblicza wyniki wyjściowe w ostatniej warstwie. Wynikowy wynik ma rozmiar×× , gdzie L to liczba klas zbioru danych szkoleniowych.
Instalowanie przydatnych pakietów języka Python
Możesz użyć Keras, który jest interfejsem API sieci neuronowych wysokiego poziomu, napisanym w Pythonie i zdolnym do działania na TensorFlow, CNTK lub Theno. Jest kompatybilny z Pythonem 2.7-3.6. Możesz dowiedzieć się więcej na ten temat pod adresemhttps://keras.io/.
Użyj następujących poleceń, aby zainstalować keras -
pip install keras
Na conda środowisko, możesz użyć następującego polecenia -
conda install –c conda-forge keras
Budowanie regresora liniowego za pomocą ANN
W tej sekcji dowiesz się, jak zbudować regresor liniowy za pomocą sztucznych sieci neuronowych. Możesz użyćKerasRegressorosiągnąć to. W tym przykładzie używamy zbioru danych dotyczących cen domów w Bostonie z 13 wartościami liczbowymi dla nieruchomości w Bostonie. Kod Pythona dla tego samego jest pokazany tutaj -
Zaimportuj wszystkie wymagane pakiety, jak pokazano -
import numpy
import pandas
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasRegressor
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
Teraz załaduj nasz zestaw danych, który jest zapisany w katalogu lokalnym.
dataframe = pandas.read_csv("/Usrrs/admin/data.csv", delim_whitespace = True, header = None)
dataset = dataframe.values
Teraz podziel dane na zmienne wejściowe i wyjściowe, tj. X i Y -
X = dataset[:,0:13]
Y = dataset[:,13]
Ponieważ używamy bazowych sieci neuronowych, zdefiniuj model -
def baseline_model():
Teraz utwórz model w następujący sposób -
model_regressor = Sequential()
model_regressor.add(Dense(13, input_dim = 13, kernel_initializer = 'normal',
activation = 'relu'))
model_regressor.add(Dense(1, kernel_initializer = 'normal'))
Następnie skompiluj model -
model_regressor.compile(loss='mean_squared_error', optimizer='adam')
return model_regressor
Teraz ustal losowe ziarno pod kątem powtarzalności w następujący sposób -
seed = 7
numpy.random.seed(seed)
Obiekt opakowujący Keras do użycia w programie scikit-learn jak nazywa się estymator regresji KerasRegressor. W tej sekcji ocenimy ten model ze znormalizowanym zestawem danych.
estimator = KerasRegressor(build_fn = baseline_model, nb_epoch = 100, batch_size = 5, verbose = 0)
kfold = KFold(n_splits = 10, random_state = seed)
baseline_result = cross_val_score(estimator, X, Y, cv = kfold)
print("Baseline: %.2f (%.2f) MSE" % (Baseline_result.mean(),Baseline_result.std()))
Wynikiem pokazanego powyżej kodu byłoby oszacowanie wydajności modelu w przypadku problemu dla niewidocznych danych. Będzie to średni kwadrat błędu, w tym średnia i odchylenie standardowe ze wszystkich 10-krotności oceny krzyżowej.
Klasyfikator obrazu: zastosowanie głębokiego uczenia
Konwolucyjne sieci neuronowe (CNN) rozwiązują problem klasyfikacji obrazu, czyli do której klasy należy obraz wejściowy. Możesz skorzystać z biblioteki głębokiego uczenia Keras. Zwróć uwagę, że korzystamy z zestawu danych treningowych i testowych obrazów kotów i psów z poniższego linkuhttps://www.kaggle.com/c/dogs-vs-cats/data.
Zaimportuj ważne biblioteki i pakiety Keras, jak pokazano -
Poniższy pakiet o nazwie sequential zainicjuje sieci neuronowe jako sieć sekwencyjną.
from keras.models import Sequential
Następujący pakiet o nazwie Conv2D służy do wykonywania operacji konwolucji, pierwszego kroku CNN.
from keras.layers import Conv2D
Następujący pakiet o nazwie MaxPoling2D jest używany do wykonywania operacji łączenia w pule, czyli drugiego etapu CNN.
from keras.layers import MaxPooling2D
Następujący pakiet o nazwie Flatten jest procesem przekształcania wszystkich powstałych tablic 2D w pojedynczy długi ciągły wektor liniowy.
from keras.layers import Flatten
Następujący pakiet o nazwie Dense służy do wykonania pełnego połączenia sieci neuronowej, czwartego kroku CNN.
from keras.layers import Dense
Teraz utwórz obiekt klasy sekwencyjnej.
S_classifier = Sequential()
Teraz następnym krokiem jest zakodowanie części splotowej.
S_classifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))
Tutaj relu jest funkcją prostownika.
Teraz następnym krokiem CNN jest operacja łączenia na wynikowych mapach cech po części splotowej.
S-classifier.add(MaxPooling2D(pool_size = (2, 2)))
Teraz przekonwertuj wszystkie zebrane obrazy na ciągły wektor, używając pochlebiania -
S_classifier.add(Flatten())
Następnie utwórz w pełni połączoną warstwę.
S_classifier.add(Dense(units = 128, activation = 'relu'))
Tutaj 128 to liczba ukrytych jednostek. Powszechną praktyką jest definiowanie liczby ukrytych jednostek jako potęgi 2.
Teraz zainicjuj warstwę wyjściową w następujący sposób -
S_classifier.add(Dense(units = 1, activation = 'sigmoid'))
Teraz skompiluj CNN, stworzyliśmy -
S_classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
Tutaj parametrem optymalizatora jest wybór algorytmu stochastycznego zejścia gradientu, parametrem straty jest wybór funkcji straty, a parametr metryki - metryka wydajności.
Teraz wykonaj powiększenia obrazu, a następnie dopasuj obrazy do sieci neuronowych -
train_datagen = ImageDataGenerator(rescale = 1./255,shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1./255)
training_set =
train_datagen.flow_from_directory(”/Users/admin/training_set”,target_size =
(64, 64),batch_size = 32,class_mode = 'binary')
test_set =
test_datagen.flow_from_directory('test_set',target_size =
(64, 64),batch_size = 32,class_mode = 'binary')
Teraz dopasuj dane do utworzonego przez nas modelu -
classifier.fit_generator(training_set,steps_per_epoch = 8000,epochs =
25,validation_data = test_set,validation_steps = 2000)
Tutaj steps_per_epoch mają liczbę obrazów szkoleniowych.
Teraz, gdy model został przeszkolony, możemy go użyć do przewidywania w następujący sposób -
from keras.preprocessing import image
test_image = image.load_img('dataset/single_prediction/cat_or_dog_1.jpg',
target_size = (64, 64))
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image, axis = 0)
result = classifier.predict(test_image)
training_set.class_indices
if result[0][0] == 1:
prediction = 'dog'
else:
prediction = 'cat'