Výukový program Keras: Co je Keras? Jak nainstalovat do Python [Příklad]

Co je Keras?

Keras je open source knihovna neuronových sítí napsaná v Python který běží nad Theano nebo Tensorflow. Je navržen tak, aby byl modulární, rychlý a snadno použitelný. Byl vyvinut Françoisem Cholletem, inženýrem společnosti Google. Keras nezvládá nízkoúrovňové výpočty. Místo toho k tomu používá jinou knihovnu nazvanou „Backend.

Keras je vysokoúrovňový obal API pro nízkoúrovňové API, který může běžet nad TensorFlow, CNTK nebo Theano. Keras High-Level API zpracovává způsob, jakým vytváříme modely, definujeme vrstvy nebo nastavujeme více vstupně-výstupních modelů. V této úrovni Keras také kompiluje náš model se ztrátovými a optimalizačními funkcemi, tréninkový proces s fit funkcí. Keras dovnitř Python nezpracovává Low-Level API, jako je vytváření výpočtového grafu, vytváření tenzorů nebo jiných proměnných, protože to bylo zpracováno „backendovým“ enginem.

Co je to backend?

Backend je termín v Kerasu, který provádí všechny nízkoúrovňové výpočty, jako jsou tensor produkty, konvoluce a mnoho dalších věcí s pomocí jiných knihoven, jako je Tensorflow nebo Theano. Takže „backend engine“ bude provádět výpočty a vývoj modelů. Tensorflow je výchozí „backend engine“, ale můžeme to změnit v konfiguraci.

Theano, Tensorflow a Backend CNTK

Backend Theano

Theano je open source projekt, který vyvinula skupina MILA na University of Montreal, Quebec, Kanada. Byl to první široce používaný rámec. Je to a Python knihovna, která pomáhá ve vícerozměrných polích pro matematické operace pomocí Numpy nebo Scipy. Theano může používat GPU pro rychlejší výpočty a může také automaticky vytvářet symbolické grafy pro výpočet gradientů. Theano na svých stránkách tvrdí, že dokáže rozpoznat numericky nestabilní výrazy a vypočítat je pomocí stabilnějších algoritmů, což je velmi užitečné pro naše nestabilní výrazy.

Backend TensorFlow

Na druhou stranu je Tensorflow vycházející hvězdou v rámci hlubokého učení. Vyvinutý týmem Google Brain je nejoblíbenějším nástrojem hlubokého učení. Díky mnoha funkcím a výzkumníci přispívají k rozvoji tohoto rámce pro účely hlubokého učení.

Backend ČTK

Dalším backendovým enginem pro Keras je The Microsoft Cognitive Toolkit nebo CNTK. Jedná se o open-source rámec hlubokého učení, který byl vyvinut společností Microsoft Tým. Může běžet na více GPU nebo na více strojích pro trénink modelu hlubokého učení v masivním měřítku. V některých případech byl CNTK hlášen rychleji než jiné rámce, jako je Tensorflow nebo Theano. Dále v tomto tutoriálu Keras CNN porovnáme backendy Theano, TensorFlow a CNTK.

Porovnání backendů

Potřebujeme udělat benchmark, abychom poznali srovnání mezi těmito dvěma backendy. Jak můžete vidět v Jeong-Yoon Leeův benchmark, porovnává se výkon 3 různých backendů na různém hardwaru. A výsledek je, že Theano je pomalejší než druhý backend, uvádí se 50 krát pomalejší, ale přesnost je blízko sebe.

Další srovnávací test provádí Jasmeet Bhatia. Uvedl, že Theano je v některých testech pomalejší než Tensorflow. Celková přesnost je však téměř stejná pro každou testovanou síť.

Takže mezi Theano, Tensorflow a ČTK je zřejmé, že TensorFlow je lepší než Theano. S TensorFlow je doba výpočtu mnohem kratší a CNN je lepší než ostatní.

Další v tomto Keras Python tutoriálu se dozvíme o rozdílu mezi Keras a TensorFlow (Keras vs Tensorflow).

Keras vs Tensorflow

