Keras tutorial

Hvad er Keras?

Keras er et Open Source Neural Network-bibliotek skrevet i Python der kรธrer oven pรฅ Theano eller Tensorflow. Den er designet til at vรฆre modulopbygget, hurtig og nem at bruge. Det blev udviklet af Franรงois Chollet, en Google-ingeniรธr. Keras hรฅndterer ikke beregninger pรฅ lavt niveau. I stedet bruger den et andet bibliotek til at gรธre det, kaldet "Backend.

Keras er API-indpakning pรฅ hรธjt niveau til lav-niveau API, der kan kรธre oven pรฅ TensorFlow, CNTK eller Theano. Keras High-Level API hรฅndterer den mรฅde, vi laver modeller pรฅ, definerer lag eller opsรฆtter flere input-output-modeller. Pรฅ dette niveau kompilerer Keras ogsรฅ vores model med tabs- og optimeringsfunktioner, trรฆningsproces med fit-funktion. Keras ind Python hรฅndterer ikke Low-Level API, sรฅsom at lave beregningsgrafen, lave tensorer eller andre variabler, fordi det er blevet hรฅndteret af "backend"-motoren.

Hvad er en backend?

Backend er et begreb i Keras, der udfรธrer al beregning pรฅ lavt niveau sรฅsom tensorprodukter, foldninger og mange andre ting ved hjรฆlp af andre biblioteker sรฅsom Tensorflow eller Theano. Sรฅ "backend-motoren" vil udfรธre beregningen og udviklingen af โ€‹โ€‹modellerne. Tensorflow er standard "backend-motor", men vi kan รฆndre det i konfigurationen.

Theano, Tensorflow og CNTK Backend

Backend af Theano

Theano er et open source-projekt, der er udviklet af MILA-gruppen ved University of Montreal, Quebec, Canada. Det var det fรธrste udbredte Framework. Det er en Python bibliotek, der hjรฆlper med multidimensionelle arrays til matematiske operationer ved hjรฆlp af Numpy eller Scipy. Theano kan bruge GPU'er til hurtigere beregning, den kan ogsรฅ automatisk bygge symbolske grafer til beregning af gradienter. Pรฅ sin hjemmeside hรฆvder Theano, at den kan genkende numerisk ustabile udtryk og beregne dem med mere stabile algoritmer, dette er meget nyttigt for vores ustabile udtryk.

Backend af TensorFlow

Pรฅ den anden side er Tensorflow den stigende stjerne i deep learning framework. Udviklet af Googles Brain-team er det det mest populรฆre deep learning-vรฆrktรธj. Med en masse funktioner, og forskere bidrager til at hjรฆlpe med at udvikle denne ramme til deep learning formรฅl.

Backend af CNTK

En anden backend-motor til Keras er The Microsoft Cognitive Toolkit eller CNTK. Det er en open source-deep learning-ramme, der er udviklet af Microsoft Hold. Den kan kรธre pรฅ multi GPU'er eller multi-maskine til trรฆning af dyb lรฆringsmodel i massiv skala. I nogle tilfรฆlde blev CNTK rapporteret hurtigere end andre rammer sรฅsom Tensorflow eller Theano. Nรฆste i denne Keras CNN tutorial, vil vi sammenligne backends af Theano, TensorFlow og CNTK.

Sammenligning af backends

Vi er nรธdt til at lave et benchmark for at kende sammenligningen mellem disse to backends. Som du kan se i Jeong-Yoon Lees benchmark, sammenlignes ydeevnen af โ€‹โ€‹3 forskellige backends pรฅ forskellig hardware. Og resultatet er, at Theano er langsommere end den anden backend, forlyder det 50 gange langsommere, men nรธjagtigheden er tรฆt pรฅ hinanden.

En anden benchmark test udfรธres af Jasmeet Bhatia. Han rapporterede, at Theano er langsommere end Tensorflow for nogle test. Men den samlede nรธjagtighed er nรฆsten den samme for hvert netvรฆrk, der blev testet.

Sรฅ mellem Theano, Tensorflow og CTK er det indlysende, at TensorFlow er bedre end Theano. Med TensorFlow er beregningstiden meget kortere, og CNN er bedre end de andre.

Nรฆste i denne Keras Python tutorial, vil vi lรฆre om forskellen mellem Keras og TensorFlow (Keras vs Tensorflow).

Keras vs Tensorflow

Driftsparametre Keras Tensorflow
Type API-indpakning pรฅ hรธjt niveau API pรฅ lavt niveau
Kompleksitet Nem at bruge, hvis du Python Sprog Du skal lรฆre syntaksen ved at bruge nogle af Tensorflow-funktionerne
Formรฅl Hurtig implementering til fremstilling af model med standardlag Giver dig mulighed for at lave en vilkรฅrlig beregningsgraf eller modellag
Vรฆrktรธjer Bruger andre API-fejlretningsvรฆrktรธjer sรฅsom TFDBG Du kan bruge Tensorboard visualiseringsvรฆrktรธjer
Fรฆllesskab Store aktive fรฆllesskaber Store aktive fรฆllesskaber og bredt delte ressourcer

Fordele ved Keras

Hurtig implementering og let at forstรฅ

Keras er meget hurtig til at lave en netvรฆrksmodel. Hvis du vil lave en simpel netvรฆrksmodel med et par linjer, Python Det kan Keras hjรฆlpe dig med. Se Keras-eksemplet nedenfor:

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

Pรฅ grund af den venlige API kan vi nemt forstรฅ processen. At skrive koden med en simpel funktion og ingen grund til at indstille flere parametre.

Stor samfundsstรธtte

Der er masser af AI-fรฆllesskaber, der bruger Keras til deres Deep Learning-ramme. Mange af dem udgiver deres koder samt tutorials til den brede offentlighed.

Har flere backends

Du kan vรฆlge Tensorflow, CNTK og Theano som din backend med Keras. Du kan vรฆlge en anden backend til forskellige projekter afhรฆngigt af dine behov. Hver backend har sin egen unikke fordel.

Pรฅ tvรฆrs af platforme og nem modelimplementering

Med en rรฆkke understรธttede enheder og platforme kan du implementere Keras pรฅ enhver enhed som f.eks

  • iOS med CoreML
  • Android med Tensorflow Android,
  • Webbrowser med .js-understรธttelse
  • Cloud motor
  • raspberry Pi

Understรธttelse af flere GPU'er

Du kan trรฆne Keras pรฅ en enkelt GPU eller bruge flere GPU'er pรฅ รฉn gang. Fordi Keras har en indbygget understรธttelse af dataparallelisme, sรฅ den kan behandle store mรฆngder data og fremskynde den nรธdvendige tid til at trรฆne dem.

Ulemper ved Keras

Kan ikke hรฅndtere API pรฅ lavt niveau

Keras hรฅndterer kun API pรฅ hรธjt niveau, som kรธrer oven pรฅ andre rammer eller backend-motorer sรฅsom Tensorflow, Theano eller CNTK. Sรฅ det er ikke sรฆrlig nyttigt, hvis du vil lave dit eget abstrakte lag til dine forskningsformรฅl, fordi Keras allerede har forudkonfigurerede lag.

Installation af Keras

I dette afsnit vil vi se pรฅ forskellige tilgรฆngelige metoder til at installere Keras

Direkte installation eller virtuelt miljรธ

Hvilken er bedst? Direkte installation til den aktuelle python eller bruge et virtuelt miljรธ? Jeg foreslรฅr, at du bruger et virtuelt miljรธ, hvis du har mange projekter. Vil du vide hvorfor? Dette skyldes, at forskellige projekter kan bruge en anden version af et keras-bibliotek.

Jeg har fx et projekt, der trรฆnger til Python 3.5 ved hjรฆlp af OpenCV 3.3 med รฆldre Keras-Theano backend, men i det andet projekt skal jeg bruge Keras med den nyeste version og en Tensorflow som backend med Python 3.6.6 support

Vi รธnsker ikke, at Keras-biblioteket skal komme i konflikt med hinanden, vel? Sรฅ vi bruger et virtuelt miljรธ til at lokalisere projektet med en bestemt type bibliotek, eller vi kan bruge en anden platform sรฅsom Cloud Service til at udfรธre vores beregninger for os som f.eks. Amazon Webservice.

Installerer Keras pรฅ Amazon Webservice (AWS)

Amazon Web Service er en platform, der tilbyder Cloud Computing-tjenester og produkter til forskere eller andre formรฅl. AWS lejer deres hardware, netvรฆrk, Database osv. sรฅ vi kan bruge det direkte fra internettet. En af de populรฆre AWS-tjenester til deep learning-formรฅl er Amazon Machine Image Deep Learning Service eller DL

Se denne for detaljerede instruktioner om, hvordan du bruger AWS tutorial

Bemรฆrkning om AMI: Du vil have fรธlgende AMI tilgรฆngelig

Installation af Keras pรฅ AWS

AWS Deep Learning AMI er et virtuelt miljรธ i AWS EC2 Service, der hjรฆlper forskere eller praktikere med at arbejde med Deep Learning. DLAMI tilbyder fra smรฅ CPU'er-motorer op til hรธjtydende multi-GPU'er-motorer med prรฆkonfigureret CUDA, cuDNN og kommer med en rรฆkke dybe lรฆringsrammer.

Hvis du vil bruge det med det samme, bรธr du vรฆlge Deep Learning AMI, fordi det leveres forudinstalleret med populรฆre deep learning-rammer.

Men hvis du vil prรธve en brugerdefineret deep learning-ramme til forskning, bรธr du installere Deep Learning Base AMI, fordi den kommer med grundlรฆggende biblioteker sรฅsom CUDA, cuDNN, GPU'er-drivere og andre nรธdvendige biblioteker til at kรธre med dit dybe lรฆringsmiljรธ.

Sรฅdan installeres Keras pรฅ Amazon SageMaker

Amazon SageMaker er en dyb lรฆringsplatform til at hjรฆlpe dig med at trรฆne og implementere dybt lรฆringsnetvรฆrk med den bedste algoritme.

Som nybegynder er dette langt den nemmeste metode til at bruge Keras. Nedenfor er en proces om, hvordan man installerer Keras pรฅ Amazon SageMaker:

Trin 1) ร…bn Amazon SageMaker

I det fรธrste trin skal du รฅbne Amazon Sagemager konsollen og klik pรฅ Opret notesbogsforekomst.

Installer Keras pรฅ Amazon SageMaker

Trin 2) Indtast detaljerne

  1. Indtast dit notesbogsnavn.
  2. Opret en IAM-rolle. Det vil skabe en AMI-rolle Amazon IAM rolle i formatet af AmazonSageMaker-Executionrole-ร…ร…ร…ร…MMDD|HHmmSS.
  3. Til sidst skal du vรฆlge Opret notesbogsforekomst. Efter et par รธjeblikke, Amazon Sagemaker lancerer en notebook-forekomst.

Installer Keras pรฅ Amazon SageMaker

Bemรฆrk: Hvis du vil have adgang til ressourcer fra din VPC, skal du indstille den direkte internetadgang som aktiveret. Ellers vil denne notebook-instans ikke have internetadgang, sรฅ det er umuligt at trรฆne eller hoste modeller

Trin 3) Start forekomsten

Klik pรฅ ร…bn for at starte forekomsten

Installer Keras pรฅ Amazon SageMaker

Trin 4) Start kodning

In Jupyter, Klik pรฅ Ny> conda_tensorflow_p36 og du er klar til at kode

Installer Keras pรฅ Amazon SageMaker

Installer Keras i Linux

For at aktivere Keras med Tensorflow som backend-motor, skal vi fรธrst installere Tensorflow. Kรธr denne kommando for at installere tensorflow med CPU (ingen GPU)

pip install --upgrade tensorflow

Hvis du vil aktivere GPU-understรธttelse for tensorflow, kan du bruge denne kommando

pip install --upgrade tensorflow-gpu

Installer Keras pรฅ Linux

lad os tjekke ind Python for at se, om vores installation er vellykket, ved at skrive

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

hvis der ikke er nogen fejlmeddelelse, er installationsprocessen vellykket

Installer Keras

Nรฅr vi har installeret Tensorflow, lad os begynde at installere keras. Indtast denne kommando i terminalen

pip install keras

det vil begynde at installere Keras og ogsรฅ alle dets afhรฆngigheder. Du skulle se noget som dette:

Installer Keras

Nu har vi Keras installeret i vores system!

Bekrรฆftelse

Fรธr vi begynder at bruge Keras, bรธr vi kontrollere, om vores Keras bruger Tensorflow som backend ved at รฅbne konfigurationsfilen:

gedit ~/.keras/keras.json

du burde se sรฅdan noget

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

som du kan se, bruger "backend" tensorflow. Det betyder, at keras bruger Tensorflow som backend, som vi forventede

og kรธr det nu pรฅ terminalen ved at skrive

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

Sรฅdan installeres Keras pรฅ Windows

Inden vi installerer Tensorflow og Keras, vi burde installere Python, pip og virtualenv. Hvis du allerede har installeret disse biblioteker, skal du fortsรฆtte til nรฆste trin, ellers gรธr du dette:

Installer Python 3 ved at downloade fra denne link

Installer pip ved at kรธre denne

Installer virtualenv med denne kommando

pip3 install โ€“U pip virtualenv

Installer Microsoft Visuel C++ 2015 omdistribuerbar opdatering 3

Kรธr derefter dette script

pip3 install virtualenv

Konfigurer virtuelt miljรธ

Dette bruges til at isolere arbejdssystemet med hovedsystemet.

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

Aktiver miljรธet

.\venv\Scripts\activate

Efter at have forberedt miljรธet, forbliver Tensorflow- og Keras-installationen den samme som Linux. Nรฆste i denne Deep learning with Keras-tutorial vil vi lรฆre om Keras fundamentals for Deep learning.

Keras Fundamentals for Deep Learning

Hovedstrukturen i Keras er modellen, som definerer den komplette graf for et netvรฆrk. Du kan tilfรธje flere lag til en eksisterende model for at bygge en brugerdefineret model, som du har brug for til dit projekt.

Sรฅdan laver du en sekventiel model og et par almindeligt anvendte lag i deep learning

1. Sekventiel model

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

model = Sequential()

2. Konvolutionerende lag

Dette er en Keras Python eksempel pรฅ foldningslag som inputlag med inputformen 320x320x3, med 48 filtre i stรธrrelsen 3ร—3 og brug ReLU som en aktiveringsfunktion.

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

en anden type er

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

3. MaksPooling lag

For at downsample input-reprรฆsentationen skal du bruge MaxPool2d og angive kernestรธrrelsen

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

4. Tรฆt lag

tilfรธjelse af et fuldt tilsluttet lag med blot at angive outputstรธrrelsen

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

5. Frafaldslag

Tilfรธjelse af dropout-lag med 50% sandsynlighed

model.add(Dropout(0.5))

Kompilering, trรฆning og evaluering

Nรฅr vi har defineret vores model, lad os begynde at trรฆne dem. Det er nรธdvendigt at kompilere netvรฆrket fรธrst med tabsfunktionen og optimeringsfunktionen. Dette vil give netvรฆrket mulighed for at รฆndre vรฆgt og minimere tabet.

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

For at starte trรฆningen skal du bruge fit til at fรธre trรฆnings- og valideringsdata til modellen. Dette giver dig mulighed for at trรฆne netvรฆrket i batches og indstille epoker.

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

Vores sidste trin er at evaluere modellen med testdataene.

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

Lad os prรธve at bruge simpel lineรฆr regression

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

Efter trรฆning af dataene skal output se sรฅdan ud

Lineรฆr regression

med startvรฆgten

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

og endelig vรฆgt

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

Finjuster fortrรฆnede modeller i Keras og hvordan man bruger dem

Hvorfor vi bruger Fine Tune-modeller, og hvornรฅr vi bruger det

Finjustering er en opgave at finjustere en fortrรฆnet model, sรฅledes at parametrene vil tilpasse sig den nye model. Nรฅr vi vil trรฆne fra bunden pรฅ en ny model, har vi brug for en stor mรฆngde data, sรฅ netvรฆrket kan finde alle parametre. Men i dette tilfรฆlde vil vi bruge en prรฆ-trรฆnet model, sรฅ parametrene allerede er lรฆrt og har en vรฆgt.

For eksempel, hvis vi รธnsker at trรฆne vores egen Keras-model til at lรธse et klassifikationsproblem, men vi kun har en lille mรฆngde data, sรฅ kan vi lรธse dette ved at bruge en Overfรธr lรฆring + Finjusteringsmetode.

Ved at bruge et fortrรฆnet netvรฆrk og vรฆgte behรธver vi ikke trรฆne hele netvรฆrket. Vi mangler blot at trรฆne det sidste lag, der bruges til at lรธse vores opgave, som vi kalder det Fine-Tuning metode.

Udarbejdelse af netvรฆrksmodel

For den fortrรฆnede model kan vi indlรฆse en rรฆkke forskellige modeller, som Keras allerede har i sit bibliotek, sรฅsom:

  • VGG16
  • InceptionV3
  • ResNet
  • MobileNet
  • Xception
  • InceptionResNetV2

Men i denne proces vil vi bruge VGG16 netvรฆrksmodellen og imageNet som vores vรฆgt for modellen. Vi vil finjustere et netvรฆrk for at klassificere 8 forskellige typer klasser ved hjรฆlp af billeder fra Kaggle Natural Images Dataset

VGG16 model arkitektur

VGG16 model arkitektur

kilde

Uploader vores data til AWS S3 Bucket

Til vores trรฆningsproces vil vi bruge et billede af naturlige billeder fra 8 forskellige klasser sรฅsom fly, bil, kat, hund, blomst, frugt, motorcykel og person. Fรธrst skal vi uploade vores data til Amazon S3 spand.

Amazon S3 spand

Trin 1) Efter login pรฅ din S3-konto, lad os oprette en bรธtte ved at klokke Opret spand

Uploader data til AWS S3 Bucket

Trin 2) Vรฆlg nu et Bucket-navn og din region i henhold til din konto. Sรธrg for, at spandnavnet er tilgรฆngeligt. Efter det klik Opret.

Uploader data til AWS S3 Bucket

Trin 3) Som du kan se, er din Bucket klar til brug. Men som du kan se, er adgangen ikke offentlig, den er god for dig, hvis du vil holde den privat for dig selv. Du kan รฆndre denne bucket til offentlig adgang i Bucket Properties

Uploader data til AWS S3 Bucket

Trin 4) Nu begynder du at uploade dine trรฆningsdata til din Bucket. Her vil jeg uploade tar.gz filen som bestรฅr af billeder til trรฆning og testproces.

Uploader data til AWS S3 Bucket

Trin 5) Klik nu pรฅ din fil og kopier den Link sรฅ vi kan downloade det.

Uploader data til AWS S3 Bucket

Dataforberedelse

Vi skal generere vores trรฆningsdata ved hjรฆlp af Keras ImageDataGenerator.

Fรธrst skal du downloade ved hjรฆlp af wget med linket til din fil fra S3 Bucket.

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

Nรฅr du har downloadet dataene, lad os starte trรฆningsprocessen.

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)

BilleddataGenerator vil lave en X_training data fra en mappe. Underbiblioteket i den mappe vil blive brugt som en klasse for hvert objekt. Billedet vil blive indlรฆst med RGB-farvetilstanden, med den kategoriske klassetilstand for Y_trรฆningsdataene, med en batchstรธrrelse pรฅ 16. Bland endelig dataene.

Lad os se vores billeder tilfรฆldigt ved at plotte dem med 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()

Dataforberedelse

Lad os derefter skabe vores netvรฆrksmodel fra VGG16 med imageNet fortrรฆnet vรฆgt. Vi vil fryse disse lag, sรฅ lagene ikke kan trรฆnes for at hjรฆlpe os med at reducere beregningstiden.

Oprettelse af vores model fra 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())

Som du kan se nedenfor, er sammenfatningen af โ€‹โ€‹vores netvรฆrksmodel. Fra et input fra VGG16 Layers tilfรธjer vi 2 Fully Connected Layer, som vil udtrรฆkke 1024 funktioner og et outputlag, der vil beregne de 8 klasser med softmax-aktiveringen.

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

Kurser

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

Resultater

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

Kurser

Som du kan se, er vores tab faldet betydeligt, og nรธjagtigheden er nรฆsten 100%. For at teste vores model valgte vi tilfรฆldigt billeder over internettet og lagde dem i testmappen med en anden klasse at teste

Tester vores model

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

Og vores test er som vist nedenfor! Kun 1 billede er forudsagt forkert ud fra en test af 14 billeder!

Test model

Ansigtsgenkendelse neuralt netvรฆrk med Keras

Hvorfor vi har brug for anerkendelse

Vi har brug for anerkendelse for at gรธre det nemmere for os at genkende eller identificere en persons ansigt, objekttype, anslรฅede alder pรฅ en person ud fra hans ansigt eller endda kende personens ansigtsudtryk.

Ansigtsgenkendelse neuralt netvรฆrk med Keras

Mรฅske indser du, at hver gang du prรธver at markere din vens ansigt pรฅ et billede, har funktionen i Facebook gjort det for dig, det vil sige at markere din vens ansigt uden at du behรธver at markere det fรธrst. Dette er ansigtsgenkendelse anvendt af Facebook for at gรธre det nemmere for os at tagge venner.

Sรฅ hvordan virker det? Hver gang vi markerer vores vens ansigt, vil Facebooks AI lรฆre det og vil forsรธge at forudsige det, indtil det fรฅr det rigtige resultat. Det samme system vil vi bruge til at lave vores egen ansigtsgenkendelse. Lad os begynde at lave vores egen ansigtsgenkendelse ved hjรฆlp af Deep Learning

Netvรฆrksmodel

Vi vil bruge en VGG16 netvรฆrksmodel, men med VGGFace-vรฆgt.

VGG16 model arkitektur

Netvรฆrksmodel

Hvad er VGGFace? det er Keras implementering af Deep Face Recognition introduceret af Parkhi, Omkar M. et al. "Dyb ansigtsgenkendelse." BMVC (2015). Rammen bruger VGG16 som netvรฆrksarkitektur.

Du kan downloade VGGFace fra 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()

Som du kan se netvรฆrksoversigten

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

vi vil gรธre en Overfรธr lรฆring + Finjustering for at gรธre trรฆningen hurtigere med smรฅ datasรฆt. Fรธrst vil vi fryse bundlagene, sรฅ lagene ikke kan trรฆnes.

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

sรฅ tilfรธjer vi vores eget lag for at genkende vores testansigter. Vi tilfรธjer 2 fuldt forbundne lag og et outputlag med 5 personer til at opdage.

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)

Lad os se vores netvรฆrksoversigt

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

Som du kan se ovenfor, vil det efter pool5-laget blive fladt sammen til en enkelt funktionsvektor, der vil blive brugt af det tรฆtte lag til den endelige genkendelse.

Forberedelse af vores ansigter

Lad os nu forberede vores ansigter. Jeg lavede en mappe bestรฅende af 5 kendte personer

  • Jack Ma
  • Jason Statham
  • Johnny Depp
  • Robert Downey Jr. Jr
  • Rรธn Atkinson

Hver mappe indeholder 10 billeder, for hver trรฆnings- og evalueringsproces. Det er en meget lille mรฆngde data, men det er udfordringen, ikke?

Vi vil bruge hjรฆlpen fra Keras vรฆrktรธj til at hjรฆlpe os med at forberede dataene. Denne funktion vil iterere i datasรฆtmappen og derefter forberede den, sรฅ den kan bruges i trรฆningen.

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

Trรฆning af vores model

Lad os begynde vores trรฆningsproces med at kompilere vores netvรฆrk med tabsfunktion og optimering. Her bruger vi sparse_categorical_crossentropy som vores tabsfunktion ved hjรฆlp af SGD som vores lรฆringsoptimering.

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

Som du kan se, er vores valideringsnรธjagtighed op til 64%, dette er et godt resultat for en lille mรฆngde trรฆningsdata. Vi kan forbedre dette ved at tilfรธje flere lag eller tilfรธje flere trรฆningsbilleder, sรฅ vores model kan lรฆre mere om ansigterne og opnรฅ mere nรธjagtighed.

Lad os teste vores model med et testbillede

Test billede

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

ved at bruge Robert Downey Jr.-billede som vores testbillede, viser det, at det forudsagte ansigt er sandt!

Forudsigelse ved hjรฆlp af Live Cam!

Hvad med, hvis vi tester vores evner med at implementere det med input fra et webcam? Ved at bruge OpenCV med Haar Face cascade til at finde vores ansigt og ved hjรฆlp af vores netvรฆrksmodel kan vi genkende personen.

Det fรธrste skridt er at forberede dig og din vens ansigter. Jo flere data vi har, jo bedre er resultatet!

Forbered og trรฆne dit netvรฆrk som det forrige trin, nรฅr trรฆningen er fuldfรธrt, tilfรธj denne linje for at fรฅ inputbilledet fra cam

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

Hvilken er bedst? Keras eller Tensorflow

Keras tilbyder enkelhed, nรฅr du skriver manuskriptet. Vi kan begynde at skrive og forstรฅ direkte med Keras, da det ikke er for svรฆrt at forstรฅ. Det er mere brugervenligt og nemt at implementere, ingen grund til at lave mange variabler for at kรธre modellen. Sรฅ vi behรธver ikke at forstรฅ alle detaljer i backend-processen.

Pรฅ den anden side er Tensorflow operationerne pรฅ lavt niveau, der tilbyder fleksibilitet og avancerede operationer, hvis du vil lave en vilkรฅrlig beregningsgraf eller model. Tensorflow kan ogsรฅ visualisere processen ved hjรฆlp af TensorBoard og et specialiseret debugger-vรฆrktรธj.

Sรฅ hvis du vil begynde at arbejde med dyb lรฆring med ikke sรฅ meget kompleksitet, sรฅ brug Keras. Fordi Keras tilbyder enkelhed og brugervenlig at bruge og nem at implementere end Tensorflow. Men hvis du vil skrive din egen algoritme i deep learning projekt eller forskning, bรธr du bruge Tensorflow i stedet.

Resumรฉ

Sรฅ lad os opsummere alt, hvad vi har diskuteret og gjort i denne tutorial.

  • Keras i en API pรฅ hรธjt niveau, der bruges til at gรธre deep learning-netvรฆrk nemmere ved hjรฆlp af backend-motor.
  • Keras er nem at bruge og forstรฅ med python-understรธttelse, sรฅ den fรธles mere naturlig end nogensinde. Det er godt for begyndere, der รธnsker at lรฆre om dyb lรฆring, og for forskere, der รธnsker let at bruge API.
  • Installationsprocessen er nem, og du kan bruge et virtuelt miljรธ eller bruge en ekstern platform som f.eks AWS.
  • Keras kommer ogsรฅ med forskellige slags netvรฆrksmodeller, sรฅ det gรธr os nemmere at bruge den tilgรฆngelige model til at fortrรฆne og finjustere vores egen netvรฆrksmodel.
  • Der er ogsรฅ en masse tutorials og artikler om brug af Keras fra fรฆllesskaber verden over koder til dyb lรฆringsformรฅl.

Opsummer dette indlรฆg med: