Samouczek Kerasa

Co to jest Keras?

Keras to biblioteka sieci neuronowej typu open source napisana w Python ktรณry dziaล‚a na Theano lub Tensorflow. Zostaล‚ zaprojektowany tak, aby byล‚ moduล‚owy, szybki i ล‚atwy w uลผyciu. Zostaล‚ opracowany przez Franรงois Cholleta, inลผyniera Google. Keras nie obsล‚uguje obliczeล„ niskiego poziomu. Zamiast tego uลผywa do tego innej biblioteki, zwanej โ€žBackend.

Keras to opakowanie API wysokiego poziomu dla interfejsu API niskiego poziomu, ktรณre moลผe dziaล‚aฤ‡ na TensorFlow, CNTK lub Theano. Keras High-Level API obsล‚uguje sposรณb, w jaki tworzymy modele, definiujemy warstwy lub konfigurujemy wiele modeli wejล›cia-wyjล›cia. Na tym poziomie Keras kompiluje rรณwnieลผ nasz model z funkcjami strat i optymalizatora, a proces uczenia z funkcjฤ… dopasowania. Keras w Python nie obsล‚uguje interfejsu API niskiego poziomu, takiego jak tworzenie wykresu obliczeniowego, tworzenie tensorรณw lub innych zmiennych, poniewaลผ jest obsล‚ugiwane przez silnik โ€žzapleczaโ€.

Co to jest backend?

Backend to termin w Keras, ktรณry wykonuje wszystkie obliczenia niskiego poziomu, takie jak iloczyny tensorowe, sploty i wiele innych rzeczy za pomocฤ… innych bibliotek, takich jak Tensorflow lub Theano. Zatem โ€žsilnik zapleczaโ€ wykona obliczenia i rozwรณj modeli. Domyล›lnym โ€žsilnikiem backendowymโ€ jest Tensorflow, ale moลผemy to zmieniฤ‡ w konfiguracji.

Theano, Tensorflow i zaplecze CNTK

Zaplecze Theano

Theano to projekt typu open source opracowany przez grupฤ™ MILA na Uniwersytecie w Montrealu w Quebecu w Kanadzie. Byล‚ to pierwszy powszechnie uลผywany framework. To jest Python biblioteka, ktรณra pomaga w wielowymiarowych tablicach dla operacji matematycznych przy uลผyciu Numpy lub Scipy. Theano moลผe uลผywaฤ‡ GPU do szybszych obliczeล„, moลผe rรณwnieลผ automatycznie budowaฤ‡ grafy symboliczne do obliczania gradientรณw. Na swojej stronie internetowej Theano twierdzi, ลผe moลผe rozpoznawaฤ‡ wyraลผenia niestabilne numerycznie i obliczaฤ‡ je za pomocฤ… bardziej stabilnych algorytmรณw, co jest bardzo przydatne w przypadku naszych niestabilnych wyraลผeล„.

Backend TensorFlow

Z drugiej strony Tensorflow jest wschodzฤ…cฤ… gwiazdฤ… w ล›rodowisku gล‚ฤ™bokiego uczenia siฤ™. Opracowane przez zespรณล‚ Google Brain, jest najpopularniejszym narzฤ™dziem do gล‚ฤ™bokiego uczenia siฤ™. Dziฤ™ki wielu funkcjom naukowcy przyczyniajฤ… siฤ™ do rozwoju tej platformy do celรณw gล‚ฤ™bokiego uczenia siฤ™.

Zaplecze CNTK

Kolejnym silnikiem backendowym dla Keras jest The Microsoft Zestaw narzฤ™dzi poznawczych lub CNTK. Jest to platforma gล‚ฤ™bokiego uczenia siฤ™ o otwartym kodzie ลบrรณdล‚owym, ktรณra zostaล‚a opracowana przez Microsoft Zespรณล‚. Moลผe dziaล‚aฤ‡ na wielu procesorach graficznych lub na wielu maszynach w celu szkolenia modelu gล‚ฤ™bokiego uczenia siฤ™ na masowฤ… skalฤ™. W niektรณrych przypadkach CNTK byล‚o zgล‚aszane szybciej niลผ inne frameworki, takie jak Tensorflow lub Theano. W dalszej czฤ™ล›ci tego samouczka Keras CNN porรณwnamy backendy Theano, TensorFlow i CNTK.

Porรณwnanie backendรณw

Musimy zrobiฤ‡ test porรณwnawczy, aby poznaฤ‡ porรณwnanie miฤ™dzy tymi dwoma backendami. Jak widaฤ‡ w Punkt odniesienia dla Jeong-Yoon Lee, porรณwnywana jest wydajnoล›ฤ‡ 3 rรณลผnych backendรณw na rรณลผnym sprzฤ™cie. W wyniku tego Theano jest wolniejsze niลผ drugi backend 50 czasy wolniej, ale dokล‚adnoล›ฤ‡ jest zbliลผona.

Inne test porรณwnawczy jest wykonywany przez Jasmeeta Bhatiฤ™. Poinformowaล‚, ลผe w pewnym teล›cie Theano jest wolniejszy niลผ Tensorflow. Jednak ogรณlna dokล‚adnoล›ฤ‡ jest prawie taka sama dla kaลผdej testowanej sieci.

Zatem pomiฤ™dzy Theano, Tensorflow i CTK jest oczywiste, ลผe TensorFlow jest lepszy niลผ Theano. Dziฤ™ki TensorFlow czas obliczeล„ jest znacznie krรณtszy, a CNN jest lepszy od innych.

Nastฤ™pny w tym Kerasie Python tutorialu, dowiemy siฤ™ czym rรณลผni siฤ™ Keras od TensorFlow (Keras kontra Tensorflow).

Keras kontra Tensorflow

Parametry Keras Tensorflow
Typ Opakowanie API wysokiego poziomu API niskiego poziomu
Zล‚oลผonoล›ฤ‡ ลatwy w uลผyciu, jeล›li Python jฤ™zyk Musisz poznaฤ‡ skล‚adniฤ™ korzystania z niektรณrych funkcji Tensorflow
Cel Szybkie wdroลผenie do tworzenia modelu ze standardowymi warstwami Umoลผliwia utworzenie dowolnego wykresu obliczeniowego lub warstw modelu
Narzฤ™dzia Uลผywa innego narzฤ™dzia do debugowania API, takiego jak TFDBG Moลผesz skorzystaฤ‡ z narzฤ™dzi do wizualizacji Tensorboard
Spoล‚ecznoล›ฤ‡ Duลผe aktywne spoล‚ecznoล›ci Duลผe aktywne spoล‚ecznoล›ci i szeroko udostฤ™pniane zasoby

Zalety Kerasa

Szybkie wdroลผenie i ล‚atwe do zrozumienia

Keras bardzo szybko tworzy model sieci. Jeล›li chcesz stworzyฤ‡ prosty model sieci z kilkoma liniami, Python Keras moลผe Ci w tym pomรณc. Spรณjrz na przykล‚ad Kerasa poniลผej:

from keras.models import Sequential
from keras.layers import Dense, Activation

model = Sequential()
model.add(Dense(64, activation='relu', input_dim=50)) #input shape of 50
model.add(Dense(28, activation='relu')) #input shape of 50
model.add(Dense(10, activation='softmax'))

Dziฤ™ki przyjaznemu API moลผemy ล‚atwo zrozumieฤ‡ proces. Pisanie kodu za pomocฤ… prostej funkcji i braku koniecznoล›ci ustawiania wielu parametrรณw.