parametry Keras tenzorový tok
Typ High-Level API Wrapper Nízkoúrovňové API
Komplexita Snadné použití, pokud jste Python jazyk Musíte se naučit syntaxi používání některých funkcí Tensorflow
Účel Rychlé nasazení pro vytvoření modelu se standardními vrstvami Umožňuje vytvořit libovolný výpočetní graf nebo vrstvy modelu
Tools Používá jiný nástroj pro ladění API, jako je TFDBG Můžete použít vizualizační nástroje Tensorboard
Naše projekty Velké aktivní komunity Velké aktivní komunity a široce sdílené zdroje

Výhody Kerasu

Rychlé nasazení a snadné pochopení

Keras velmi rychle vytváří síťový model. Pokud chcete vytvořit jednoduchý síťový model s několika řádky, Python Keras vám s tím může pomoci. Podívejte se na příklad Keras níže:

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

Díky přátelskému rozhraní API můžeme snadno pochopit proces. Psaní kódu s jednoduchou funkcí a bez nutnosti nastavovat více parametrů.

Podpora velké komunity

Existuje mnoho komunit AI, které používají Keras pro svůj rámec Deep Learning. Mnoho z nich zveřejňuje své kódy i návody pro širokou veřejnost.

Mít více backendů

Jako backend s Keras si můžete vybrat Tensorflow, CNTK a Theano. Pro různé projekty si můžete vybrat jiný backend v závislosti na vašich potřebách. Každý backend má svou jedinečnou výhodu.

Víceplatformní a snadné nasazení modelu

S řadou podporovaných zařízení a platforem můžete Keras nasadit na jakékoli zařízení, jako je

  • iOS s CoreML
  • Android s Tensorflow Android,
  • Webový prohlížeč s podporou .js
  • Cloudový motor
  • Raspberry Pi

Podpora více GPU

Keras můžete trénovat na jednom GPU nebo používat více GPU najednou. Protože Keras má vestavěnou podporu pro datový paralelismus, může zpracovávat velké objemy dat a urychlit čas potřebný k jejich trénování.

Nevýhody Kerasu

Nelze zpracovat nízkoúrovňové API

Keras zpracovává pouze API na vysoké úrovni, které běží na jiném frameworku nebo backendovém enginu, jako je Tensorflow, Theano nebo CNTK. Není to tedy příliš užitečné, pokud si chcete vytvořit vlastní abstraktní vrstvu pro výzkumné účely, protože Keras již má předkonfigurované vrstvy.

Instalace Keras

V této části se podíváme na různé dostupné metody instalace Keras

Přímá instalace nebo virtuální prostředí

Který je lepší? Přímá instalace do aktuálního pythonu nebo použití virtuálního prostředí? Pokud máte mnoho projektů, doporučuji použít virtuální prostředí. Chcete vědět proč? Je to proto, že různé projekty mohou používat různé verze knihovny keras.

Mám například projekt, který potřebuje Python 3.5 pomocí OpenCV 3.3 se starším backendem Keras-Theano, ale v jiném projektu musím používat Keras s nejnovější verzí a Tensorflow jako backend s Python Podpora 3.6.6

Nechceme, aby se knihovna Keras dostala do konfliktu, že? Takže používáme virtuální prostředí k lokalizaci projektu s konkrétním typem knihovny nebo můžeme použít jinou platformu, jako je Cloud Service, aby za nás provedla naše výpočty, např. Amazon Webová služba.

Instalace Keras na Amazon Webová služba (AWS)

Amazon Web Service je platforma, která nabízí služby a produkty Cloud Computing pro výzkumné pracovníky nebo pro jakékoli jiné účely. AWS pronajímá svůj hardware, sítě, databázi atd., abychom je mohli používat přímo z internetu. Jednou z populárních služeb AWS pro účely hlubokého učení je Amazon Machine Image Deep Learning Service nebo DL

Podrobné pokyny, jak používat AWS, naleznete zde konzultace

Poznámka k AMI: K dispozici budete mít následující AMI

Instalace Keras na AWS

AWS Deep Learning AMI je virtuální prostředí v AWS EC2 Service, které pomáhá výzkumníkům nebo praktikům pracovat s Deep Learning. DLAMI nabízí od malých CPU až po vysoce výkonné multi GPU motory s předkonfigurovanými CUDA, cuDNN a přichází s řadou rámců hlubokého učení.

Pokud jej chcete používat okamžitě, měli byste si vybrat Deep Learning AMI, protože je dodáván s předinstalovanými oblíbenými frameworky pro hluboké učení.

Ale pokud chcete vyzkoušet vlastní rámec hlubokého učení pro výzkum, měli byste si nainstalovat Deep Learning Base AMI, protože přichází se základními knihovnami, jako jsou CUDA, cuDNN, ovladače GPU a další potřebné knihovny, které lze provozovat s vaším prostředím hlubokého učení.

Jak nainstalovat Keras Amazon SageMaker

Amazon SageMaker je platforma pro hluboké učení, která vám pomůže se školením a nasazením sítě hlubokého učení s nejlepším algoritmem.

Pro začátečníka je to zdaleka nejjednodušší metoda použití Kerasu. Níže je uveden postup, jak nainstalovat Keras Amazon SageMaker:

Krok 1) Otevřete Amazon SageMaker

V prvním kroku otevřete Amazon Sagemaker konzole a klikněte na Vytvořit instanci notebooku.

Nainstalujte Keras Amazon SageMaker

Krok 2) Zadejte podrobnosti

  1. Zadejte název notebooku.
  2. Vytvořte roli IAM. Vytvoří roli AMI Amazon IAM role ve formátu AmazonSageMaker-Executionrole-RRRRMMDD|HHmmSS.
  3. Nakonec zvolte Vytvořit instanci poznámkového bloku. Po několika okamžicích Amazon Sagemaker spustí instanci notebooku.

Nainstalujte Keras Amazon SageMaker

Pozor: Pokud chcete přistupovat ke zdrojům ze svého VPC, nastavte přímý přístup k internetu jako povolený. Jinak tato instance notebooku nebude mít přístup k internetu, takže nebude možné trénovat nebo hostovat modely

Krok 3) Spusťte instanci

Klepnutím na Otevřít spustíte instanci

Nainstalujte Keras Amazon SageMaker

Krok 4) Začněte kódovat

In Jupyter, Klikněte na Nový> conda_tensorflow_p36 a jste připraveni kódovat

Nainstalujte Keras Amazon SageMaker

Nainstalujte Keras v Linuxu

Abychom povolili Keras s Tensorflow jako jeho backend enginem, musíme nejprve nainstalovat Tensorflow. Spusťte tento příkaz pro instalaci tensorflow s CPU (bez GPU)

pip install --upgrade tensorflow

pokud chcete povolit podporu GPU pro tensorflow, můžete použít tento příkaz

pip install --upgrade tensorflow-gpu

Nainstalujte Keras na Linux

pojďme se přihlásit Python zda je naše instalace úspěšná zadáním

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

pokud se neobjeví žádné chybové hlášení, proces instalace je úspěšný

Nainstalujte Keras

Poté, co nainstalujeme Tensorflow, začněme instalovat keras. Zadejte tento příkaz do terminálu

pip install keras

začne instalovat Keras a také všechny jeho závislosti. Měli byste vidět něco takového:

Nainstalujte Keras

Nyní máme Keras nainstalovaný v našem systému!

Ověření

Než začneme používat Keras, měli bychom zkontrolovat, zda naše Keras používá Tensorflow jako backend otevřením konfiguračního souboru:

gedit ~/.keras/keras.json

měli byste vidět něco takového

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

jak vidíte, „backend“ používá tensorflow. To znamená, že keras používá Tensorflow jako backend, jak jsme očekávali

a nyní jej spusťte na terminálu zadáním

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

Jak nainstalovat Keras Windows

Než nainstalujeme tenzorový tok a Keras, měli bychom nainstalovat Python, pip a virtualenv. Pokud jste již tyto knihovny nainstalovali, měli byste pokračovat dalším krokem, jinak postupujte takto:

instalovat Python 3 stažením z tohoto https://trials.autocruitment.com

Nainstalujte pip spuštěním tento

Nainstalujte virtualenv pomocí tohoto příkazu

pip3 install –U pip virtualenv

instalovat Microsoft Vizuální C++ 2015 Redistribuovatelná aktualizace 3

Poté spusťte tento skript

pip3 install virtualenv

Nastavení virtuálního prostředí

To se používá k izolaci pracovního systému od hlavního systému.

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

Aktivujte prostředí

.\venv\Scripts\activate

Po přípravě prostředí zůstává instalace Tensorflow a Keras stejná jako v Linuxu. Dále v tomto tutoriálu Deep learning with Keras se seznámíme se základy Keras pro Deep learning.

Keras Základy pro hluboké učení

Hlavní strukturou v Kerasu je Model, který definuje kompletní graf sítě. Ke stávajícímu modelu můžete přidat další vrstvy a vytvořit tak vlastní model, který potřebujete pro svůj projekt.

Zde je návod, jak vytvořit sekvenční model a několik běžně používaných vrstev v hlubokém učení

1. Sekvenční model

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

model = Sequential()

2. Konvoluční vrstva

Tohle je Keras Python příklad konvoluční vrstvy jako vstupní vrstvy se vstupním tvarem 320x320x3, se 48 filtry o velikosti 3×3 a použití ReLU jako aktivační funkce.

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

jiný typ je

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

3. MaxPooling Vrstva

Pro převzorkování vstupní reprezentace použijte MaxPool2d a zadejte velikost jádra

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

4. Hustá vrstva

přidání Plně připojené vrstvy pouhým zadáním výstupní velikosti

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

5. Vrstva vynechání

Přidávání vrstvy výpadků s 50% pravděpodobností

model.add(Dropout(0.5))

Kompilace, školení a hodnocení

Poté, co definujeme náš model, začněme je trénovat. Nejprve je nutné zkompilovat síť se ztrátovou funkcí a funkcí optimalizace. To umožní síti měnit váhy a minimalizovat ztráty.

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

Nyní začněte trénovat pomocí fit, abyste do modelu vložili trénovací a ověřovací data. To vám umožní trénovat síť v dávkách a nastavovat epochy.

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

Naším posledním krokem je vyhodnocení modelu s testovacími daty.

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

Zkusme použít jednoduchou lineární regresi

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


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

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

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


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

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

predict = model.predict(data)

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

Po natrénování dat by měl výstup vypadat takto

Lineární regrese

s počáteční hmotností

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

a konečná hmotnost

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

Vylaďte předem vycvičené modely v Kerasu a jak je používat

Proč používáme Fine Tune Models a kdy je používáme

Jemné doladění je úkolem vyladit předem trénovaný model tak, aby se parametry přizpůsobily novému modelu. Když chceme trénovat od nuly na novém modelu, potřebujeme velké množství dat, aby síť našla všechny parametry. Ale v tomto případě použijeme předem trénovaný model, takže parametry jsou již naučené a mají váhu.

Pokud například chceme trénovat vlastní model Keras k vyřešení klasifikačního problému, ale máme jen malé množství dat, můžeme to vyřešit pomocí Přenos učení + Metoda jemného ladění.

Pomocí předem natrénované sítě a závaží nepotřebujeme trénovat celou síť. Potřebujeme pouze natrénovat poslední vrstvu, která se používá k řešení našeho úkolu, jak tomu říkáme metoda jemného ladění.

Příprava modelu sítě

Pro předtrénovaný model můžeme načíst různé modely, které Keras již má ve své knihovně, jako například:

  • VGG16
  • PočátekV3
  • ResNet
  • MobileNet
  • Xception
  • InceptionResNetV2

Ale v tomto procesu použijeme model sítě VGG16 a imageNet jako naši váhu pro model. Pomocí Images from vyladíme síť pro klasifikaci 8 různých typů tříd Kaggle Natural Images Dataset

Architektura modelu VGG16

Architektura modelu VGG16

zdroj

Nahrávání našich dat do AWS S3 Bucket

Pro náš tréninkový proces použijeme obrázek přírodních obrázků z 8 různých tříd, jako jsou letadla, auto, kočka, pes, květina, ovoce, motorka a člověk. Nejprve musíme nahrát svá data do Amazon Kbelík S3.

Amazon Kbelík S3

Krok 1) Po přihlášení ke svému účtu S3 si vytvořte bucket taktováním Vytvořit kbelík

Nahrávání dat do AWS S3 Bucket

Krok 2) Nyní vyberte název segmentu a svůj region podle svého účtu. Ujistěte se, že je k dispozici název segmentu. Po tomto kliknutí Vytvořit.

Nahrávání dat do AWS S3 Bucket

Krok 3) Jak vidíte, váš Bucket je připraven k použití. Ale jak vidíte, přístup není veřejný, je pro vás dobré, pokud si jej chcete ponechat pro sebe. Tento segment můžete změnit pro veřejný přístup ve vlastnostech segmentu

Nahrávání dat do AWS S3 Bucket

Krok 4) Nyní začnete nahrávat svá tréninková data do vašeho Bucketu. Zde nahraji soubor tar.gz, který se skládá z obrázků pro proces školení a testování.

Nahrávání dat do AWS S3 Bucket

Krok 5) Nyní klikněte na svůj soubor a zkopírujte jej Odkaz abychom si to mohli stáhnout.

Nahrávání dat do AWS S3 Bucket

Příprava dat

Potřebujeme generovat naše tréninková data pomocí Keras ImageDataGenerator.

Nejprve si musíte stáhnout pomocí wget s odkazem na váš soubor z S3 Bucket.

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

Po stažení dat zahájíme tréninkový proces.

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)

Obrazová dataGenerator vytvoří data X_training z adresáře. Podadresář v tomto adresáři bude použit jako třída pro každý objekt. Obrázek bude načten s barevným režimem RGB, s režimem kategorické třídy pro data Y_training, s velikostí dávky 16. Nakonec data zamíchejte.

Podívejme se na naše obrázky náhodně tak, že je vykreslíme pomocí matplotlib

x_batch, y_batch = train_generator.next()

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

Příprava dat

Poté vytvořte náš síťový model z VGG16 s předem připravenou hmotností imageNet. Tyto vrstvy zmrazíme, aby vrstvy nebyly trénovatelné, což nám pomůže zkrátit dobu výpočtu.

Vytváření našeho modelu z VGG16

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


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

print(base_model.summary())

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

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

Jak můžete vidět níže, shrnutí našeho síťového modelu. Ze vstupu z vrstev VGG16 pak přidáme 2 plně připojené vrstvy, které extrahují 1024 funkcí a výstupní vrstvu, která spočítá 8 tříd s aktivací softmax.

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

Trénink

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

výsledky

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

Trénink

Jak vidíte, naše ztráty výrazně klesly a přesnost je téměř 100%. Pro testování našeho modelu jsme náhodně vybrali obrázky přes internet a vložili je do testovací složky s jinou třídou k testování

Testování našeho modelu

model = load_model('fine_tune.h5')

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

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

filenames = test_generator.filenames
nb_samples = len(filenames)

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

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

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

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

A náš test je takový, jak je uvedeno níže! Pouze 1 obrázek je předpovězen špatně z testu 14 obrázků!

Testovací model

Neuronová síť pro rozpoznávání obličeje s Keras

Proč potřebujeme uznání

Potřebujeme Rozpoznání, aby nám usnadnilo rozpoznání nebo identifikaci obličeje osoby, typu předmětů, odhadovaného věku osoby z její tváře nebo dokonce poznali výrazy obličeje této osoby.

Neuronová síť pro rozpoznávání obličeje s Keras

Možná si uvědomujete, že pokaždé, když se pokusíte označit tvář svého přítele na fotografii, funkce na Facebooku to udělala za vás, tedy označení tváře vašeho přítele, aniž byste jej museli nejprve označit. Toto je rozpoznávání tváře, které používá Facebook, aby nám usnadnil označování přátel.

Jak to tedy funguje? Pokaždé, když označíme tvář našeho přítele, AI Facebooku se to naučí a pokusí se to předpovědět, dokud nedosáhne správného výsledku. Stejný systém, který použijeme k vytvoření vlastního rozpoznávání tváře. Začněme vytvářet vlastní rozpoznávání tváře pomocí hlubokého učení

Model sítě

Použijeme síťový model VGG16, ale s váhou VGGFace.

Architektura modelu VGG16

Model sítě

Co je VGGFace? je to Keras implementace Deep Face Recognition představená Parkhi, Omkar M. et al. "Deep Face Recognition." BMVC (2015). Framework používá jako síťovou architekturu VGG16.

VGGFace si můžete stáhnout z GitHub

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

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

Jak můžete vidět shrnutí sítě

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

uděláme a Přenos učení + Jemné ladění pro rychlejší školení s malými datovými soubory. Nejprve zmrazíme základní vrstvy, aby vrstvy nebyly trénovatelné.

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

pak přidáme vlastní vrstvu, abychom rozpoznali naše testovací tváře. Přidáme 2 plně propojené vrstvy a výstupní vrstvu s 5 lidmi k detekci.

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)

Podívejme se na přehled naší sítě

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

Jak můžete vidět výše, po vrstvě pool5 bude sloučena do jediného vektoru prvků, který použije hustá vrstva pro konečné rozpoznání.

Příprava našich tváří

Nyní si připravíme obličeje. Vytvořil jsem adresář složený z 5 slavných lidí

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

Každá složka obsahuje 10 obrázků pro každý proces školení a hodnocení. Je to velmi malé množství dat, ale to je výzva, ne?

K přípravě dat nám pomůže nástroj Keras. Tato funkce bude iterovat ve složce datové sady a poté ji připravit tak, aby ji bylo možné použít při školení.

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

Školení našeho modelu

Začněme náš tréninkový proces sestavením naší sítě s funkcí ztráty a optimalizátorem. Zde používáme sparse_categorical_crossentropy jako naši ztrátovou funkci s pomocí SGD jako našeho optimalizátoru učení.

from keras.optimizers import SGD

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

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

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

Jak můžete vidět, naše přesnost ověření je až 64 %, což je dobrý výsledek pro malé množství tréninkových dat. Můžeme to zlepšit přidáním další vrstvy nebo přidáním více tréninkových obrázků, aby se náš model mohl dozvědět více o tvářích a dosáhnout větší přesnosti.

Pojďme otestovat náš model testovacím obrázkem

Testovací obrázek

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

pomocí obrázku Roberta Downeyho Jr. jako našeho testovacího obrázku ukazuje, že předpovídaná tvář je pravdivá!

Predikce pomocí Live Cam!

Co kdybychom otestovali naši dovednost s implementací pomocí vstupu z webové kamery? Pomocí OpenCV s kaskádou Haar Face k nalezení naší tváře a pomocí našeho síťového modelu dokážeme rozpoznat osobu.

Prvním krokem je připravit tváře vás a vašeho přítele. Čím více dat máme, tím lepší je výsledek!

Připravte a trénujte svou síť jako v předchozím kroku, po dokončení školení přidejte tento řádek, abyste získali vstupní obraz z kamery

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

image_size = 224
device_id = 0 #camera_device id 

model = load_model('my faces.h5')

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

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

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

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

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

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

camera.release()
cv2.destroyAllWindows()

Který je lepší? Keras nebo Tensorflow

Keras nabízí jednoduchost při psaní scénáře. Můžeme začít psát a rozumět přímo s Kerasem, protože to není tak těžké pochopit. Je uživatelsky přívětivější a snadno se implementuje, není třeba vytvářet mnoho proměnných pro spuštění modelu. Takže nemusíme rozumět každému detailu v backendovém procesu.

Na druhou stranu, Tensorflow jsou operace na nízké úrovni, které nabízejí flexibilitu a pokročilé operace, pokud chcete vytvořit libovolný výpočetní graf nebo model. Tensorflow také dokáže vizualizovat proces pomocí TensorBoard a specializovaný debugger nástroj.

Pokud tedy chcete začít pracovat s hlubokým učením s ne tak velkou složitostí, použijte Keras. Protože Keras nabízí jednoduchost a uživatelsky přívětivé použití a snadnou implementaci než Tensorflow. Ale pokud chcete napsat svůj vlastní algoritmus v projektu hlubokého učení nebo výzkumu, měli byste místo toho použít Tensorflow.

Shrnutí

Pojďme si tedy shrnout vše, co jsme probrali a udělali v tomto tutoriálu.

  • Keras v API na vysoké úrovni, které se používá k usnadnění sítí hlubokého učení pomocí backendového enginu.
  • Keras se snadno používá a rozumí s podporou pythonu, takže působí přirozeněji než kdy jindy. Je to dobré pro začátečníky, kteří se chtějí dozvědět o hlubokém učení, a pro výzkumníky, kteří chtějí snadno použitelné API.
  • Proces instalace je snadný a můžete použít virtuální prostředí nebo pomocí externí platformy jako je např AWS.
  • Keras také přichází s různými druhy síťových modelů, takže nám usnadňuje použití dostupného modelu pro předtrénování a dolaďování vlastního síťového modelu.
  • Existuje také mnoho návodů a článků o používání Keras od komunit po celém světě pro účely hlubokého učení.