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
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.
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.
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
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.
Trin 2) Indtast detaljerne
- Indtast dit notesbogsnavn.
- Opret en IAM-rolle. Det vil skabe en AMI-rolle Amazon IAM rolle i formatet af AmazonSageMaker-Executionrole-ร ร ร ร MMDD|HHmmSS.
- Til sidst skal du vรฆlge Opret notesbogsforekomst. Efter et par รธjeblikke, Amazon Sagemaker lancerer en notebook-forekomst.
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
Trin 4) Start kodning
In Jupyter, Klik pรฅ Ny> conda_tensorflow_p36 og du er klar til at kode
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
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:
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
- Gรฅ til Visual Studio-downloadsiden https://www.microsoft.com/en-us/download/details.aspx?id=53587
- Vรฆlg Redistributables og Build Tools
- Download og 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
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
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
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.
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
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.
Trin 5) Klik nu pรฅ din fil og kopier den Link sรฅ vi kan downloade det.
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()
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
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!
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.
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
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
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.