Duลผe wsparcie spoล‚ecznoล›ci

Istnieje wiele spoล‚ecznoล›ci AI, ktรณre uลผywajฤ… Keras w swoim ล›rodowisku gล‚ฤ™bokiego uczenia siฤ™. Wiele z nich publikuje swoje kody i tutoriale dla ogรณล‚u spoล‚eczeล„stwa.

Miej wiele backendรณw

Moลผesz wybraฤ‡ Tensorflow, CNTK i Theano jako swรณj backend w Keras. Moลผesz wybraฤ‡ inny backend dla rรณลผnych projektรณw w zaleลผnoล›ci od potrzeb. Kaลผdy backend ma swojฤ… unikalnฤ… zaletฤ™.

Wieloplatformowe i ล‚atwe wdraลผanie modelu

Dziฤ™ki rรณลผnym obsล‚ugiwanym urzฤ…dzeniom i platformom moลผesz wdroลผyฤ‡ Keras na dowolnym urzฤ…dzeniu

  • iOS z CoreML
  • Android z Tensorflowem Android,
  • Przeglฤ…darka internetowa z obsล‚ugฤ… .js
  • Silnik chmury
  • Raspberry Pi

Obsล‚uga wielu procesorรณw graficznych

Moลผesz trenowaฤ‡ Keras na jednym procesorze graficznym lub uลผywaฤ‡ wielu procesorรณw graficznych jednoczeล›nie. Poniewaลผ Keras ma wbudowanฤ… obsล‚ugฤ™ rรณwnolegล‚oล›ci danych, dziฤ™ki czemu moลผe przetwarzaฤ‡ duลผe iloล›ci danych i przyspieszaฤ‡ czas potrzebny na ich uczenie.

Wady Kerasa

Nie moลผna obsล‚uลผyฤ‡ interfejsu API niskiego poziomu

Keras obsล‚uguje tylko API wysokiego poziomu, ktรณre dziaล‚a na innym frameworku lub silniku backendowym, takim jak Tensorflow, Theano lub CNTK. Nie jest to wiฤ™c zbyt przydatne, jeล›li chcesz utworzyฤ‡ wล‚asnฤ… warstwฤ™ abstrakcyjnฤ… do celรณw badawczych, poniewaลผ Keras ma juลผ wstฤ™pnie skonfigurowane warstwy.

Instalacja Kerasa

W tej sekcji przyjrzymy siฤ™ rรณลผnym dostฤ™pnym metodom instalacji Keras

Instalacja bezpoล›rednia lub ล›rodowisko wirtualne

Ktรณry jest lepszy? Zainstaluj bezpoล›rednio w bieลผฤ…cym Pythonie lub uลผyj ล›rodowiska wirtualnego? Sugerujฤ™ korzystanie ze ล›rodowiska wirtualnego, jeล›li masz wiele projektรณw. Chcesz wiedzieฤ‡ dlaczego? Dzieje siฤ™ tak dlatego, ลผe rรณลผne projekty mogฤ… uลผywaฤ‡ innej wersji biblioteki keras.

Na przykล‚ad mam projekt, ktรณry wymaga Python 3.5 przy uลผyciu OpenCV 3.3 ze starszym backendem Keras-Theano, ale w innym projekcie muszฤ™ uลผywaฤ‡ Keras z najnowszฤ… wersjฤ… i Tensorflow jako backendem Python Wsparcie 3.6.6

Nie chcemy, aby biblioteka Keras kolidowaล‚a ze sobฤ…, prawda? Uลผywamy wiฤ™c ล›rodowiska wirtualnego do lokalizowania projektu za pomocฤ… okreล›lonego typu biblioteki lub moลผemy uลผyฤ‡ innej platformy, takiej jak usล‚uga w chmurze, aby wykonaฤ‡ za nas obliczenia, np. Amazon Serwis internetowy.

Instalowanie Keras na Amazon Usล‚uga internetowa (AWS)

Amazon Web Service to platforma oferujฤ…ca usล‚ugi i produkty Cloud Computing dla badaczy lub do innych celรณw. AWS wynajmuje swรณj sprzฤ™t, sieฤ‡, bazฤ™ danych itp., abyล›my mogli z niego korzystaฤ‡ bezpoล›rednio z Internetu. Jednฤ… z popularnych usล‚ug AWS do celรณw gล‚ฤ™bokiego uczenia siฤ™ jest Amazon Usล‚uga gล‚ฤ™bokiego uczenia siฤ™ obrazu maszyny lub DL

Aby uzyskaฤ‡ szczegรณล‚owe instrukcje dotyczฤ…ce korzystania z AWS, zobacz this Tutorial

Uwaga dotyczฤ…ca AMI: Dostฤ™pne bฤ™dฤ… nastฤ™pujฤ…ce dane AMI

Instalowanie Keras na AWS

AWS Deep Learning AMI to wirtualne ล›rodowisko w usล‚udze AWS EC2, ktรณre pomaga badaczom i praktykom w pracy z Deep Learning. DLAMI oferuje silniki od maล‚ych procesorรณw po silniki z wieloma procesorami graficznymi o duลผej mocy ze wstฤ™pnie skonfigurowanฤ… CUDA, cuDNN i jest wyposaลผone w rรณลผnorodne platformy gล‚ฤ™bokiego uczenia siฤ™.

Jeล›li chcesz z niego korzystaฤ‡ natychmiast, powinieneล› wybraฤ‡ Deep Learning AMI, poniewaลผ jest on wyposaลผony w preinstalowane popularne frameworki do gล‚ฤ™bokiego uczenia siฤ™.

Jeล›li jednak chcesz wyprรณbowaฤ‡ niestandardowฤ… platformฤ™ gล‚ฤ™bokiego uczenia siฤ™ do celรณw badawczych, powinieneล› zainstalowaฤ‡ platformฤ™ Deep Learning Base AMI, poniewaลผ zawiera ona podstawowe biblioteki, takie jak CUDA, cuDNN, sterowniki procesorรณw graficznych i inne biblioteki potrzebne do dziaล‚ania w ล›rodowisku gล‚ฤ™bokiego uczenia siฤ™.

Jak zainstalowaฤ‡ Keras na Amazon SageMaker

Amazon SageMaker to platforma do gล‚ฤ™bokiego uczenia siฤ™, ktรณra pomaga w szkoleniu i wdraลผaniu sieci gล‚ฤ™bokiego uczenia siฤ™ za pomocฤ… najlepszego algorytmu.

Dla poczฤ…tkujฤ…cego jest to zdecydowanie najล‚atwiejsza metoda korzystania z Keras. Poniลผej znajduje siฤ™ proces instalacji Keras na Amazon SageMaker:

Krok 1) Otwรณrz Amazon SageMaker

W pierwszym kroku otwรณrz plik Amazon Strzelec konsoli i kliknij opcjฤ™ Utwรณrz instancjฤ™ notatnika.

Zainstaluj Keras na Amazon SageMaker

Krok 2) Wprowadลบ szczegรณล‚y

  1. Wpisz nazwฤ™ swojego notatnika.
  2. Utwรณrz rolฤ™ uprawnieล„. Spowoduje to utworzenie roli AMI Amazon Rola IAM w formacie AmazonSageMaker-Rola wykonawcza-RRRRMMDD|GGmmSS.
  3. Na koniec wybierz opcjฤ™ Utwรณrz instancjฤ™ notatnika. Po kilku chwilach, Amazon Sagemaker uruchamia instancjฤ™ notatnika.

Zainstaluj Keras na Amazon SageMaker

Note: Jeล›li chcesz uzyskaฤ‡ dostฤ™p do zasobรณw z VPC, ustaw bezpoล›redni dostฤ™p do Internetu jako wล‚ฤ…czony. W przeciwnym razie ta instancja notebooka nie bฤ™dzie miaล‚a dostฤ™pu do Internetu, wiฤ™c nie bฤ™dzie moลผna trenowaฤ‡ ani hostowaฤ‡ modeli

Krok 3) Uruchom instancjฤ™

Kliknij Otwรณrz, aby uruchomiฤ‡ instancjฤ™

Zainstaluj Keras na Amazon SageMaker

Krok 4) Rozpocznij kodowanie

In Jupyter, Kliknij Nowy> conda_tensorflow_p36 i jesteล› gotowy do kodowania

Zainstaluj Keras na Amazon SageMaker

Zainstaluj Keras w systemie Linux

Aby wล‚ฤ…czyฤ‡ Keras z Tensorflow jako silnikiem zaplecza, musimy najpierw zainstalowaฤ‡ Tensorflow. Uruchom to polecenie, aby zainstalowaฤ‡ tensorflow z procesorem (bez procesora graficznego)

pip install --upgrade tensorflow

jeล›li chcesz wล‚ฤ…czyฤ‡ obsล‚ugฤ™ GPU dla tensorflow, moลผesz uลผyฤ‡ tego polecenia

pip install --upgrade tensorflow-gpu

Zainstaluj Keras na Linuksie

meldujmy siฤ™ Python aby sprawdziฤ‡, czy nasza instalacja przebiegล‚a pomyล›lnie, wpisujฤ…c

user@user:~$ python
Python 3.6.4 (default, Mar 20 2018, 11:10:20) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow
>>>

jeล›li nie pojawi siฤ™ ลผaden komunikat o bล‚ฤ™dzie, proces instalacji przebiegล‚ pomyล›lnie

Zainstaluj Kerasa

Po zainstalowaniu Tensorflow zacznijmy instalowaฤ‡ keras. Wpisz to polecenie w terminalu

pip install keras

rozpocznie siฤ™ instalacja Keras i wszystkich jego zaleลผnoล›ci. Powinieneล› zobaczyฤ‡ coล› takiego:

Zainstaluj Kerasa

Teraz mamy Keras zainstalowany w naszym systemie!

Weryfikowanie

Zanim zaczniemy korzystaฤ‡ z Keras'a powinniล›my sprawdziฤ‡ czy nasz Keras wykorzystuje jako backend Tensorflow otwierajฤ…c plik konfiguracyjny:

gedit ~/.keras/keras.json

powinieneล› zobaczyฤ‡ coล› takiego

{
    "floatx": "float32",
    "epsilon": 1e-07,
    "backend": "tensorflow",
    "image_data_format": "channels_last"
}

jak widaฤ‡, โ€žbackendโ€ wykorzystuje tensorflow. Oznacza to, ลผe keras uลผywajฤ… Tensorflow jako backendu, tak jak siฤ™ spodziewaliล›my

i teraz uruchom go na terminalu, wpisujฤ…c

user@user:~$ python3
Python 3.6.4 (default, Mar 20 2018, 11:10:20) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import keras
Using TensorFlow backend.
>>> 

Jak zainstalowaฤ‡ Keras na Windows

Zanim zainstalujemy Tensorflow i Keras, powinniล›my zainstalowaฤ‡ Python, pip i virtualenv. Jeล›li juลผ zainstalowaล‚eล› te biblioteki, powinieneล› przejล›ฤ‡ do nastฤ™pnego kroku, w przeciwnym razie wykonaj to:

Zainstalowaฤ‡ Python 3, pobierajฤ…c z tego link

Zainstaluj pip, uruchamiajฤ…c to

Zainstaluj virtualenv za pomocฤ… tego polecenia

pip3 install โ€“U pip virtualenv

Zainstalowaฤ‡ Microsoft Wizualny C++ Aktualizacja redystrybucyjna 2015 3

Nastฤ™pnie uruchom ten skrypt

pip3 install virtualenv

Skonfiguruj ล›rodowisko wirtualne

Sล‚uลผy do izolowania systemu roboczego od systemu gล‚รณwnego.

virtualenv โ€“-system-site-packages โ€“p python3 ./venv

Aktywuj ล›rodowisko

.\venv\Scripts\activate

Po przygotowaniu ล›rodowiska instalacja Tensorflow i Keras pozostaje taka sama jak w Linuksie. W dalszej czฤ™ล›ci tego samouczka dotyczฤ…cego gล‚ฤ™bokiego uczenia siฤ™ z Keras poznamy podstawy Keras dotyczฤ…ce gล‚ฤ™bokiego uczenia siฤ™.

Podstawy Kerasa dotyczฤ…ce gล‚ฤ™bokiego uczenia siฤ™

Gล‚รณwnฤ… strukturฤ… Keras jest Model, ktรณry definiuje peล‚ny graf sieci. Moลผesz dodaฤ‡ wiฤ™cej warstw do istniejฤ…cego modelu, aby zbudowaฤ‡ niestandardowy model potrzebny do Twojego projektu.

Oto jak utworzyฤ‡ model sekwencyjny i kilka powszechnie uลผywanych warstw w gล‚ฤ™bokim uczeniu siฤ™

1. Model sekwencyjny

from keras.models import Sequential
from keras.layers import Dense, Activation,Conv2D,MaxPooling2D,Flatten,Dropout

model = Sequential()

2. Warstwa konwolucyjna

To jest Keras Python przykล‚ad warstwy splotowej jako warstwy wejล›ciowej o ksztaล‚cie wejล›ciowym 320x320x3, z 48 filtrami o rozmiarze 3x3 i wykorzystaniem ReLU jako funkcji aktywacji.

input_shape=(320,320,3) #this is the input shape of an image 320x320x3
model.add(Conv2D(48, (3, 3), activation='relu', input_shape= input_shape))

inny typ to

model.add(Conv2D(48, (3, 3), activation='relu'))

3. MaksPooling Warstwa

Aby zmniejszyฤ‡ reprezentacjฤ™ wejล›ciowฤ…, uลผyj MaxPool2d i okreล›l rozmiar jฤ…dra

model.add(MaxPooling2D(pool_size=(2, 2)))

4. Gฤ™sta warstwa

dodanie w peล‚ni poล‚ฤ…czonej warstwy z samym okreล›leniem rozmiaru wyjล›ciowego

model.add(Dense(256, activation='relu'))

5. Warstwa porzucenia

Dodanie warstwy porzucenia z prawdopodobieล„stwem 50%.

model.add(Dropout(0.5))

Kompilowanie, szkolenie i ocena

Po zdefiniowaniu naszego modelu zacznijmy go trenowaฤ‡. Naleลผy najpierw skompilowaฤ‡ sieฤ‡ z funkcjฤ… straty i funkcjฤ… optymalizatora. Umoลผliwi to sieci zmianฤ™ wag i zminimalizuje straty.

model.compile(loss='mean_squared_error', optimizer='adam')

Aby rozpoczฤ…ฤ‡ szkolenie, uลผyj funkcji fit, aby wprowadziฤ‡ do modelu dane szkoleniowe i walidacyjne. Umoลผliwi to uczenie sieci partiami i ustawianie epok.

model.fit(X_train, X_train, batch_size=32, epochs=10, validation_data=(x_val, y_val))

Ostatnim krokiem jest ocena modelu na podstawie danych testowych.

score = model.evaluate(x_test, y_test, batch_size=32)

Sprรณbujmy zastosowaฤ‡ prostฤ… regresjฤ™ liniowฤ…

import keras
from keras.models import Sequential
from keras.layers import Dense, Activation
import numpy as np
import matplotlib.pyplot as plt 
 
x = data = np.linspace(1,2,200)
y = x*4 + np.random.randn(*x.shape) * 0.3


model = Sequential()
model.add(Dense(1, input_dim=1, activation='linear'))

model.compile(optimizer='sgd', loss='mse', metrics=['mse'])

weights = model.layers[0].get_weights()
w_init = weights[0][0][0]
b_init = weights[1][0]
print('Linear regression model is initialized with weights w: %.2f, b: %.2f' % (w_init, b_init)) 


model.fit(x,y, batch_size=1, epochs=30, shuffle=False)

weights = model.layers[0].get_weights()
w_final = weights[0][0][0]
b_final = weights[1][0]
print('Linear regression model is trained to have weight w: %.2f, b: %.2f' % (w_final, b_final))

predict = model.predict(data)

plt.plot(data, predict, 'b', data , y, 'k.')
plt.show()

Po przeszkoleniu danych dane wyjล›ciowe powinny wyglฤ…daฤ‡ nastฤ™pujฤ…co

regresji liniowej

z poczฤ…tkowฤ… wagฤ…

Linear regression model is initialized with weights w: 0.37, b: 0.00

i koล„cowa waga

Linear regression model is trained to have weight w: 3.70, b: 0.61

Dostosowywanie wstฤ™pnie wyszkolonych modeli w Keras i sposรณb ich uลผywania

Dlaczego uลผywamy modeli Fine Tune i kiedy z nich korzystamy

Dostrajanie to zadanie majฤ…ce na celu ulepszenie wstฤ™pnie wytrenowanego modelu w taki sposรณb, aby parametry dostosowaล‚y siฤ™ do nowego modelu. Gdy chcemy potrenowaฤ‡ od podstaw na nowym modelu potrzebujemy duลผej iloล›ci danych, aby sieฤ‡ mogล‚a odnaleลบฤ‡ wszystkie parametry. Ale w tym przypadku uลผyjemy wstฤ™pnie wytrenowanego modelu, wiฤ™c parametry sฤ… juลผ wyuczone i majฤ… wagฤ™.

Na przykล‚ad, jeล›li chcemy wytrenowaฤ‡ wล‚asny model Kerasa, aby rozwiฤ…zaฤ‡ problem klasyfikacji, ale mamy tylko niewielkฤ… iloล›ฤ‡ danych, moลผemy to rozwiฤ…zaฤ‡ za pomocฤ… Przenieล› naukฤ™ + Metoda dostrajania.

Uลผywajฤ…c wstฤ™pnie wytrenowanej sieci i ciฤ™ลผarkรณw, nie musimy trenowaฤ‡ caล‚ej sieci. Musimy tylko przeszkoliฤ‡ ostatniฤ… warstwฤ™ uลผywanฤ… do rozwiฤ…zania naszego zadania, co nazywamy metodฤ… dostrajania.

Przygotowanie modelu sieci

Do modelu wstฤ™pnie wytrenowanego moลผemy zaล‚adowaฤ‡ rรณลผne modele, ktรณre Keras ma juลผ w swojej bibliotece takie jak:

  • VGG16
  • Poczฤ…tekV3
  • ResNet
  • Sieฤ‡ komรณrkowa
  • Przyjฤ™cie
  • IncepcjaResNetV2

Jednak w tym procesie uลผyjemy modelu sieci VGG16 i imageNet jako wagi modelu. Dostosujemy sieฤ‡, aby sklasyfikowaฤ‡ 8 rรณลผnych typรณw klas za pomocฤ… obrazรณw z Zestaw danych obrazรณw naturalnych Kaggle

Architektura modelu VGG16

Architektura modelu VGG16

ลบrรณdล‚o

Przesyล‚anie naszych danych do Bucket AWS S3

W naszym procesie szkoleniowym uลผyjemy naturalnych obrazรณw z 8 rรณลผnych klas, takich jak samoloty, samochรณd, kot, pies, kwiat, owoc, motocykl i osoba. Najpierw musimy przesล‚aฤ‡ nasze dane do Amazon Wiadro S3.

Amazon Wiadro S3

Krok 1) Po zalogowaniu siฤ™ na konto S3 utwรณrzmy wiadro poprzez rejestracjฤ™ Utwรณrz wiadro

Przesyล‚anie danych do Bucketa AWS S3

Krok 2) Teraz wybierz nazwฤ™ segmentu i region zgodnie ze swoim kontem. Upewnij siฤ™, ลผe nazwa zasobnika jest dostฤ™pna. Nastฤ™pnie kliknij Utwรณrz.

Przesyล‚anie danych do Bucketa AWS S3

Krok 3) Jak widaฤ‡, Wiadro jest gotowe do uลผycia. Ale jak widzisz, dostฤ™p nie jest publiczny, dobrze jest dla ciebie, jeล›li chcesz zachowaฤ‡ go dla siebie. Moลผesz zmieniฤ‡ dostฤ™p publiczny tego zasobnika we wล‚aล›ciwoล›ciach zasobnika

Przesyล‚anie danych do Bucketa AWS S3

Krok 4) Teraz moลผesz rozpoczฤ…ฤ‡ przesyล‚anie danych treningowych do swojego Bucketa. Tutaj przeล›lฤ™ plik tar.gz, ktรณry skล‚ada siฤ™ ze zdjฤ™ฤ‡ do celรณw szkoleniowych i testowych.

Przesyล‚anie danych do Bucketa AWS S3

Krok 5) Teraz kliknij swรณj plik i skopiuj go Poล‚ฤ…czyฤ‡ abyล›my mogli go pobraฤ‡.

Przesyล‚anie danych do Bucketa AWS S3

Przygotowywanie danych

Musimy wygenerowaฤ‡ nasze dane szkoleniowe przy uลผyciu Keras ImageDataGenerator.

Najpierw musisz pobraฤ‡ za pomocฤ… wget z linkiem do swojego pliku z S3 Bucket.

!wget https://s3.us-east-2.amazonaws.com/naturalimages02/images.tar.gz		
!tar -xzf images.tar.gz

Po pobraniu danych rozpocznijmy proces szkolenia.

from keras.preprocessing.image import ImageDataGenerator
import numpy as np
import matplotlib.pyplot as plt

train_path = 'images/train/'
test_path = 'images/test/'
batch_size = 16
image_size = 224
num_class = 8


train_datagen = ImageDataGenerator(validation_split=0.3,
                                   shear_range=0.2,
                                   zoom_range=0.2,
                                   horizontal_flip=True)

train_generator = train_datagen.flow_from_directory(
                        directory=train_path,
                        target_size=(image_size,image_size),
                        batch_size=batch_size,
                        class_mode='categorical',
                        color_mode='rgb',
                        shuffle=True)

Dane obrazuGenerator utworzy dane X_training z katalogu. Podkatalog w tym katalogu bฤ™dzie uลผywany jako klasa dla kaลผdego obiektu. Obraz zostanie zaล‚adowany w trybie kolorรณw RGB, z trybem klasy kategorycznej dla danych Y_training, z partiฤ… o rozmiarze 16. Na koniec przetasuj dane.

Zobaczmy nasze obrazy losowo, wykreล›lajฤ…c je za pomocฤ… matplotlib

x_batch, y_batch = train_generator.next()

fig=plt.figure()
columns = 4
rows = 4
for i in range(1, columns*rows):
    num = np.random.randint(batch_size)
    image = x_batch[num].astype(np.int)
    fig.add_subplot(rows, columns, i)
    plt.imshow(image)
plt.show()

Przygotowywanie danych

Nastฤ™pnie utwรณrzmy nasz model sieci z VGG16 z wstฤ™pnie wytrenowanฤ… wagฤ… imageNet. Zamrozimy te warstwy, aby nie byล‚o moลผliwoล›ci ich trenowania, co pomoลผe nam skrรณciฤ‡ czas obliczeล„.

Tworzenie naszego modelu z VGG16

import keras
from keras.models import Model, load_model
from keras.layers import Activation, Dropout, Flatten, Dense
from keras.preprocessing.image import ImageDataGenerator
from keras.applications.vgg16 import VGG16


#Load the VGG model
base_model = VGG16(weights='imagenet', include_top=False, input_shape=(image_size, image_size, 3))

print(base_model.summary())

    # Freeze the layers 
for layer in base_model.layers:
    layer.trainable = False
 
# # Create the model
model = keras.models.Sequential()

# # Add the vgg convolutional base model
model.add(base_model)
 
# # Add new layers
model.add(Flatten())
model.add(Dense(1024, activation='relu'))
model.add(Dense(1024, activation='relu'))
model.add(Dense(num_class, activation='softmax'))
 
# # Show a summary of the model. Check the number of trainable parameters    
print(model.summary())

Jak widaฤ‡ poniลผej, podsumowanie naszego modelu sieci. Z danych wejล›ciowych z warstw VGG16 dodajemy 2 w peล‚ni poล‚ฤ…czone warstwy, ktรณre wyodrฤ™bniฤ… 1024 funkcje i warstwฤ™ wyjล›ciowฤ…, ktรณra obliczy 8 klas z aktywacjฤ… softmax.

Layer (type)                 Output Shape              Param #   
=================================================================
vgg16 (Model)                (None, 7, 7, 512)         14714688  
_________________________________________________________________
flatten_1 (Flatten)          (None, 25088)             0         
_________________________________________________________________
dense_1 (Dense)              (None, 1024)              25691136  
_________________________________________________________________
dense_2 (Dense)              (None, 1024)              1049600   
_________________________________________________________________
dense_3 (Dense)              (None, 8)                 8200      
=================================================================
Total params: 41,463,624
Trainable params: 26,748,936
Non-trainable params: 14,714,688

Szkolenia

# # Compile the model
from keras.optimizers import SGD

model.compile(loss='categorical_crossentropy',
          optimizer=SGD(lr=1e-3),
          metrics=['accuracy'])

# # Start the training process
# model.fit(x_train, y_train, validation_split=0.30, batch_size=32, epochs=50, verbose=2)

# # #save the model
# model.save('catdog.h5')

history = model.fit_generator(
        train_generator,
        steps_per_epoch=train_generator.n/batch_size,
        epochs=10)
        
model.save('fine_tune.h5')

# summarize history for accuracy
import matplotlib.pyplot as plt

plt.plot(history.history['loss'])
plt.title('loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['loss'], loc='upper left')
plt.show()

Efekty

Epoch 1/10
432/431 [==============================] - 53s 123ms/step - loss: 0.5524 - acc: 0.9474 
Epoch 2/10
432/431 [==============================] - 52s 119ms/step - loss: 0.1571 - acc: 0.9831
Epoch 3/10
432/431 [==============================] - 51s 119ms/step - loss: 0.1087 - acc: 0.9871
Epoch 4/10
432/431 [==============================] - 51s 119ms/step - loss: 0.0624 - acc: 0.9926
Epoch 5/10
432/431 [==============================] - 51s 119ms/step - loss: 0.0591 - acc: 0.9938
Epoch 6/10
432/431 [==============================] - 51s 119ms/step - loss: 0.0498 - acc: 0.9936
Epoch 7/10
432/431 [==============================] - 51s 119ms/step - loss: 0.0403 - acc: 0.9958
Epoch 8/10
432/431 [==============================] - 51s 119ms/step - loss: 0.0248 - acc: 0.9959
Epoch 9/10
432/431 [==============================] - 51s 119ms/step - loss: 0.0466 - acc: 0.9942
Epoch 10/10
432/431 [==============================] - 52s 120ms/step - loss: 0.0338 - acc: 0.9947

Szkolenia

Jak widaฤ‡ nasze straty sฤ… znacznie zmniejszone, a dokล‚adnoล›ฤ‡ wynosi prawie 100%. Aby przetestowaฤ‡ nasz model, losowo wybraliล›my obrazy z Internetu i umieล›ciliล›my je w folderze testowym z innฤ… klasฤ… do przetestowania

Testowanie naszego modelu

model = load_model('fine_tune.h5')

test_datagen = ImageDataGenerator()
train_generator = train_datagen.flow_from_directory(
                        directory=train_path,
                        target_size=(image_size,image_size),
                        batch_size=batch_size,
                        class_mode='categorical',
                        color_mode='rgb',
                        shuffle=True)

test_generator = test_datagen.flow_from_directory(
                        directory=test_path, 
                        target_size=(image_size, image_size),
                        color_mode='rgb',
                        shuffle=False,
                        class_mode='categorical',
                        batch_size=1)

filenames = test_generator.filenames
nb_samples = len(filenames)

fig=plt.figure()
columns = 4
rows = 4
for i in range(1, columns*rows -1):
    x_batch, y_batch = test_generator.next()

    name = model.predict(x_batch)
    name = np.argmax(name, axis=-1)
    true_name = y_batch
    true_name = np.argmax(true_name, axis=-1)

    label_map = (test_generator.class_indices)
    label_map = dict((v,k) for k,v in label_map.items()) #flip k,v
    predictions = [label_map[k] for k in name]
    true_value = [label_map[k] for k in true_name]

    image = x_batch[0].astype(np.int)
    fig.add_subplot(rows, columns, i)
    plt.title(str(predictions[0]) + ':' + str(true_value[0]))
    plt.imshow(image)
plt.show()

A nasz test jest taki, jak podano poniลผej! Tylko 1 obraz jest przewidywany bล‚ฤ™dnie na podstawie testu 14 obrazรณw!

Model testowy

Sieฤ‡ neuronowa rozpoznawania twarzy z Keras

Dlaczego potrzebujemy uznania

Potrzebujemy rozpoznawania, aby uล‚atwiฤ‡ nam rozpoznanie lub identyfikacjฤ™ twarzy osoby, rodzaju obiektรณw, szacowanego wieku osoby na podstawie jej twarzy, a nawet poznanie wyrazu twarzy tej osoby.

Sieฤ‡ neuronowa rozpoznawania twarzy z Keras

Byฤ‡ moลผe zdajesz sobie sprawฤ™, ลผe za kaลผdym razem, gdy prรณbujesz oznaczyฤ‡ twarz znajomego na zdjฤ™ciu, funkcja Facebooka zrobiล‚a to za Ciebie, czyli oznacza twarz znajomego bez koniecznoล›ci wczeล›niejszego zaznaczania jej. Jest to funkcja rozpoznawania twarzy stosowana przez Facebooka, aby uล‚atwiฤ‡ nam oznaczanie znajomych.

Jak to dziaล‚a? Za kaลผdym razem, gdy zaznaczymy twarz naszego znajomego, AI Facebooka bฤ™dzie siฤ™ tego uczyฤ‡ i bฤ™dzie prรณbowaล‚a to przewidzieฤ‡, aลผ uzyska odpowiedni wynik. Tego samego systemu uลผyjemy do stworzenia wล‚asnego rozpoznawania twarzy. Zacznijmy tworzyฤ‡ wล‚asne rozpoznawanie twarzy za pomocฤ… gล‚ฤ™bokiego uczenia siฤ™

Model sieciowy

Bฤ™dziemy uลผywaฤ‡ modelu sieciowego VGG16, ale z wagฤ… VGGFace.

Architektura modelu VGG16

Model sieciowy

Czym jest VGGFace? jest to implementacja Deep Face Recognition w Keras wprowadzona przez Parkhi, Omkar M. i in. โ€žDeep Face Recognitionโ€. BMVC (2015). Struktura wykorzystuje VGG16 jako architekturฤ™ sieciowฤ….

Moลผesz pobraฤ‡ VGGFace z GitHub

from keras.applications.vgg16 import VGG16
from keras_vggface.vggface import VGGFace

face_model = VGGFace(model='vgg16', 
                weights='vggface',
                input_shape=(224,224,3)) 
face_model.summary()

Jak widaฤ‡ podsumowanie sieci

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 224, 224, 3)       0         
_________________________________________________________________
conv1_1 (Conv2D)             (None, 224, 224, 64)      1792      
_________________________________________________________________
conv1_2 (Conv2D)             (None, 224, 224, 64)      36928     
_________________________________________________________________
pool1 (MaxPooling2D)         (None, 112, 112, 64)      0         
_________________________________________________________________
conv2_1 (Conv2D)             (None, 112, 112, 128)     73856     
_________________________________________________________________
conv2_2 (Conv2D)             (None, 112, 112, 128)     147584    
_________________________________________________________________
pool2 (MaxPooling2D)         (None, 56, 56, 128)       0         
_________________________________________________________________
conv3_1 (Conv2D)             (None, 56, 56, 256)       295168    
_________________________________________________________________
conv3_2 (Conv2D)             (None, 56, 56, 256)       590080    
_________________________________________________________________
conv3_3 (Conv2D)             (None, 56, 56, 256)       590080    
_________________________________________________________________
pool3 (MaxPooling2D)         (None, 28, 28, 256)       0         
_________________________________________________________________
conv4_1 (Conv2D)             (None, 28, 28, 512)       1180160   
_________________________________________________________________
conv4_2 (Conv2D)             (None, 28, 28, 512)       2359808   
_________________________________________________________________
conv4_3 (Conv2D)             (None, 28, 28, 512)       2359808   
_________________________________________________________________
pool4 (MaxPooling2D)         (None, 14, 14, 512)       0         
_________________________________________________________________
conv5_1 (Conv2D)             (None, 14, 14, 512)       2359808   
_________________________________________________________________
conv5_2 (Conv2D)             (None, 14, 14, 512)       2359808   
_________________________________________________________________
conv5_3 (Conv2D)             (None, 14, 14, 512)       2359808   
_________________________________________________________________
pool5 (MaxPooling2D)         (None, 7, 7, 512)         0         
_________________________________________________________________
flatten (Flatten)            (None, 25088)             0         
_________________________________________________________________
fc6 (Dense)                  (None, 4096)              102764544 
_________________________________________________________________
fc6/relu (Activation)        (None, 4096)              0         
_________________________________________________________________
fc7 (Dense)                  (None, 4096)              16781312  
_________________________________________________________________
fc7/relu (Activation)        (None, 4096)              0         
_________________________________________________________________
fc8 (Dense)                  (None, 2622)              10742334  
_________________________________________________________________
fc8/softmax (Activation)     (None, 2622)              0         
=================================================================
Total params: 145,002,878
Trainable params: 145,002,878
Non-trainable params: 0
_________________________________________________________________
Traceback (most recent call last):

zrobimy A Przenieล› naukฤ™ + Dostosowanie, aby przyspieszyฤ‡ szkolenie przy maล‚ych zestawach danych. Najpierw zamrozimy warstwy podstawowe, aby nie daล‚o siฤ™ ich trenowaฤ‡.

for layer in face_model.layers:
    layer.trainable = False

nastฤ™pnie dodajemy wล‚asnฤ… warstwฤ™, aby rozpoznaฤ‡ nasze twarze testowe. Dodamy 2 w peล‚ni poล‚ฤ…czone warstwy i warstwฤ™ wyjล›ciowฤ… z 5 osobami do wykrycia.

from keras.models import Model, Sequential
from keras.layers import Input, Convolution2D, ZeroPadding2D, MaxPooling2D, Flatten, Dense, Dropout, Activation

person_count = 5

last_layer = face_model.get_layer('pool5').output

x = Flatten(name='flatten')(last_layer)
x = Dense(1024, activation='relu', name='fc6')(x)
x = Dense(1024, activation='relu', name='fc7')(x)
out = Dense(person_count, activation='softmax', name='fc8')(x)

custom_face = Model(face_model.input, out)

Zobaczmy podsumowanie naszej sieci

Layer (type)                 Output Shape              Param #
=================================================================
input_1 (InputLayer)         (None, 224, 224, 3)       0
_________________________________________________________________
conv1_1 (Conv2D)             (None, 224, 224, 64)      1792
_________________________________________________________________
conv1_2 (Conv2D)             (None, 224, 224, 64)      36928
_________________________________________________________________
pool1 (MaxPooling2D)         (None, 112, 112, 64)      0
_________________________________________________________________
conv2_1 (Conv2D)             (None, 112, 112, 128)     73856
_________________________________________________________________
conv2_2 (Conv2D)             (None, 112, 112, 128)     147584
_________________________________________________________________
pool2 (MaxPooling2D)         (None, 56, 56, 128)       0
_________________________________________________________________
conv3_1 (Conv2D)             (None, 56, 56, 256)       295168
_________________________________________________________________
conv3_2 (Conv2D)             (None, 56, 56, 256)       590080
_________________________________________________________________
conv3_3 (Conv2D)             (None, 56, 56, 256)       590080
_________________________________________________________________
pool3 (MaxPooling2D)         (None, 28, 28, 256)       0
_________________________________________________________________
conv4_1 (Conv2D)             (None, 28, 28, 512)       1180160
_________________________________________________________________
conv4_2 (Conv2D)             (None, 28, 28, 512)       2359808
_________________________________________________________________
conv4_3 (Conv2D)             (None, 28, 28, 512)       2359808
_________________________________________________________________
pool4 (MaxPooling2D)         (None, 14, 14, 512)       0
_________________________________________________________________
conv5_1 (Conv2D)             (None, 14, 14, 512)       2359808
_________________________________________________________________
conv5_2 (Conv2D)             (None, 14, 14, 512)       2359808
_________________________________________________________________
conv5_3 (Conv2D)             (None, 14, 14, 512)       2359808
_________________________________________________________________
pool5 (MaxPooling2D)         (None, 7, 7, 512)         0
_________________________________________________________________
flatten (Flatten)            (None, 25088)             0
_________________________________________________________________
fc6 (Dense)                  (None, 1024)              25691136
_________________________________________________________________
fc7 (Dense)                  (None, 1024)              1049600
_________________________________________________________________
fc8 (Dense)                  (None, 5)                 5125
=================================================================
Total params: 41,460,549
Trainable params: 26,745,861
Non-trainable params: 14,714,688

Jak widaฤ‡ powyลผej, po warstwie Pool5 zostanie ona spล‚aszczona do pojedynczego wektora cech, ktรณry zostanie wykorzystany przez gฤ™stฤ… warstwฤ™ do ostatecznego rozpoznania.

Przygotowanie naszych twarzy

Teraz przygotujmy nasze twarze. Zrobiล‚em katalog skล‚adajฤ…cy siฤ™ z 5 znanych osรณb

  • Jack Ma
  • Jason Statham
  • Johnny Depp
  • Robert Downey Jr.
  • Rowan Atkinson

Kaลผdy folder zawiera 10 zdjฤ™ฤ‡, przedstawiajฤ…cych kaลผdy proces szkolenia i ewaluacji. To bardzo maล‚a iloล›ฤ‡ danych, ale to jest wyzwanie, prawda?

Do przygotowania danych wykorzystamy narzฤ™dzie Keras. Ta funkcja wykona iteracjฤ™ w folderze zestawu danych, a nastฤ™pnie przygotuje go do uลผycia w szkoleniu.

from keras.preprocessing.image import ImageDataGenerator
batch_size = 5
train_path = 'data/'
eval_path = 'eval/'

train_datagen = ImageDataGenerator(rescale=1./255,
                                   shear_range=0.2,
                                   zoom_range=0.2,
                                   horizontal_flip=True)

valid_datagen = ImageDataGenerator(rescale=1./255,
                                   shear_range=0.2,
                                   zoom_range=0.2,
                                   horizontal_flip=True)

train_generator = train_datagen.flow_from_directory(
                        train_path,
                        target_size=(image_size,image_size),
                        batch_size=batch_size,
                        class_mode='sparse',
                        color_mode='rgb')

valid_generator = valid_datagen.flow_from_directory(
    directory=eval_path,
    target_size=(224, 224),
    color_mode='rgb',
    batch_size=batch_size,
    class_mode='sparse',
    shuffle=True,
)

Trenowanie naszego modelu

Rozpocznijmy proces uczenia od skompilowania naszej sieci z funkcjฤ… straty i optymalizatorem. Tutaj uลผywamy sparse_categorical_crossentropy jako naszej funkcji straty, przy pomocy SGD jako naszego optymalizatora uczenia siฤ™.

from keras.optimizers import SGD

custom_face.compile(loss='sparse_categorical_crossentropy',
                         optimizer=SGD(lr=1e-4, momentum=0.9),
                         metrics=['accuracy'])

history = custom_face.fit_generator(
        train_generator,
        validation_data=valid_generator,
        steps_per_epoch=49/batch_size,
        validation_steps=valid_generator.n,
        epochs=50)

custom_face.evaluate_generator(generator=valid_generator)
        
custom_face.save('vgg_face.h5')
Epoch 25/50
10/9 [==============================] - 60s 6s/step - loss: 1.4882 - acc: 0.8998 - val_loss: 1.5659 - val_acc: 0.5851
Epoch 26/50
10/9 [==============================] - 59s 6s/step - loss: 1.4882 - acc: 0.8998 - val_loss: 1.5638 - val_acc: 0.5809
Epoch 27/50
10/9 [==============================] - 60s 6s/step - loss: 1.4779 - acc: 0.8597 - val_loss: 1.5613 - val_acc: 0.5477
Epoch 28/50
10/9 [==============================] - 60s 6s/step - loss: 1.4755 - acc: 0.9199 - val_loss: 1.5576 - val_acc: 0.5809
Epoch 29/50
10/9 [==============================] - 60s 6s/step - loss: 1.4794 - acc: 0.9153 - val_loss: 1.5531 - val_acc: 0.5892
Epoch 30/50
10/9 [==============================] - 60s 6s/step - loss: 1.4714 - acc: 0.8953 - val_loss: 1.5510 - val_acc: 0.6017
Epoch 31/50
10/9 [==============================] - 60s 6s/step - loss: 1.4552 - acc: 0.9199 - val_loss: 1.5509 - val_acc: 0.5809
Epoch 32/50
10/9 [==============================] - 60s 6s/step - loss: 1.4504 - acc: 0.9199 - val_loss: 1.5492 - val_acc: 0.5975
Epoch 33/50
10/9 [==============================] - 60s 6s/step - loss: 1.4497 - acc: 0.8998 - val_loss: 1.5490 - val_acc: 0.5851
Epoch 34/50
10/9 [==============================] - 60s 6s/step - loss: 1.4453 - acc: 0.9399 - val_loss: 1.5529 - val_acc: 0.5643
Epoch 35/50
10/9 [==============================] - 60s 6s/step - loss: 1.4399 - acc: 0.9599 - val_loss: 1.5451 - val_acc: 0.5768
Epoch 36/50
10/9 [==============================] - 60s 6s/step - loss: 1.4373 - acc: 0.8998 - val_loss: 1.5424 - val_acc: 0.5768
Epoch 37/50
10/9 [==============================] - 60s 6s/step - loss: 1.4231 - acc: 0.9199 - val_loss: 1.5389 - val_acc: 0.6183
Epoch 38/50
10/9 [==============================] - 59s 6s/step - loss: 1.4247 - acc: 0.9199 - val_loss: 1.5372 - val_acc: 0.5934
Epoch 39/50
10/9 [==============================] - 60s 6s/step - loss: 1.4153 - acc: 0.9399 - val_loss: 1.5406 - val_acc: 0.5560
Epoch 40/50
10/9 [==============================] - 60s 6s/step - loss: 1.4074 - acc: 0.9800 - val_loss: 1.5327 - val_acc: 0.6224
Epoch 41/50
10/9 [==============================] - 60s 6s/step - loss: 1.4023 - acc: 0.9800 - val_loss: 1.5305 - val_acc: 0.6100
Epoch 42/50
10/9 [==============================] - 59s 6s/step - loss: 1.3938 - acc: 0.9800 - val_loss: 1.5269 - val_acc: 0.5975
Epoch 43/50
10/9 [==============================] - 60s 6s/step - loss: 1.3897 - acc: 0.9599 - val_loss: 1.5234 - val_acc: 0.6432
Epoch 44/50
10/9 [==============================] - 60s 6s/step - loss: 1.3828 - acc: 0.9800 - val_loss: 1.5210 - val_acc: 0.6556
Epoch 45/50
10/9 [==============================] - 59s 6s/step - loss: 1.3848 - acc: 0.9599 - val_loss: 1.5234 - val_acc: 0.5975
Epoch 46/50
10/9 [==============================] - 60s 6s/step - loss: 1.3716 - acc: 0.9800 - val_loss: 1.5216 - val_acc: 0.6432
Epoch 47/50
10/9 [==============================] - 60s 6s/step - loss: 1.3721 - acc: 0.9800 - val_loss: 1.5195 - val_acc: 0.6266
Epoch 48/50
10/9 [==============================] - 60s 6s/step - loss: 1.3622 - acc: 0.9599 - val_loss: 1.5108 - val_acc: 0.6141
Epoch 49/50
10/9 [==============================] - 60s 6s/step - loss: 1.3452 - acc: 0.9399 - val_loss: 1.5140 - val_acc: 0.6432
Epoch 50/50
10/9 [==============================] - 60s 6s/step - loss: 1.3387 - acc: 0.9599 - val_loss: 1.5100 - val_acc: 0.6266

Jak widaฤ‡ dokล‚adnoล›ฤ‡ naszej walidacji siฤ™ga 64%, jest to dobry wynik jak na niewielkฤ… iloล›ฤ‡ danych treningowych. Moลผemy to poprawiฤ‡, dodajฤ…c wiฤ™cej warstw lub dodajฤ…c wiฤ™cej obrazรณw treningowych, aby nasz model mรณgล‚ dowiedzieฤ‡ siฤ™ wiฤ™cej o twarzach i osiฤ…gnฤ…ฤ‡ wiฤ™kszฤ… dokล‚adnoล›ฤ‡.

Przetestujmy nasz model na zdjฤ™ciu testowym

Testuj obraz

from keras.models import load_model
from keras.preprocessing.image import load_img, save_img, img_to_array
from keras_vggface.utils import preprocess_input

test_img = image.load_img('test.jpg', target_size=(224, 224))
img_test = image.img_to_array(test_img)
img_test = np.expand_dims(img_test, axis=0)
img_test = utils.preprocess_input(img_test)
predictions = model.predict(img_test)
predicted_class=np.argmax(predictions,axis=1)

labels = (train_generator.class_indices)
labels = dict((v,k) for k,v in labels.items())
predictions = [labels[k] for k in predicted_class]
print(predictions)
['RobertDJr']

uลผywajฤ…c zdjฤ™cia Roberta Downeya Jr. jako naszego zdjฤ™cia testowego, pokazuje, ลผe przewidywana twarz jest prawdziwa!

Przewidywanie za pomocฤ… kamery na ลผywo!

A moลผe sprawdzimy nasze umiejฤ™tnoล›ci wdraลผania go za pomocฤ… sygnaล‚u z kamery internetowej? Uลผywajฤ…c OpenCV z kaskadฤ… Haar Face do znalezienia naszej twarzy i za pomocฤ… naszego modelu sieci moลผemy rozpoznaฤ‡ osobฤ™.

Pierwszym krokiem jest przygotowanie twarzy Ciebie i Twoich znajomych. Im wiฤ™cej mamy danych, tym lepszy wynik!

Przygotuj i wytrenuj swojฤ… sieฤ‡ jak w poprzednim kroku, po zakoล„czeniu uczenia dodaj tฤ™ liniฤ™, aby uzyskaฤ‡ obraz wejล›ciowy z kamery

#Load trained model
from keras.models import load_model
from keras_vggface import utils
import cv2

image_size = 224
device_id = 0 #camera_device id 

model = load_model('my faces.h5')

#make labels according to your dataset folder 
labels = dict(fisrtname=0,secondname=1) #and so on
print(labels)

cascade_classifier = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
camera = cv2.VideoCapture(device_id)

while camera.isOpened():
    ok, cam_frame = camera.read()
    if not ok:
        break
    
    gray_img=cv2.cvtColor(cam_frame, cv2.COLOR_BGR2GRAY)
    faces= cascade_classifier.detectMultiScale(gray_img, minNeighbors=5)

    for (x,y,w,h) in faces:
        cv2.rectangle(cam_frame,(x,y),(x+w,y+h),(255,255,0),2)
        roi_color = cam_frame [y:y+h, x:x+w]
        roi color = cv2.cvtColor(roi_color, cv2.COLOR_BGR2RGB)
        roi_color = cv2.resize(roi_color, (image_size, image_size))
        image = roi_color.astype(np.float32, copy=False)
        image = np.expand_dims(image, axis=0)
        image = preprocess_input(image, version=1) # or version=2
        preds = model.predict(image)
        predicted_class=np.argmax(preds,axis=1)

        labels = dict((v,k) for k,v in labels.items())
        name = [labels[k] for k in predicted_class]

        cv2.putText(cam_frame,str(name), 
                    (x + 10, y + 10), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,0,255), 2)
        
    cv2.imshow('video image', cam_frame)
    key = cv2.waitKey(30)
    if key == 27: # press 'ESC' to quit
        break

camera.release()
cv2.destroyAllWindows()

Ktรณry jest lepszy? Keras lub Tensorflow

Keras oferuje prostotฤ™ podczas pisania scenariusza. Moลผemy zaczฤ…ฤ‡ pisaฤ‡ i rozumieฤ‡ siฤ™ bezpoล›rednio z Kerasem, poniewaลผ nie jest to zbyt trudne do zrozumienia. Jest bardziej przyjazny dla uลผytkownika i ล‚atwy w implementacji, nie ma potrzeby wprowadzania wielu zmiennych, aby uruchomiฤ‡ model. Nie musimy wiฤ™c rozumieฤ‡ wszystkich szczegรณล‚รณw procesu zaplecza.

Z drugiej strony Tensorflow to operacje niskiego poziomu, ktรณre oferujฤ… elastycznoล›ฤ‡ i zaawansowane operacje, jeล›li chcesz utworzyฤ‡ dowolny graf obliczeniowy lub model. Tensorflow moลผe rรณwnieลผ wizualizowaฤ‡ proces za pomocฤ… Tensorboard oraz specjalistyczne narzฤ™dzie debugujฤ…ce.

Wiฤ™c jeล›li chcesz zaczฤ…ฤ‡ pracฤ™ z gล‚ฤ™bokim uczeniem siฤ™ bez zbytniej zล‚oลผonoล›ci, uลผyj Keras. Poniewaลผ Keras oferuje prostotฤ™ i jest przyjazny dla uลผytkownika w uลผyciu i ล‚atwy do wdroลผenia niลผ Tensorflow. Ale jeล›li chcesz napisaฤ‡ wล‚asny algorytm w projekcie lub badaniu gล‚ฤ™bokiego uczenia siฤ™, powinieneล› zamiast tego uลผyฤ‡ Tensorflow.

Podsumowanie

Podsumujmy wiฤ™c wszystko, co omรณwiliล›my i zrobiliล›my w tym samouczku.

  • Keras w interfejsie API wysokiego poziomu, ktรณry sล‚uลผy do uล‚atwiania sieci gล‚ฤ™bokiego uczenia siฤ™ za pomocฤ… silnika zaplecza.
  • Keras jest ล‚atwy w uลผyciu i zrozumiaล‚y dziฤ™ki obsล‚udze Pythona, dziฤ™ki czemu wydaje siฤ™ bardziej naturalny niลผ kiedykolwiek. Jest dobry dla poczฤ…tkujฤ…cych, ktรณrzy chcฤ… dowiedzieฤ‡ siฤ™ o gล‚ฤ™bokim uczeniu siฤ™ i dla badaczy, ktรณrzy chcฤ… ล‚atwego w uลผyciu API.
  • Proces instalacji jest ล‚atwy i moลผna skorzystaฤ‡ ze ล›rodowiska wirtualnego lub skorzystaฤ‡ z platformy zewnฤ™trznej np AWS.
  • Keras jest rรณwnieลผ wyposaลผony w rรณลผnego rodzaju modele sieci, dziฤ™ki czemu ล‚atwiej jest nam wykorzystaฤ‡ dostฤ™pny model do wstฤ™pnego wytrenowania i dostrajania wล‚asnego modelu sieci.
  • Istnieje rรณwnieลผ wiele samouczkรณw i artykuล‚รณw na temat uลผywania Keras z kodรณw spoล‚ecznoล›ci na caล‚ym ล›wiecie do celรณw gล‚ฤ™bokiego uczenia siฤ™.

Podsumuj ten post nastฤ™pujฤ…co: