Tutorial Keras
Ce este Keras?
Keras este o bibliotecฤ Open Source Neural Network scrisฤ รฎn Python care ruleazฤ deasupra Theano sau Tensorflow. Este conceput pentru a fi modular, rapid ศi uศor de utilizat. A fost dezvoltat de Franรงois Chollet, un inginer Google. Keras nu se ocupฤ de calculul de nivel scฤzut. รn schimb, foloseศte o altฤ bibliotecฤ pentru a face acest lucru, numitฤ โBackend.
Keras este un pachet API de nivel รฎnalt pentru API-ul de nivel scฤzut, capabil sฤ ruleze pe TensorFlow, CNTK sau Theano. Keras High-Level API gestioneazฤ modul รฎn care realizฤm modele, definim straturi sau setฤm mai multe modele de intrare-ieศire. La acest nivel, Keras alcฤtuieศte ศi modelul nostru cu funcศii de pierdere ศi optimizare, proces de antrenament cu funcศie de fit. Keras รฎn Python nu se ocupฤ de API de nivel scฤzut, cum ar fi realizarea graficului de calcul, realizarea de tensori sau alte variabile, deoarece a fost gestionatฤ de motorul โbackendโ.
Ce este un backend?
Backend este un termen รฎn Keras care efectueazฤ toate calculele de nivel scฤzut, cum ar fi produsele tensor, convoluศiile ศi multe alte lucruri, cu ajutorul altor biblioteci, cum ar fi Tensorflow sau Theano. Deci, โmotorul backendโ va efectua calculul ศi dezvoltarea modelelor. Tensorflow este โmotorul de backendโ implicit, dar รฎl putem schimba รฎn configuraศie.
Theano, Tensorflow ศi CNTK Backend
Theano este un proiect open source care a fost dezvoltat de grupul MILA de la Universitatea din Montreal, Quebec, Canada. A fost primul cadru utilizat pe scarฤ largฤ. Este o Python bibliotecฤ care ajutฤ รฎn tablourile multidimensionale pentru operaศii matematice folosind Numpy sau Scipy. Theano poate folosi GPU-uri pentru calcule mai rapide, de asemenea, poate construi automat grafice simbolice pentru calcularea gradienศilor. Pe site-ul sฤu, Theano susศine cฤ poate recunoaศte expresii instabile numeric ศi le poate calcula cu algoritmi mai stabili, acest lucru este foarte util pentru expresiile noastre instabile.
Pe de altฤ parte, Tensorflow este steaua รฎn ascensiune รฎn cadrul de deep learning. Dezvoltat de echipa Google Brain, este cel mai popular instrument de รฎnvฤศare profundฤ. Cu o mulศime de caracteristici, iar cercetฤtorii contribuie la dezvoltarea acestui cadru รฎn scopuri de รฎnvฤศare profundฤ.
Un alt motor de backend pentru Keras este The Microsoft Setul de instrumente cognitive sau CNTK. Este un cadru de รฎnvฤศare profundฤ open-source care a fost dezvoltat de Microsoft Echipฤ. Poate rula pe mai multe GPU-uri sau pe mai multe maศini pentru antrenamentul modelului de รฎnvฤศare profundฤ la scarฤ masivฤ. รn unele cazuri, CNTK a fost raportat mai rapid decรขt alte cadre precum Tensorflow sau Theano. รn continuare, รฎn acest tutorial Keras CNN, vom compara backend-urile Theano, TensorFlow ศi CNTK.
Compararea backend-urilor
Trebuie sฤ facem un benchmark pentru a cunoaศte comparaศia dintre aceste douฤ backend-uri. Dupฤ cum puteศi vedea รฎn Reperul lui Jeong-Yoon Lee, se comparฤ performanศa a 3 backend-uri diferite pe hardware diferit. ศi rezultatul este cฤ Theano este mai lent decรขt celฤlalt backend, se spune 50 ori mai lent, dar precizia este aproape una de alta.
O alta test de referinศฤ este realizat de Jasmeet Bhatia. El a raportat cฤ Theano este mai lent decรขt Tensorflow pentru unele teste. Dar precizia generalฤ este aproape aceeaศi pentru fiecare reศea care a fost testatฤ.
Deci, รฎntre Theano, Tensorflow ศi CTK este evident cฤ TensorFlow este mai bun decรขt Theano. Cu TensorFlow, timpul de calcul este mult mai scurt, iar CNN este mai bun decรขt celelalte.
Urmฤtorul รฎn acest Keras Python tutorial, vom afla despre diferenศa dintre Keras ศi TensorFlow (Keras vs Tensorflow).
Keras vs Tensorflow
| parametrii | Keras | flux tensor |
|---|---|---|
| Tip | Wrapper API de nivel รฎnalt | API de nivel scฤzut |
| Complexitate | Uศor de utilizat dacฤ dvs Python limbฤ | Trebuie sฤ รฎnvฤศaศi sintaxa utilizฤrii uneia dintre funcศiile Tensorflow |
| Scop | Implementare rapidฤ pentru realizarea modelelor cu straturi standard | Vฤ permite sฤ realizaศi un grafic de calcul arbitrar sau straturi de model |
| Instrumente | Utilizeazฤ alt instrument de depanare API, cum ar fi TFDBG | Puteศi utiliza instrumentele de vizualizare Tensorboard |
| Comunitate | Comunitฤศi mari active | Comunitฤศi mari active ศi resurse partajate pe scarฤ largฤ |
Avantajele Keras
Implementare rapidฤ ศi uศor de รฎnศeles
Keras este foarte rapid sฤ realizeze un model de reศea. Dacฤ doriศi sฤ faceศi un model de reศea simplu cu cรขteva linii, Python Keras te poate ajuta cu asta. Uitฤ-te la exemplul Keras de mai jos:
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'))
Datoritฤ API-ului prietenos, putem รฎnศelege cu uศurinศฤ procesul. Scrierea codului cu o funcศie simplฤ ศi nu este nevoie sฤ setaศi mai mulศi parametri.
Sprijin comunitar mare
Existฤ o mulศime de comunitฤศi AI care folosesc Keras pentru cadrul lor de Deep Learning. Mulศi dintre ei รฎศi publicฤ codurile ศi tutorialele pentru publicul larg.
Aveศi mai multe backend-uri
Puteศi alege Tensorflow, CNTK ศi Theano ca backend cu Keras. Puteศi alege un backend diferit pentru diferite proiecte, รฎn funcศie de nevoile dvs. Fiecare backend are propriul sฤu avantaj unic.
Implementare multi-platformฤ ศi uศoarฤ a modelului
Cu o varietate de dispozitive ศi platforme acceptate, puteศi implementa Keras pe orice dispozitiv
- iOS cu CoreML
- Android cu Tensorflow Android,
- Browser web cu suport .js
- Motor cloud
- Raspberry Pi
Suport pentru mai multe GPU
Puteศi antrena Keras pe un singur GPU sau puteศi utiliza mai multe GPU-uri simultan. Deoarece Keras are un suport รฎncorporat pentru paralelismul datelor, astfel รฎncรขt sฤ poatฤ procesa volume mari de date ศi sฤ accelereze timpul necesar antrenฤrii acestora.
Dezavantajele Keras
Nu se poate gestiona API-ul de nivel scฤzut
Keras se ocupฤ doar de API-uri de nivel รฎnalt care ruleazฤ pe alt framework sau motor de backend, cum ar fi Tensorflow, Theano sau CNTK. Deci nu este foarte util dacฤ doriศi sฤ vฤ faceศi propriul strat abstract รฎn scopuri de cercetare, deoarece Keras are deja straturi preconfigurate.
Instalarea Keras
รn aceastฤ secศiune, vom analiza diferite metode disponibile pentru a instala Keras
Instalare directฤ sau Mediu virtual
Care este mai bun? Instalare directฤ pe python-ul actual sau folosirea unui mediu virtual? Vฤ sugerez sฤ folosiศi un mediu virtual dacฤ aveศi multe proiecte. Vrei sฤ ศtii de ce? Acest lucru se datoreazฤ faptului cฤ diferite proiecte pot utiliza o versiune diferitฤ a unei biblioteci keras.
De exemplu, am un proiect care are nevoie Python 3.5 folosind OpenCV 3.3 cu backend mai vechi Keras-Theano, dar รฎn celฤlalt proiect trebuie sฤ folosesc Keras cu cea mai recentฤ versiune ศi un Tensorflow ca backend cu Python Suport 3.6.6
Nu vrem ca biblioteca Keras sฤ intre รฎn conflict una cu cealaltฤ, nu? Aศadar, folosim un mediu virtual pentru a localiza proiectul cu un anumit tip de bibliotecฤ sau putem folosi o altฤ platformฤ, cum ar fi Cloud Service, pentru a ne face calculele pentru noi, cum ar fi Amazon Serviciu web.
Instalarea Keras pe Amazon Serviciu web (AWS)
Amazon Serviciul Web este o platformฤ care oferฤ servicii ศi produse Cloud Computing pentru cercetฤtori sau orice alte scopuri. AWS รฎศi รฎnchiriazฤ hardware-ul, reศelele, baza de date etc., astfel รฎncรขt sฤ le putem folosi direct de pe internet. Unul dintre serviciile AWS populare pentru scopul รฎnvฤศฤrii profunde este Amazon Machine Image Deep Learning Service sau DL
Pentru instrucศiuni detaliate despre cum sฤ utilizaศi AWS, consultaศi aceasta tutorial
Notฤ despre AMI: veศi avea disponibil urmฤtorul AMI
AWS Deep Learning AMI este un mediu virtual din AWS EC2 Service care ajutฤ cercetฤtorii sau practicienii sฤ lucreze cu Deep Learning. DLAMI oferฤ de la motoare cu procesoare mici pรขnฤ la motoare cu mai multe GPU-uri de mare putere cu CUDA, cuDNN preconfigurate ศi vine cu o varietate de cadre de รฎnvฤศare profundฤ.
Dacฤ doriศi sฤ รฎl utilizaศi instantaneu, ar trebui sฤ alegeศi Deep Learning AMI deoarece vine preinstalat cu cadre populare de รฎnvฤศare profundฤ.
Dar dacฤ doriศi sฤ รฎncercaศi un cadru de deep learning personalizat pentru cercetare, ar trebui sฤ instalaศi Deep Learning Base AMI, deoarece vine cu biblioteci fundamentale, cum ar fi CUDA, cuDNN, drivere GPU ศi alte biblioteci necesare pentru a rula cu mediul dvs. de deep learning.
Cum se instaleazฤ Keras pe Amazon SageMaker
Amazon SageMaker este o platformฤ de รฎnvฤศare profundฤ care vฤ ajutฤ sฤ antrenaศi ศi sฤ implementaศi reศeaua de รฎnvฤศare profundฤ cu cel mai bun algoritm.
Ca รฎncepฤtor, aceasta este de departe cea mai uศoarฤ metodฤ de a folosi Keras. Mai jos este un proces despre cum sฤ instalaศi Keras Amazon SageMaker:
Pasul 1) Deschideศi Amazon SageMaker
รn primul pas, deschideศi Amazon Sagemaker console ศi faceศi clic pe Creare instanศฤ de notebook.
Pasul 2) Introduceศi detaliile
- Introduceศi numele blocnotesului dvs.
- Creaศi un rol IAM. Va crea un rol AMI Amazon Rolul IAM รฎn formatul de AmazonSageMaker-Executionrole-AAAAMMZZ|HHmmSS.
- รn cele din urmฤ, alegeศi Creare instanศฤ de blocnotes. Dupฤ cรขteva clipe, Amazon Sagemaker lanseazฤ o instanศฤ de notebook.
notiศe: Dacฤ doriศi sฤ accesaศi resurse de la VPC-ul dvs., setaศi accesul direct la internet ca fiind activat. รn caz contrar, aceastฤ instanศฤ de notebook nu va avea acces la internet, aศa cฤ este imposibil sฤ antrenezi sau sฤ gฤzduieศti modele
Pasul 3) Lansaศi instanศa
Faceศi clic pe Deschidere pentru a lansa instanศa
Pasul 4) รncepeศi codarea
In Jupyter, Faceศi clic pe New> conda_tensorflow_p36 ศi sunteศi gata sฤ codificaศi
Instalaศi Keras รฎn Linux
Pentru a activa Keras cu Tensorflow ca motor backend, trebuie sฤ instalฤm mai รฎntรขi Tensorflow. Rulaศi aceastฤ comandฤ pentru a instala tensorflow cu CPU (fฤrฤ GPU)
pip install --upgrade tensorflow
dacฤ doriศi sฤ activaศi suportul GPU pentru tensorflow, puteศi utiliza aceastฤ comandฤ
pip install --upgrade tensorflow-gpu
hai sa ne verificam Python pentru a vedea dacฤ instalarea noastrฤ a reuศit tastรขnd
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 >>>
dacฤ nu existฤ niciun mesaj de eroare, procesul de instalare este reuศit
Instalaศi Keras
Dupฤ ce instalฤm Tensorflow, sฤ รฎncepem sฤ instalฤm keras. Tastaศi aceastฤ comandฤ รฎn terminal
pip install keras
va รฎncepe sฤ instaleze Keras ศi, de asemenea, toate dependenศele sale. Ar trebui sฤ vedeศi ceva de genul acesta:
Acum avem Keras instalat รฎn sistemul nostru!
verificarea
รnainte de a รฎncepe sฤ folosim Keras, ar trebui sฤ verificฤm dacฤ Keras-ul nostru foloseศte Tensorflow ca backend prin deschiderea fiศierului de configurare:
gedit ~/.keras/keras.json
ar trebui sa vezi asa ceva
{
"floatx": "float32",
"epsilon": 1e-07,
"backend": "tensorflow",
"image_data_format": "channels_last"
}
dupฤ cum puteศi vedea, โbackend-ulโ foloseศte tensorflow. รnseamnฤ cฤ Keras utilizeazฤ Tensorflow ca backend aศa cum ne aศteptam
ศi acum rulaศi-l pe terminal tastรขnd
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. >>>
Cum se instaleazฤ Keras pe Windows
รnainte de a instala flux tensor ศi Keras, ar trebui sฤ instalฤm Python, pip ศi virtualenv. Dacฤ aศi instalat deja aceste biblioteci, ar trebui sฤ continuaศi cu pasul urmฤtor, altfel procedaศi astfel:
Instalare Python 3 prin descฤrcarea de pe aceasta legฤturฤ
Instalaศi pip rulรขnd acest
Instalaศi virtualenv cu aceastฤ comandฤ
pip3 install โU pip virtualenv
Instalare Microsoft Vizual C++ Actualizarea redistribuibilฤ din 2015 3
- Accesaศi site-ul de descฤrcare Visual Studio https://www.microsoft.com/en-us/download/details.aspx?id=53587
- Selectaศi Redistributables ศi Build Tools
- Descฤrcaศi ศi instalaศi Microsoft Vizual C++ Actualizarea redistribuibilฤ din 2015 3
Apoi rulaศi acest script
pip3 install virtualenv
Configuraศi mediul virtual
Acesta este folosit pentru a izola sistemul de lucru cu sistemul principal.
virtualenv โ-system-site-packages โp python3 ./venv
Activaศi mediul
.\venv\Scripts\activate
Dupฤ pregฤtirea mediului, instalarea Tensorflow ศi Keras rฤmรขne aceeaศi ca Linux. รn continuare, รฎn acest tutorial Deep learning with Keras, vom afla despre elementele fundamentale Keras pentru Deep learning.
Fundamentele Keras pentru รฎnvฤศarea profundฤ
Structura principalฤ din Keras este Modelul care defineศte graficul complet al unei reศele. Puteศi adฤuga mai multe straturi la un model existent pentru a construi un model personalizat de care aveศi nevoie pentru proiectul dvs.
Iatฤ cum sฤ creaศi un model secvenลฃial ศi cรขteva straturi utilizate รฎn mod obiศnuit รฎn deep learning
1. Model secvenลฃial
from keras.models import Sequential from keras.layers import Dense, Activation,Conv2D,MaxPooling2D,Flatten,Dropout model = Sequential()
2. Stratul convoluศional
Acesta este un Keras Python exemplu de strat convoluศional ca strat de intrare cu forma de intrare de 320x320x3, cu 48 de filtre de dimensiune 3ร3 ศi foloseศte ReLU ca funcศie de activare.
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))
alt tip este
model.add(Conv2D(48, (3, 3), activation='relu'))
3.MaxPooling Strat
Pentru a reduce eศantionarea reprezentฤrii de intrare, utilizaศi MaxPool2d ศi specificaศi dimensiunea nucleului
model.add(MaxPooling2D(pool_size=(2, 2)))
4. Strat dens
adฤugarea unui strat complet conectat cu doar specificarea dimensiunii de ieศire
model.add(Dense(256, activation='relu'))
5. Stratul de abandon
Adฤugarea unui strat de abandon cu 50% probabilitate
model.add(Dropout(0.5))
Compilarea, instruirea ศi evaluarea
Dupฤ ce ne definim modelul, sฤ รฎncepem sฤ-i antrenฤm. Este necesar sฤ compilaศi mai รฎntรขi reศeaua cu funcศia de pierdere ศi funcศia de optimizare. Acest lucru va permite reศelei sฤ schimbe greutฤศile ศi sฤ minimizeze pierderea.
model.compile(loss='mean_squared_error', optimizer='adam')
Acum, pentru a รฎncepe antrenamentul, utilizaศi fit pentru a furniza datele de antrenament ศi validare la model. Acest lucru vฤ va permite sฤ antrenaศi reศeaua รฎn loturi ศi sฤ setaศi epocile.
model.fit(X_train, X_train, batch_size=32, epochs=10, validation_data=(x_val, y_val))
Pasul nostru final este sฤ evaluฤm modelul cu datele de testare.
score = model.evaluate(x_test, y_test, batch_size=32)
Sฤ รฎncercฤm sฤ folosim regresia liniarฤ simplฤ
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()
Dupฤ antrenamentul datelor, rezultatul ar trebui sฤ arate astfel
cu greutatea initiala
Linear regression model is initialized with weights w: 0.37, b: 0.00
si greutatea finala
Linear regression model is trained to have weight w: 3.70, b: 0.61
Ajustaศi modelele pre-antrenate รฎn Keras ศi cum sฤ le utilizaศi
De ce folosim Fine Tune Models ศi cรขnd le folosim
Reglarea finฤ este o sarcinฤ de a modifica un model pre-antrenat, astfel รฎncรขt parametrii sฤ se adapteze la noul model. Cรขnd vrem sฤ ne antrenฤm de la zero pe un model nou, avem nevoie de o cantitate mare de date, astfel รฎncรขt reศeaua sฤ poatฤ gฤsi toศi parametrii. Dar รฎn acest caz, vom folosi un model pre-antrenat, astfel รฎncรขt parametrii sunt deja รฎnvฤศaศi ศi au o greutate.
De exemplu, dacฤ dorim sฤ ne antrenฤm propriul model Keras pentru a rezolva o problemฤ de clasificare, dar avem doar o cantitate micฤ de date, atunci putem rezolva acest lucru folosind o Transferul รฎnvฤศฤrii + Metoda de reglare finฤ.
Folosind o reศea pre-antrenatฤ ศi greutฤศi, nu trebuie sฤ antrenฤm รฎntreaga reศea. Trebuie doar sฤ antrenฤm ultimul strat care este folosit pentru a ne rezolva sarcina, aศa cum o numim metoda de reglare finฤ.
Pregฤtirea modelului de reศea
Pentru modelul pre-antrenat, putem รฎncฤrca o varietate de modele pe care Keras le are deja รฎn biblioteca sa, cum ar fi:
- VGG16
- InceptionV3
- ResNet
- MobileNet
- Xception
- InceptionResNetV2
Dar รฎn acest proces, vom folosi modelul de reศea VGG16 ศi imageNet ca greutate pentru model. Vom ajusta o reศea pentru a clasifica 8 tipuri diferite de clase folosind Imagini din Kaggle Natural Images Dataset
Arhitectura modelului VGG16
รncฤrcarea datelor noastre รฎn AWS S3 Bucket
Pentru procesul nostru de antrenament, vom folosi o imagine cu imagini naturale din 8 clase diferite, cum ar fi avioane, maศinฤ, pisicฤ, cรขine, floare, fructe, motocicletฤ ศi persoanฤ. รn primul rรขnd, trebuie sฤ ne รฎncฤrcฤm datele รฎn Amazon Gฤleatฤ S3.
Amazon Gฤleatฤ S3
Pas 1) Dupฤ ce v-aศi conectat la contul dvs. S3, sฤ creฤm o gฤleatฤ prin ceas Creaศi o gฤleatฤ
Pas 2) Acum alegeศi un nume de grup ศi regiunea dvs. รฎn funcศie de contul dvs. Asiguraศi-vฤ cฤ numele compartimentului este disponibil. Dupฤ acel clic Crea.
Pas 3) Dupฤ cum puteศi vedea, Bucket-ul dvs. este gata de utilizare. Dar, dupฤ cum puteศi vedea, Accesul nu este public, este bine pentru dvs. dacฤ doriศi sฤ รฎl pฤstraศi privat pentru dvs. Puteศi schimba acest compartiment pentru acces public รฎn Proprietฤศi compartiment
Pas 4) Acum รฎncepeศi sฤ รฎncฤrcaศi datele de antrenament รฎn Bucket. Aici voi รฎncฤrca fiศierul tar.gz care constฤ รฎn imagini pentru procesul de instruire ศi testare.
Pas 5) Acum faceศi clic pe fiศierul dvs. ศi copiaศi Link ca sฤ-l putem descฤrca.
Pregฤtirea datelor
Trebuie sฤ generฤm datele noastre de antrenament folosind Keras ImageDataGenerator.
Mai รฎntรขi trebuie sฤ descฤrcaศi folosind wget cu linkul cฤtre fiศierul dvs. din S3 Bucket.
!wget https://s3.us-east-2.amazonaws.com/naturalimages02/images.tar.gz !tar -xzf images.tar.gz
Dupฤ ce descฤrcaศi datele, sฤ รฎncepem Procesul de Formare.
from keras.preprocessing.image import ImageDataGenerator
import numpy as np
import matplotlib.pyplot as plt
train_path = 'images/train/'
test_path = 'images/test/'
batch_size = 16
image_size = 224
num_class = 8
train_datagen = ImageDataGenerator(validation_split=0.3,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
train_generator = train_datagen.flow_from_directory(
directory=train_path,
target_size=(image_size,image_size),
batch_size=batch_size,
class_mode='categorical',
color_mode='rgb',
shuffle=True)
ImageDataGenerator va face un X_training date dintr-un director. Subdirectorul din acel director va fi folosit ca o clasฤ pentru fiecare obiect. Imaginea va fi รฎncฤrcatฤ cu modul de culoare RGB, cu modul de clasฤ categorialฤ pentru datele Y_training, cu o dimensiune a lotului de 16. รn cele din urmฤ, amestecaศi datele.
Sฤ vedem imaginile noastre aleatoriu prin trasarea lor cu 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()
Dupฤ aceea, sฤ creฤm modelul nostru de reศea din VGG16 cu greutatea pre-antrenatฤ imageNet. Vom รฎngheศa aceste straturi, astfel รฎncรขt straturile sฤ nu poatฤ fi antrenate pentru a ne ajuta sฤ reducem timpul de calcul.
Crearea modelului nostru din 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())
Dupฤ cum puteศi vedea mai jos, rezumatul modelului nostru de reศea. Dintr-o intrare de la Straturi VGG16, apoi adฤugฤm 2 Straturi Fully Connected care vor extrage 1024 de caracteristici ศi un strat de ieศire care va calcula cele 8 clase cu activarea 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
Pregฤtire
# # 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()
REZULTATE
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
Dupฤ cum puteศi vedea, pierderile noastre sunt reduse semnificativ, iar acurateศea este de aproape 100%. Pentru a testa modelul nostru, am ales aleatoriu imagini de pe internet ศi le-am pus รฎn folderul de testare cu o clasฤ diferitฤ de testat
Testarea modelului nostru
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()
ศi testul nostru este aศa cum este prezentat mai jos! Doar 1 imagine este prezisฤ greศit dintr-un test de 14 imagini!
Reศea neuronalฤ de recunoaศtere a feศei cu Keras
De ce avem nevoie de recunoaศtere
Avem nevoie de Recunoaศtere pentru a ne face mai uศor sฤ recunoaศtem sau sฤ identificฤm faศa unei persoane, tipul de obiecte, vรขrsta estimatฤ a unei persoane de pe faศa sa sau chiar sฤ cunoaศtem expresiile faciale ale acelei persoane.
Poate รฎศi dai seama de fiecare datฤ cรขnd รฎncerci sฤ marchezi chipul prietenului tฤu รฎntr-o fotografie, funcศia din Facebook a fฤcut-o pentru tine, adicฤ marcheazฤ faศa prietenului tฤu fฤrฤ sฤ fii nevoie sฤ-l marchezi mai รฎntรขi. Aceasta este recunoaศterea facialฤ aplicatฤ de Facebook pentru a ne facilita etichetarea prietenilor.
Deci cum funcศioneazฤ? De fiecare datฤ cรขnd marchem chipul prietenului nostru, AI-ul Facebook รฎl va รฎnvฤศa ศi va รฎncerca sฤ o prezicฤ pรขnฤ cรขnd va obศine rezultatul corect. Acelaศi sistem pe care รฎl vom folosi pentru a face propria noastrฤ recunoaศtere a feศei. Sฤ รฎncepem sฤ facem propria noastrฤ recunoaศtere a feศei folosind Deep Learning
Model de reศea
Vom folosi un model de reศea VGG16, dar cu greutatea VGGFace.
Arhitectura modelului VGG16
Ce este VGGFace? este implementarea Keras a Deep Face Recognition introdusฤ de Parkhi, Omkar M. et al. โRecunoaศtere profundฤ a feศeiโ. BMVC (2015). Cadrul foloseศte VGG16 ca arhitecturฤ de reศea.
Puteศi descฤrca VGGFace de la 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()
Dupฤ cum puteศi vedea rezumatul reศelei
_________________________________________________________________ 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):
vom face o Transferul รฎnvฤศฤrii + Reglare finฤ pentru a accelera antrenamentul cu seturi de date mici. รn primul rรขnd, vom รฎngheศa straturile de bazฤ, astfel รฎncรขt straturile sฤ nu poatฤ fi antrenate.
for layer in face_model.layers:
layer.trainable = False
apoi adฤugฤm propriul strat pentru a ne recunoaศte feศele de testare. Vom adฤuga 2 straturi complet conectate ศi un strat de ieศire cu 5 persoane de detectat.
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)
Sฤ vedem rezumatul reศelei noastre
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
Dupฤ cum puteศi vedea mai sus, dupฤ stratul pool5, acesta va fi aplatizat รฎntr-un singur vector caracteristic care va fi folosit de stratul dens pentru recunoaศterea finalฤ.
Ne pregฤtim feศele
Acum sฤ ne pregฤtim feศele. Am fฤcut un director format din 5 oameni celebri
- Jack Ma
- Jason Statham
- Johnny Depp
- Robert Downey Jr.
- Rowan Atkinson
Fiecare folder conศine 10 imagini, pentru fiecare proces de instruire ศi evaluare. Este o cantitate foarte micฤ de date, dar aceasta este provocarea, nu?
Vom folosi ajutorul instrumentului Keras pentru a ne ajuta sฤ pregฤtim datele. Aceastฤ funcศie va repeta รฎn folderul setului de date ศi apoi o va pregฤti astfel รฎncรขt sฤ poatฤ fi utilizatฤ รฎn antrenament.
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,
)
Pregฤtirea modelului nostru
Sฤ รฎncepem procesul de instruire prin compilarea reศelei noastre cu funcศia de pierdere ศi optimizator. Aici, folosim sparse_categorical_crossentropy ca funcศie de pierdere, cu ajutorul SGD ca optimizator de รฎnvฤศare.
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
Dupฤ cum puteศi vedea, precizia noastrฤ de validare este de pรขnฤ la 64%, acesta este un rezultat bun pentru o cantitate micฤ de date de antrenament. Putem รฎmbunฤtฤศi acest lucru adฤugรขnd mai multe straturi sau adฤugรขnd mai multe imagini de antrenament, astfel รฎncรขt modelul nostru sฤ poatฤ afla mai multe despre feศe ศi sฤ obศinฤ mai multฤ acurateศe.
Sฤ testฤm modelul nostru cu o imagine de test
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']
folosind imaginea lui Robert Downey Jr. ca imagine de test, aratฤ cฤ chipul prezis este adevฤrat!
Prognoza folosind Live Cam!
Ce zici dacฤ ne testฤm abilitฤศile cu implementarea acesteia cu o intrare de la o camerฤ web? Folosind OpenCV cu cascada Haar Face pentru a ne gฤsi faศa ศi cu ajutorul modelului nostru de reศea, putem recunoaศte persoana.
Primul pas este sฤ vฤ pregฤtiศi feศele dvs. ศi ale prietenului dvs. Cu cรขt avem mai multe date, cu atรขt rezultatul este mai bun!
Pregฤtiศi-vฤ ศi antrenaศi-vฤ reศeaua ca la pasul anterior, dupฤ finalizarea antrenamentului, adฤugaศi aceastฤ linie pentru a obศine imaginea de intrare de la camerฤ
#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()
Care este mai bun? Keras sau Tensorflow
Keras oferฤ simplitate atunci cรขnd scrieศi scenariul. Putem รฎncepe sฤ scriem ศi sฤ รฎnศelegem direct cu Keras, deoarece nu este prea greu de รฎnศeles. Este mai uศor de utilizat ศi mai uศor de implementat, nu este nevoie sฤ faceศi multe variabile pentru a rula modelul. Deci, nu trebuie sฤ รฎnศelegem fiecare detaliu din procesul de backend.
Pe de altฤ parte, Tensorflow este operaศiunile de nivel scฤzut care oferฤ flexibilitate ศi operaศii avansate dacฤ doriศi sฤ realizaศi un grafic sau un model de calcul arbitrar. De asemenea, Tensorflow poate vizualiza procesul cu ajutorul TensorBoard ศi un instrument specializat de depanare.
Aศadar, dacฤ doriศi sฤ รฎncepeศi sฤ lucraศi cu รฎnvฤศarea profundฤ fฤrฤ atรขt de multฤ complexitate, utilizaศi Keras. Pentru cฤ Keras oferฤ simplitate ศi uศor de utilizat ศi uศor de implementat decรขt Tensorflow. Dar dacฤ doriศi sฤ scrieศi propriul algoritm รฎntr-un proiect de รฎnvฤศare profundฤ sau รฎn cercetare, ar trebui sฤ utilizaศi Tensorflow.
Rezumat
Deci, haideศi sฤ rezumam tot ce am discutat ศi fฤcut รฎn acest tutorial.
- Keras รฎntr-un API de nivel รฎnalt care este folosit pentru a face reศelele de รฎnvฤศare profundฤ mai uศoare cu ajutorul motorului backend.
- Keras este uศor de utilizat ศi de รฎnศeles cu suportul python, astfel รฎncรขt sฤ se simtฤ mai natural ca niciodatฤ. Este bun pentru รฎncepฤtorii care doresc sฤ รฎnveศe despre deep learning ศi pentru cercetฤtorii care doresc API uศor de utilizat.
- Procesul de instalare este uศor ศi puteศi utiliza un mediu virtual sau folosind o platformฤ externฤ, cum ar fi AWS.
- Keras vine, de asemenea, cu diverse tipuri de modele de reศea, astfel รฎncรขt ne face mai uศor sฤ folosim modelul disponibil pentru pregฤtirea prealabilฤ ศi reglarea finฤ a modelului nostru de reศea.
- De asemenea, existฤ o mulศime de tutoriale ศi articole despre utilizarea codurilor Keras din comunitฤศile din รฎntreaga lume รฎn scopuri de รฎnvฤศare profundฤ.























