Keras vodič: Što je Keras? Kako instalirati u Python [Primjer]

Što je Keras?

Keras je biblioteka neuronske mreže otvorenog koda napisana u Python koji radi na vrhu Theano ili Tensorflow. Dizajniran je da bude modularan, brz i jednostavan za korištenje. Razvio ga je François Chollet, Googleov inženjer. Keras ne obrađuje proračune niske razine. Umjesto toga, za to koristi drugu biblioteku, nazvanu “Backend.

Keras je API omotač visoke razine za API niske razine, koji može raditi povrh TensorFlow, CNTK ili Theano. Keras High-Level API upravlja načinom na koji izrađujemo modele, definiramo slojeve ili postavljamo više ulazno-izlaznih modela. Na ovoj razini Keras također kompilira naš model s funkcijama gubitka i optimizacije, proces treninga s funkcijom prilagodbe. Keras u Python ne rukuje API-jem niske razine kao što je izrada računskog grafa, izrada tenzora ili drugih varijabli jer je njime upravljao "backend" motor.

Što je Backend?

Backend je izraz u Kerasu koji izvodi sva izračunavanja niske razine kao što su tenzorski produkti, konvolucije i mnoge druge stvari uz pomoć drugih biblioteka kao što su Tensorflow ili Theano. Dakle, "backend engine" će izvršiti proračun i razvoj modela. Tensorflow je zadani "pozadinski motor", ali ga možemo promijeniti u konfiguraciji.

Theano, Tensorflow i CNTK pozadina

Pozadina Theano

Theano je projekt otvorenog koda koji je razvila MILA grupa sa Sveučilišta u Montrealu, Quebec, Kanada. Bio je to prvi široko korišteni Framework. To je a Python knjižnica koja pomaže u višedimenzionalnim nizovima za matematičke operacije pomoću Numpyja ili Scipyja. Theano može koristiti GPU za brže računanje, također može automatski graditi simboličke grafikone za računanje gradijenata. Theano na svojoj web stranici tvrdi da može prepoznati numerički nestabilne izraze i izračunati ih sa stabilnijim algoritmima, što je vrlo korisno za naše nestabilne izraze.

Pozadina TensorFlowa

S druge strane, Tensorflow je zvijezda u usponu u okviru dubokog učenja. Razvio ga je Googleov Brain tim i najpopularniji je alat za duboko učenje. S puno značajki, a istraživači doprinose razvoju ovog okvira za potrebe dubokog učenja.

Pozadina CNTK-a

Drugi pozadinski motor za Keras je The Microsoft Cognitive Toolkit ili CNTK. To je okvir dubokog učenja otvorenog koda koji su razvili Microsoft Tim. Može raditi na više GPU-ova ili na više strojeva za treniranje modela dubokog učenja u velikim razmjerima. U nekim je slučajevima CNTK prijavljen brže od drugih okvira kao što su Tensorflow ili Theano. Zatim ćemo u ovom Keras CNN vodiču usporediti pozadinu Theano, TensorFlow i CNTK.

Usporedba pozadina

Moramo napraviti referentnu vrijednost kako bismo znali usporedbu između ova dva pozadina. Kao što vidite u Mjerilo Jeong-Yoon Leeja, uspoređuje se izvedba 3 različita pozadina na različitom hardveru. Rezultat je da je Theano sporiji od druge pozadine, navodi se 50 puta sporiji, ali točnost je blizu jedna drugoj.

Druga referentni test obavlja Jasmeet Bhatia. Izvijestio je da je Theano sporiji od Tensorflowa za neke testove. Ali ukupna točnost je gotovo ista za svaku testiranu mrežu.

Dakle, između Theano, Tensorflow i CTK očito je da je TensorFlow bolji od Theana. Uz TensorFlow, vrijeme izračuna je puno kraće, a CNN je bolji od ostalih.

Sljedeći u ovom Kerasu Python tutorial, naučit ćemo o razlici između Kerasa i TensorFlowa (Keras protiv Tensorflowa).

Keras protiv Tensorflowa

Parametri Keras Tenzor protok
Tip Omotač API-ja visoke razine API niske razine
Složenost Jednostavan za korištenje ako Python jezik Morate naučiti sintaksu korištenja neke od Tensorflow funkcija
Svrha Brza implementacija za izradu modela sa standardnim slojevima Omogućuje izradu proizvoljnog računskog grafikona ili slojeva modela
Alati Koristi drugi API alat za otklanjanje pogrešaka kao što je TFDBG Možete koristiti Tensorboard alate za vizualizaciju
Zajednica Velike aktivne zajednice Velike aktivne zajednice i široko dijeljeni resursi

Prednosti Kerasa

Brza implementacija i lako razumijevanje

Keras vrlo brzo izrađuje mrežni model. Ako želite napraviti jednostavan mrežni model s nekoliko linija, Python Keras vam može pomoći u tome. Pogledajte primjer Kerasa u nastavku:

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'))

Zbog prijateljskog API-ja, lako možemo razumjeti proces. Pisanje koda s jednostavnom funkcijom i bez potrebe za postavljanjem više parametara.

Velika podrška zajednice

Postoji puno AI zajednica koje koriste Keras za svoj okvir dubokog učenja. Mnogi od njih objavljuju svoje kodove kao i upute za širu javnost.

Imajte više pozadina

Možete odabrati Tensorflow, CNTK i Theano kao svoj backend s Kerasom. Možete odabrati drugu pozadinu za različite projekte ovisno o vašim potrebama. Svaki backend ima svoju jedinstvenu prednost.

Više platformi i jednostavna implementacija modela

S nizom podržanih uređaja i platformi, možete implementirati Keras na bilo koji uređaj poput

  • iOS s CoreML-om
  • Android s Tensorflowom Android,
  • Web preglednik s podrškom za .js
  • Cloud engine
  • Raspberry Pi

Podrška za više grafičkih procesora

Možete trenirati Keras na jednom GPU-u ili koristiti više GPU-a odjednom. Keras ima ugrađenu podršku za paralelizam podataka tako da može obraditi velike količine podataka i ubrzati vrijeme potrebno za njihovo treniranje.

Nedostaci Kerasa

Ne može rukovati API-jem niske razine

Keras obrađuje samo API visoke razine koji radi na vrhu drugog okvira ili pozadinskog motora kao što su Tensorflow, Theano ili CNTK. Stoga nije baš korisno ako želite napraviti vlastiti apstraktni sloj za svoje istraživačke svrhe jer Keras već ima unaprijed konfigurirane slojeve.

Instalacija Kerasa

U ovom ćemo odjeljku pogledati različite metode dostupne za instaliranje Kerasa

Izravna instalacija ili virtualno okruženje

Koji je bolji? Izravno instalirati na trenutni python ili koristiti virtualno okruženje? Predlažem korištenje virtualnog okruženja ako imate mnogo projekata. Želite li znati zašto? To je zato što različiti projekti mogu koristiti različite verzije keras biblioteke.

Na primjer, imam projekt koji treba Python 3.5 koristeći OpenCV 3.3 sa starijom pozadinom Keras-Theano, ali u drugom projektu moram koristiti Keras s najnovijom verzijom i Tensorflowom kao pozadinom s Python 3.6.6 podrška

Ne želimo da se Keras knjižnica sukobljava jedna s drugom, zar ne? Dakle, koristimo virtualno okruženje da lokaliziramo projekt s određenom vrstom biblioteke ili možemo koristiti drugu platformu kao što je Cloud Service da izvrši naš proračun umjesto nas Amazon Web usluga.

Instaliranje Kerasa na Amazon Web usluga (AWS)

Amazon Web usluga je platforma koja nudi Cloud Computing uslugu i proizvode za istraživače ili bilo koje druge svrhe. AWS iznajmljuje njihov hardver, umrežavanje, bazu podataka itd. kako bismo to mogli koristiti izravno s interneta. Jedna od popularnih AWS usluga za potrebe dubokog učenja je Amazon Usluga dubokog učenja strojne slike ili DL

Za detaljne upute o tome kako koristiti AWS, pogledajte ovo udžbenik

Napomena o AMI-ju: imat ćete na raspolaganju sljedeće AMI-je

Instaliranje Kerasa na AWS

AWS Deep Learning AMI virtualno je okruženje u AWS EC2 usluzi koje pomaže istraživačima ili praktičarima u radu s dubokim učenjem. DLAMI nudi od malih CPU-a do snažnih multi-GPU-a s unaprijed konfiguriranim CUDA-om, cuDNN-om i dolazi s nizom okvira dubokog učenja.

Ako ga želite koristiti odmah, trebali biste odabrati Deep Learning AMI jer dolazi unaprijed instaliran s popularnim okvirima dubokog učenja.

Ali ako želite isprobati prilagođeni okvir dubokog učenja za istraživanje, trebali biste instalirati Deep Learning Base AMI jer dolazi s temeljnim bibliotekama kao što su CUDA, cuDNN, GPU upravljački programi i druge potrebne biblioteke za rad s vašim okruženjem dubokog učenja.

Kako instalirati Keras na Amazon SageMaker

Amazon SageMaker je platforma za duboko učenje koja vam pomaže u obuci i implementaciji mreže za duboko učenje s najboljim algoritmom.

Kao početniku, ovo je daleko najlakši način korištenja Kerasa. Ispod je postupak kako instalirati Keras Amazon SageMaker:

Korak 1) Otvorite Amazon SageMaker

U prvom koraku otvorite Amazon Sagemaker konzolu i kliknite na Stvori instancu bilježnice.

Instalirajte Keras Amazon SageMaker

Korak 2) Unesite pojedinosti

  1. Unesite naziv svoje bilježnice.
  2. Stvorite IAM ulogu. To će stvoriti AMI ulogu Amazon IAM uloga u formatu AmazonSageMaker-Executionrole-GGGGMMDD|HHmmSS.
  3. Na kraju odaberite Stvori instancu bilježnice. Nakon nekoliko trenutaka, Amazon Sagemaker pokreće instancu bilježnice.

Instalirajte Keras Amazon SageMaker

bilješke: Ako želite pristupiti resursima sa svog VPC-a, postavite izravni pristup internetu kao omogućen. Inače, ova instanca bilježnice neće imati pristup internetu, tako da je nemoguće trenirati ili ugostiti modele

Korak 3) Pokrenite instancu

Pritisnite Otvori za pokretanje instance

Instalirajte Keras Amazon SageMaker

Korak 4) Započnite kodiranje

In JupyterKliknite na Novo> conda_tensorflow_p36 i spremni ste za kodiranje

Instalirajte Keras Amazon SageMaker

Instalirajte Keras u Linuxu

Da bismo omogućili Keras s Tensorflowom kao pozadinskim motorom, prvo moramo instalirati Tensorflow. Pokrenite ovu naredbu da instalirate tensorflow s CPU-om (bez GPU-a)

pip install --upgrade tensorflow

ako želite omogućiti GPU podršku za tensorflow možete koristiti ovu naredbu

pip install --upgrade tensorflow-gpu

Instalirajte Keras na Linux

prijavimo se Python da vidimo je li naša instalacija uspješna upisivanjem

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
>>>

ako nema poruke o pogrešci, proces instalacije je uspješan

Instalirajte Keras

Nakon što instaliramo Tensorflow, počnimo instalirati keras. Upišite ovu naredbu u terminal

pip install keras

počet će instalirati Keras i sve njegove ovisnosti. Trebali biste vidjeti nešto poput ovoga:

Instalirajte Keras

Sada imamo Keras instaliran u našem sustavu!

Provjera

Prije nego što počnemo koristiti Keras, trebali bismo provjeriti koristi li naš Keras Tensorflow kao svoju pozadinu otvaranjem konfiguracijske datoteke:

gedit ~/.keras/keras.json

trebao bi vidjeti ovako nešto

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

kao što vidite, "backend" koristi tensorflow. To znači da keras koristi Tensorflow kao svoju pozadinu kao što smo i očekivali

a sada ga pokrenite na terminalu upisivanjem

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.
>>> 

Kako instalirati Keras na Windows

Prije nego što instaliramo Tenzor protok i Keras, trebali bismo instalirati Python, pip i virtualenv. Ako ste već instalirali ove biblioteke, trebali biste prijeći na sljedeći korak, inače učinite ovo:

Instalirati Python 3 preuzimanjem s ovog link

Instalirajte pip pokretanjem to

Instalirajte virtualenv ovom naredbom

pip3 install –U pip virtualenv

Instalirati Microsoft Visual C++ Redistributivno ažuriranje 2015 za 3

Zatim pokrenite ovu skriptu

pip3 install virtualenv

Postavljanje virtualnog okruženja

Ovo se koristi za izolaciju radnog sustava od glavnog sustava.

virtualenv –-system-site-packages –p python3 ./venv

Aktivirajte okolinu

.\venv\Scripts\activate

Nakon pripreme okruženja, instalacija Tensorflowa i Kerasa ostaje ista kao i Linux. Zatim ćemo u ovom vodiču za duboko učenje s Kerasom učiti o osnovama Kerasa za duboko učenje.

Keras osnove za duboko učenje

Glavna struktura u Kerasu je model koji definira kompletan graf mreže. Možete dodati više slojeva postojećem modelu kako biste izradili prilagođeni model koji vam je potreban za vaš projekt.

Evo kako napraviti sekvencijalni model i nekoliko često korištenih slojeva u dubokom učenju

1. Sekvencijalni model

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

model = Sequential()

2. Konvolucijski sloj

Ovo je Keras Python primjer konvolucijskog sloja kao ulaznog sloja s ulaznim oblikom 320x320x3, s 48 filtera veličine 3×3 i korištenjem ReLU kao aktivacijske funkcije.

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))

druga vrsta je

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

3. MaksPooling Sloj

Za smanjivanje uzorkovanja ulazne reprezentacije, koristite MaxPool2d i odredite veličinu kernela

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

4. Gusti sloj

dodavanje potpuno povezanog sloja uz samo navođenje izlazne veličine

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

5. Ispadajući sloj

Dodavanje ispadajućeg sloja s 50% vjerojatnosti

model.add(Dropout(0.5))

Sastavljanje, obuka i evaluacija

Nakon što definiramo naš model, počnimo ih trenirati. Potrebno je prvo kompajlirati mrežu s funkcijom gubitka i funkcijom optimizacije. To će omogućiti mreži promjenu težine i minimizirati gubitak.

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

Sada za početak obuke, koristite fit da unesete podatke o obuci i validaciji u model. To će vam omogućiti da trenirate mrežu u serijama i postavite epohe.

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

Naš posljednji korak je procjena modela s testnim podacima.

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

Pokušajmo upotrijebiti jednostavnu linearnu regresiju

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()

Nakon uvježbavanja podataka, izlaz bi trebao izgledati ovako

Linearna regresija

s početnom težinom

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

i konačnu težinu

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

Fino podešavanje unaprijed obučenih modela u Kerasu i kako ih koristiti

Zašto koristimo modele Fine Tune i kada ih koristimo

Fino podešavanje je zadatak ugađanja prethodno obučenog modela tako da se parametri prilagode novom modelu. Kada želimo trenirati od nule na novom modelu, potrebna nam je velika količina podataka, kako bi mreža mogla pronaći sve parametre. Ali u ovom slučaju koristit ćemo unaprijed obučeni model tako da su parametri već naučeni i imaju težinu.

Na primjer, ako želimo uvježbati vlastiti Kerasov model za rješavanje problema klasifikacije, ali imamo samo malu količinu podataka, tada to možemo riješiti korištenjem Prijenos učenja + Metoda finog podešavanja.

Korištenjem unaprijed uvježbane mreže i utega ne trebamo trenirati cijelu mrežu. Samo trebamo istrenirati posljednji sloj koji se koristi za rješavanje našeg zadatka kako to nazivamo metodom finog podešavanja.

Priprema modela mreže

Za unaprijed obučeni model, možemo učitati različite modele koje Keras već ima u svojoj biblioteci, kao što su:

  • VGG16
  • Početak V3
  • ResNet
  • MobileNet
  • Xception
  • InceptionResNetV2

Ali u ovom procesu koristit ćemo mrežni model VGG16 i imageNet kao našu težinu za model. Fino ćemo podesiti mrežu za klasificiranje 8 različitih vrsta klasa pomoću slika iz Skup podataka Kaggle prirodnih slika

Arhitektura modela VGG16

Arhitektura modela VGG16

izvor

Prijenos naših podataka u AWS S3 Bucket

Za naš proces obuke koristit ćemo sliku prirodnih slika iz 8 različitih klasa kao što su avioni, automobil, mačka, pas, cvijet, voće, motocikl i osoba. Prvo moramo prenijeti svoje podatke na Amazon S3 Kanta.

Amazon S3 Kanta

Korak 1) Nakon što se prijavite na svoj S3 račun, kreirajmo kantu taktom Stvori kantu

Prijenos podataka u AWS S3 Bucket

Korak 2) Sada odaberite naziv spremnika i svoju regiju u skladu s vašim računom. Provjerite je li naziv spremnika dostupan. Nakon tog klika Stvoriti.

Prijenos podataka u AWS S3 Bucket

Korak 3) Kao što vidite, vaš Bucket je spreman za korištenje. Ali kao što vidite, pristup nije javan, dobro je za vas ako ga želite zadržati privatnim za sebe. Ovu kantu možete promijeniti za javni pristup u Svojstvima kante

Prijenos podataka u AWS S3 Bucket

Korak 4) Sada počinjete učitavati svoje podatke o vježbanju u svoju kantu. Ovdje ću učitati datoteku tar.gz koja se sastoji od slika za proces obuke i testiranja.

Prijenos podataka u AWS S3 Bucket

Korak 5) Sada kliknite svoju datoteku i kopirajte Veza kako bismo ga mogli preuzeti.

Prijenos podataka u AWS S3 Bucket

Priprema podataka

Moramo generirati podatke o treningu pomoću Keras ImageDataGenerator.

Prvo morate preuzeti pomoću wget-a s vezom na vašu datoteku iz S3 Bucket-a.

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

Nakon što preuzmete podatke, počnimo proces obuke.

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)

ImageDataGenerator će napraviti X_training podatke iz direktorija. Poddirektorij u tom direktoriju koristit će se kao klasa za svaki objekt. Slika će se učitati s RGB načinom boja, s kategoričkim načinom klase za podatke Y_training, s veličinom serije 16. Na kraju, promiješajte podatke.

Pogledajmo naše slike nasumično iscrtavajući ih pomoću matplotliba

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()

Priprema podataka

Nakon toga kreirajmo naš mrežni model iz VGG16 s imageNet unaprijed obučenom težinom. Zamrznut ćemo te slojeve tako da se slojevi ne mogu uvježbati kako bismo smanjili vrijeme izračuna.

Izrada našeg modela iz 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())

Kao što možete vidjeti u nastavku, sažetak našeg mrežnog modela. Iz ulaza iz VGG16 slojeva, zatim dodajemo 2 potpuno povezana sloja koji će izdvojiti 1024 značajke i izlazni sloj koji će izračunati 8 klasa uz softmax aktivaciju.

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

Trening

# # 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()

Rezultati

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

Trening

Kao što vidite, naši su gubici značajno smanjeni, a točnost je gotovo 100%. Za testiranje našeg modela nasumično smo odabrali slike preko interneta i stavili ih u testnu mapu s drugom klasom za testiranje

Testiranje našeg modela

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 naš test je kao što je navedeno u nastavku! Samo je 1 slika pogrešno predviđena od testa od 14 slika!

Model testiranja

Neuronska mreža za prepoznavanje lica s Kerasom

Zašto nam je potrebno priznanje

Prepoznavanje nam je potrebno kako bismo lakše prepoznali ili identificirali nečije lice, vrstu predmeta, procijenjenu dob osobe s njenog lica ili čak znali izraze lica te osobe.

Neuronska mreža za prepoznavanje lica s Kerasom

Možda shvatite da svaki put kada pokušate označiti lice svog prijatelja na fotografiji, značajka na Facebooku je to učinila umjesto vas, a to je označavanje lica vašeg prijatelja bez potrebe da ga vi prvo označite. Ovo je prepoznavanje lica koje Facebook primjenjuje kako bi nam olakšao označavanje prijatelja.

Dakle, kako to radi? Svaki put kada označimo lice našeg prijatelja, Facebookova umjetna inteligencija će to naučiti i pokušati predvidjeti dok ne dobije pravi rezultat. Isti sustav ćemo koristiti za izradu našeg vlastitog prepoznavanja lica. Počnimo stvarati vlastito prepoznavanje lica koristeći Deep Learning

Model mreže

Koristit ćemo VGG16 mrežni model, ali s težinom VGGFace.

Arhitektura modela VGG16

Model mreže

Što je VGGFace? to je Kerasova implementacija dubokog prepoznavanja lica koju su predstavili Parkhi, Omkar M. et al. “Duboko prepoznavanje lica.” BMVC (2015). Okvir koristi VGG16 kao mrežnu arhitekturu.

VGGFace možete preuzeti sa 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()

Kao što vidite sažetak mreže

_________________________________________________________________
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):

mi ćemo učiniti a Prijenos učenja + Fino podešavanje za bržu obuku s malim skupovima podataka. Prvo ćemo zamrznuti osnovne slojeve tako da se slojevi ne mogu trenirati.

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

zatim dodajemo vlastiti sloj za prepoznavanje naših testnih lica. Dodat ćemo 2 potpuno povezana sloja i izlazni sloj s 5 osoba za otkrivanje.

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)

Pogledajmo sažetak naše mreže

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

Kao što možete vidjeti gore, nakon sloja pool5, bit će spljošten u jedan vektor značajki koji će koristiti gusti sloj za konačno prepoznavanje.

Priprema naših lica

Sada pripremimo lica. Napravio sam imenik koji se sastoji od 5 poznatih osoba

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

Svaka mapa sadrži 10 slika za svaki proces obuke i evaluacije. To je vrlo mala količina podataka, ali to je izazov, zar ne?

Za pripremu podataka koristit ćemo pomoć Keras alata. Ova funkcija će ponavljati mapu skupa podataka i zatim je pripremiti tako da se može koristiti u obuci.

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,
)

Obuka našeg modela

Započnimo naš proces obuke sastavljanjem naše mreže s funkcijom gubitka i optimizatorom. Ovdje koristimo sparse_categorical_crossentropy kao našu funkciju gubitka, uz pomoć SGD-a kao našeg optimizatora učenja.

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

Kao što vidite, točnost naše provjere je do 64%, ovo je dobar rezultat za malu količinu podataka o obuci. To možemo poboljšati dodavanjem više slojeva ili dodavanjem više slika za obuku kako bi naš model mogao naučiti više o licima i postići veću točnost.

Testirajmo naš model probnom slikom

Testna slika

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']

koristeći sliku Roberta Downeya Jr. kao našu testnu sliku, pokazuje da je predviđeno lice istinito!

Predviđanje pomoću Live Cam!

Što kažete na to da testiramo svoju vještinu u implementaciji s unosom s web kamere? Koristeći OpenCV s Haar Face kaskadom za pronalaženje našeg lica i uz pomoć našeg mrežnog modela, možemo prepoznati osobu.

Prvi korak je pripremiti lice sebe i prijatelja. Što više podataka imamo, rezultat je bolji!

Pripremite i obučite svoju mrežu kao u prethodnom koraku, nakon završetka obuke dodajte ovaj redak da biste dobili ulaznu sliku s kamere

#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()

Koji je bolji? Keras ili Tensorflow

Keras nudi jednostavnost pisanja scenarija. Možemo početi pisati i razumjeti izravno s Kerasom jer nije previše teško razumjeti. Jednostavniji je za korištenje i jednostavan za implementaciju, nema potrebe za stvaranjem mnogo varijabli za pokretanje modela. Dakle, ne moramo razumjeti svaki detalj u pozadinskom procesu.

S druge strane, Tensorflow su operacije niske razine koje nude fleksibilnost i napredne operacije ako želite napraviti proizvoljan računski graf ili model. Tensorflow također može vizualizirati proces uz pomoć TensorBoard i specijalizirani alat za ispravljanje pogrešaka.

Dakle, ako želite početi raditi s dubokim učenjem bez toliko složenosti, koristite Keras. Budući da Keras nudi jednostavnost i lakoću korištenja te laku implementaciju od Tensorflowa. Ali ako želite napisati vlastiti algoritam u projektu dubokog učenja ili istraživanju, trebali biste umjesto toga upotrijebiti Tensorflow.

Rezime

Dakle, rezimirajmo sve o čemu smo razgovarali i napravili u ovom vodiču.

  • Keras u API-ju visoke razine koji se koristi za olakšavanje mreža dubokog učenja uz pomoć pozadinskog motora.
  • Keras je jednostavan za korištenje i razumijevanje s podrškom za python pa se čini prirodnijim nego ikada. Dobar je za početnike koji žele naučiti o dubokom učenju i za istraživače koji žele jednostavan API.
  • Proces instalacije je jednostavan i možete koristiti virtualno okruženje ili korištenje vanjske platforme kao što je AWS.
  • Keras također dolazi s raznim vrstama mrežnih modela tako da nam olakšava korištenje dostupnog modela za prethodno treniranje i fino podešavanje vlastitog mrežnog modela.
  • Također, postoji mnogo vodiča i članaka o korištenju Kerasa iz kodova zajednica širom svijeta u svrhe dubinskog učenja.