Tutoriel Keras
Quโest-ce que Keras ?
Keras est une bibliothรจque de rรฉseau neuronal Open Source รฉcrite en Python qui s'exรฉcute sur Theano ou Tensorflow. Il est conรงu pour รชtre modulaire, rapide et facile ร utiliser. Il a รฉtรฉ dรฉveloppรฉ par Franรงois Chollet, ingรฉnieur chez Google. Keras ne gรจre pas les calculs de bas niveau. Au lieu de cela, il utilise une autre bibliothรจque pour le faire, appelรฉe ยซ Backend.
Keras est un wrapper d'API de haut niveau pour l'API de bas niveau, capable de s'exรฉcuter sur TensorFlow, CNTK ou Theano. L'API Keras de haut niveau gรจre la faรงon dont nous crรฉons des modรจles, dรฉfinissons des couches ou configurons plusieurs modรจles d'entrรฉe-sortie. ร ce niveau, Keras compile รฉgalement notre modรจle avec des fonctions de perte et d'optimisation, un processus de formation avec une fonction d'ajustement. Kรฉras dans Python ne gรจre pas les API de bas niveau telles que la crรฉation du graphe de calcul, la crรฉation de tenseurs ou d'autres variables, car elles ont รฉtรฉ gรฉrรฉes par le moteur ยซ backend ยป.
Quโest-ce quโun back-end ?
Backend est un terme en Keras qui effectue tous les calculs de bas niveau tels que les produits tensoriels, les convolutions et bien d'autres choses ร l'aide d'autres bibliothรจques telles que Tensorflow ou Theano. Ainsi, le ยซ moteur backend ยป effectuera le calcul et le dรฉveloppement des modรจles. Tensorflow est le ยซ moteur backend ยป par dรฉfaut mais nous pouvons le modifier dans la configuration.
Theano, Tensorflow et back-end CNTK
Theano est un projet open source dรฉveloppรฉ par le groupe MILA de l'Universitรฉ de Montrรฉal, Quรฉbec, Canada. C'รฉtait le premier framework largement utilisรฉ. C'est un Python Bibliothรจque qui aide ร la crรฉation de tableaux multidimensionnels pour les opรฉrations mathรฉmatiques ร l'aide de Numpy ou Scipy. Theano peut utiliser des GPU pour des calculs plus rapides, il peut รฉgalement crรฉer automatiquement des graphiques symboliques pour le calcul des gradients. Sur son site Web, Theano affirme qu'il peut reconnaรฎtre des expressions numรฉriquement instables et les calculer avec des algorithmes plus stables, ce qui est trรจs utile pour nos expressions instables.
Dโun autre cรดtรฉ, Tensorflow est lโรฉtoile montante du framework dโapprentissage profond. Dรฉveloppรฉ par l'รฉquipe Brain de Google, il s'agit de l'outil d'apprentissage en profondeur le plus populaire. Avec de nombreuses fonctionnalitรฉs, les chercheurs contribuent ร dรฉvelopper ce cadre ร des fins d'apprentissage en profondeur.
Un autre moteur backend pour Keras est The Microsoft Boรฎte ร outils cognitive ou CNTK. Il s'agit d'un cadre d'apprentissage profond open source dรฉveloppรฉ par Microsoft รquipe. Il peut fonctionner sur plusieurs GPU ou sur plusieurs machines pour former un modรจle d'apprentissage profond ร grande รฉchelle. Dans certains cas, CNTK a รฉtรฉ signalรฉ plus rapidement que d'autres frameworks tels que Tensorflow ou Theano. Ensuite, dans ce didacticiel Keras CNN, nous comparerons les backends de Theano, TensorFlow et CNTK.
Comparaison des backends
Nous devons faire un benchmark afin de connaรฎtre la comparaison entre ces deux backends. Comme vous pouvez le voir dans La rรฉfรฉrence de Jeong-Yoon Lee, les performances de 3 backends diffรฉrents sur diffรฉrents matรฉriels sont comparรฉes. Et le rรฉsultat est que Theano est plus lent que lโautre backend, est-il rapportรฉ 50 fois plus lent, mais la prรฉcision est proche les unes des autres.
Une autre test de rรฉfรฉrence est effectuรฉ par Jasmeet Bhatia. Il a signalรฉ que Theano est plus lent que Tensorflow pour certains tests. Mais la prรฉcision globale est presque la mรชme pour chaque rรฉseau testรฉ.
Ainsi, entre Theano, Tensorflow et CTK, il est รฉvident que TensorFlow est meilleur que Theano. Avec TensorFlow, le temps de calcul est beaucoup plus court et CNN est meilleur que les autres.
Suivant dans ce Keras Python tutoriel, nous dรฉcouvrirons la diffรฉrence entre Keras et TensorFlow (Keras et Tensorflow).
Keras et Tensorflow
| Paramรจtres | Keras | Tensorflow |
|---|---|---|
| Type | Wrapper API de haut niveau | API de bas niveau |
| Complexitรฉ | Facile ร utiliser si vous Python langue | Vous devez apprendre la syntaxe d'utilisation de certaines fonctions Tensorflow |
| Interet | Dรฉploiement rapide pour crรฉer un modรจle avec des couches standards | Vous permet de crรฉer un graphique informatique arbitraire ou des couches de modรจle |
| Outils | Utilise un autre outil de dรฉbogage API tel que TFDBG | Vous pouvez utiliser les outils de visualisation Tensorboard |
| Communautรฉ | De grandes communautรฉs actives | Grandes communautรฉs actives et ressources largement partagรฉes |
Avantages de Keras
Dรฉploiement rapide et facile ร comprendre
Keras est trรจs rapide pour crรฉer un modรจle de rรฉseau. Si vous souhaitez crรฉer un modรจle de rรฉseau simple avec quelques lignes, Python Keras peut vous aider. Regardez l'exemple Keras ci-dessous :
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'))
Grรขce ร la convivialitรฉ de l'API, nous pouvons facilement comprendre le processus. รcrire le code avec une fonction simple et pas besoin de dรฉfinir plusieurs paramรจtres.
Support de grande communautรฉ
De nombreuses communautรฉs d'IA utilisent Keras pour leur cadre de Deep Learning. Beaucoup dโentre eux publient leurs codes ainsi que des tutoriels destinรฉs au grand public.
Avoir plusieurs backends
Vous pouvez choisir Tensorflow, CNTK et Theano comme backend avec Keras. Vous pouvez choisir un backend diffรฉrent pour diffรฉrents projets en fonction de vos besoins. Chaque backend a son propre avantage unique.
Dรฉploiement multiplateforme et facile du modรจle
Avec une variรฉtรฉ d'appareils et de plates-formes pris en charge, vous pouvez dรฉployer Keras sur n'importe quel appareil comme
- iOS avec CoreML
- Android avec Tensorflow Android,
- Navigateur Web avec prise en charge .js
- Moteur cloud
- Raspberry Pi
Prise en charge de plusieurs GPU
Vous pouvez entraรฎner Keras sur un seul GPU ou utiliser plusieurs GPU ร la fois. Parce que Keras dispose d'une prise en charge intรฉgrรฉe du parallรฉlisme des donnรฉes, ce qui lui permet de traiter de gros volumes de donnรฉes et d'accรฉlรฉrer le temps nรฉcessaire ร leur formation.
Inconvรฉnients du Keras
Impossible de gรฉrer l'API de bas niveau
Keras ne gรจre que les API de haut niveau qui s'exรฉcutent sur d'autres frameworks ou moteurs backend tels que Tensorflow, Theano ou CNTK. Ce n'est donc pas trรจs utile si vous souhaitez crรฉer votre propre couche abstraite ร des fins de recherche car Keras dispose dรฉjร de couches prรฉconfigurรฉes.
Installation de Keras
Dans cette section, nous examinerons les diffรฉrentes mรฉthodes disponibles pour installer Keras
Installation directe ou environnement virtuel
Quel est le meilleur? Installation directe sur le python actuel ou utilisation d'un environnement virtuel ? Je suggรจre d'utiliser un environnement virtuel si vous avez de nombreux projets. Vous voulez savoir pourquoi ? En effet, diffรฉrents projets peuvent utiliser une version diffรฉrente d'une bibliothรจque keras.
Par exemple, j'ai un projet qui nรฉcessite Python 3.5 en utilisant OpenCV 3.3 avec l'ancien backend Keras-Theano mais dans l'autre projet, je dois utiliser Keras avec la derniรจre version et un Tensorflow comme backend avec Python Prise en charge de 3.6.6
Nous ne voulons pas que les bibliothรจques Keras entrent en conflit, n'est-ce pas ? Nous utilisons donc un environnement virtuel pour localiser le projet avec un type spรฉcifique de bibliothรจque ou nous pouvons utiliser une autre plateforme telle que Cloud Service pour effectuer notre calcul ร notre place, comme Amazon Service Web.
Installation de Keras sur Amazon Services Web (AWS)
Amazon Web Service est une plate-forme qui propose des services et des produits Cloud Computing destinรฉs aux chercheurs ou ร toute autre fin. AWS loue son matรฉriel, son rรฉseau, sa base de donnรฉes, etc. afin que nous puissions l'utiliser directement depuis Internet. L'un des services AWS les plus populaires ร des fins d'apprentissage en profondeur est le Amazon Service d'apprentissage profond d'image machine ou DL
Pour des instructions dรฉtaillรฉes sur l'utilisation d'AWS, reportez-vous ร ceci tutoriel
Note sur l'AMI : Vous disposerez de l'AMI suivante
AWS Deep Learning AMI est un environnement virtuel dans le service AWS EC2 qui aide les chercheurs ou les praticiens ร travailler avec le Deep Learning. DLAMI propose des moteurs de petits processeurs jusqu'ร des moteurs multi-GPU haute puissance avec CUDA, cuDNN prรฉconfigurรฉs et est livrรฉ avec une variรฉtรฉ de cadres d'apprentissage en profondeur.
Si vous souhaitez l'utiliser instantanรฉment, vous devez choisir Deep Learning AMI car elle est prรฉinstallรฉe avec les frameworks d'apprentissage profond populaires.
Mais si vous souhaitez essayer un cadre d'apprentissage profond personnalisรฉ pour la recherche, vous devez installer l'AMI Deep Learning Base car elle est livrรฉe avec des bibliothรจques fondamentales telles que CUDA, cuDNN, des pilotes GPU et d'autres bibliothรจques nรฉcessaires pour fonctionner avec votre environnement d'apprentissage profond.
Comment installer Keras sur Amazon SageMaker
Amazon SageMaker est une plateforme d'apprentissage en profondeur pour vous aider ร former et ร dรฉployer un rรฉseau d'apprentissage en profondeur avec le meilleur algorithme.
En tant que dรฉbutant, c'est de loin la mรฉthode la plus simple pour utiliser Keras. Vous trouverez ci-dessous un processus permettant d'installer Keras sur Amazon SageMaker :
รtape 1) Ouvrez Amazon SageMaker
Dans la premiรจre รฉtape, ouvrez le Amazon Faiseur de sauge console et cliquez sur Crรฉer une instance de notebook.
รtape 2) Entrez les dรฉtails
- Entrez le nom de votre bloc-notes.
- Crรฉez un rรดle IAM. Cela crรฉera un rรดle AMI Amazon Rรดle IAM sous la forme de AmazonSageMaker-Executionrole-AAAAMMJJ|HHmmSS.
- Enfin, choisissez Crรฉer une instance de notebook. Aprรจs quelques instants, Amazon Sagemaker lance une instance de notebook.
Note: Si vous souhaitez accรฉder aux ressources de votre VPC, dรฉfinissez l'accรจs Internet direct comme activรฉ. Sinon, cette instance de notebook n'aura pas d'accรจs Internet, il est donc impossible de former ou d'hรฉberger des modรจles
รtape 3) Lancez l'instance
Cliquez sur Ouvrir pour lancer l'instance
รtape 4) Commencez ร coder
In Jupyter, Cliquez sur Nouveau> conda_tensorflow_p36 et vous รชtes prรชt ร coder
Installer Keras sous Linux
Pour activer Keras avec Tensorflow comme moteur backend, nous devons d'abord installer Tensorflow. Exรฉcutez cette commande pour installer tensorflow avec CPU (pas de GPU)
pip install --upgrade tensorflow
si vous souhaitez activer la prise en charge GPU pour tensorflow, vous pouvez utiliser cette commande
pip install --upgrade tensorflow-gpu
vรฉrifions Python pour voir si notre installation rรฉussit en tapant
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 >>>
s'il n'y a pas de message d'erreur, le processus d'installation est rรฉussi
Installer Keras
Aprรจs avoir installรฉ Tensorflow, commenรงons ร installer keras. Tapez cette commande dans le terminal
pip install keras
il commencera ร installer Keras ainsi que toutes ses dรฉpendances. Vous devriez voir quelque chose comme ceci :
Nous avons maintenant Keras installรฉ dans notre systรจme !
Vรฉrification
Avant de commencer ร utiliser Keras, nous devons vรฉrifier si nos Keras utilisent Tensorflow comme backend en ouvrant le fichier de configuration :
gedit ~/.keras/keras.json
tu devrais voir quelque chose comme รงa
{
"floatx": "float32",
"epsilon": 1e-07,
"backend": "tensorflow",
"image_data_format": "channels_last"
}
comme vous pouvez le voir, le ยซ backend ยป utilise tensorflow. Cela signifie que les keras utilisent Tensorflow comme backend comme prรฉvu
et maintenant exรฉcutez-le sur le terminal en tapant
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. >>>
Comment installer Keras sur Windows
Avant d'installer Tensorflow et Keras, nous devrions installer Python, pip et virtualenv. Si vous avez dรฉjร installรฉ ces bibliothรจques, vous devez passer ร l'รฉtape suivante, sinon procรฉdez comme suit :
Installer Python 3 en tรฉlรฉchargeant ร partir de ceci lien
Installez pip en exรฉcutant ceci.
Installez virtualenv avec cette commande
pip3 install โU pip virtualenv
Installer Microsoft Visuel C++ Mise ร jour redistribuable 2015 3
- Accรฉdez au site de tรฉlรฉchargement de Visual Studio https://www.microsoft.com/en-us/download/details.aspx?id=53587
- Sรฉlectionnez les redistribuables et les outils de construction
- Tรฉlรฉchargez et installez le Microsoft Visuel C++ Mise ร jour redistribuable 2015 3
Ensuite, exรฉcutez ce script
pip3 install virtualenv
Configurer l'environnement virtuel
Ceci est utilisรฉ pour isoler le systรจme de travail avec le systรจme principal.
virtualenv โ-system-site-packages โp python3 ./venv
Activer l'environnement
.\venv\Scripts\activate
Aprรจs avoir prรฉparรฉ l'environnement, l'installation de Tensorflow et Keras reste la mรชme que celle de Linux. Ensuite, dans ce didacticiel Deep Learning avec Keras, nous dรฉcouvrirons les principes fondamentaux de Keras pour le Deep Learning.
Fondamentaux de Keras pour l'apprentissage profond
La structure principale de Keras est le modรจle qui dรฉfinit le graphe complet d'un rรฉseau. Vous pouvez ajouter davantage de couches ร un modรจle existant pour crรฉer un modรจle personnalisรฉ dont vous avez besoin pour votre projet.
Voici comment crรฉer un modรจle sรฉquentiel et quelques couches couramment utilisรฉes en apprentissage profond
1. Modรจle sรฉquentiel
from keras.models import Sequential from keras.layers import Dense, Activation,Conv2D,MaxPooling2D,Flatten,Dropout model = Sequential()
2. Couche convolutive
C'est un Keras Python exemple de couche convolutive comme couche d'entrรฉe avec la forme d'entrรฉe de 320x320x3, avec 48 filtres de taille 3ร3 et utilise ReLU comme fonction d'activation.
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))
un autre type est
model.add(Conv2D(48, (3, 3), activation='relu'))
3. MaxPooling Couche
Pour sous-รฉchantillonner la reprรฉsentation d'entrรฉe, utilisez MaxPool2d et spรฉcifiez la taille du noyau
model.add(MaxPooling2D(pool_size=(2, 2)))
4. Couche dense
ajouter une couche entiรจrement connectรฉe en spรฉcifiant simplement la taille de sortie
model.add(Dense(256, activation='relu'))
5. Couche d'abandon
Ajout d'une couche d'abandon avec une probabilitรฉ de 50 %
model.add(Dropout(0.5))
Compiler, former et รฉvaluer
Aprรจs avoir dรฉfini notre modรจle, commenรงons ร les former. Il est nรฉcessaire de compiler d'abord le rรฉseau avec la fonction de perte et la fonction d'optimisation. Cela permettra au rรฉseau de modifier les poids et de minimiser les pertes.
model.compile(loss='mean_squared_error', optimizer='adam')
Maintenant, pour commencer la formation, utilisez fit pour alimenter le modรจle en donnรฉes de formation et de validation. Cela vous permettra de former le rรฉseau par lots et de dรฉfinir les รฉpoques.
model.fit(X_train, X_train, batch_size=32, epochs=10, validation_data=(x_val, y_val))
Notre derniรจre รฉtape consiste ร รฉvaluer le modรจle avec les donnรฉes de test.
score = model.evaluate(x_test, y_test, batch_size=32)
Essayons d'utiliser une rรฉgression linรฉaire simple
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()
Aprรจs avoir entraรฎnรฉ les donnรฉes, le rรฉsultat devrait ressembler ร ceci
avec le poids initial
Linear regression model is initialized with weights w: 0.37, b: 0.00
et poids final
Linear regression model is trained to have weight w: 3.70, b: 0.61
Affiner les modรจles prรฉ-entraรฎnรฉs dans Keras et comment les utiliser
Pourquoi nous utilisons les modรจles Fine Tune et quand nous les utilisons
Le rรฉglage fin est une tรขche consistant ร peaufiner un modรจle prรฉ-entraรฎnรฉ de telle sorte que les paramรจtres s'adaptent au nouveau modรจle. Lorsque lโon veut sโentraรฎner ร partir de zรฉro sur un nouveau modรจle, nous avons besoin dโune grande quantitรฉ de donnรฉes, afin que le rรฉseau puisse retrouver tous les paramรจtres. Mais dans ce cas, nous utiliserons un modรจle prรฉ-entraรฎnรฉ donc les paramรจtres sont dรฉjร appris et auront un poids.
Par exemple, si nous voulons entraรฎner notre propre modรจle Keras pour rรฉsoudre un problรจme de classification mais que nous ne disposons que d'une petite quantitรฉ de donnรฉes, nous pouvons rรฉsoudre ce problรจme en utilisant un Transfert d'apprentissage + Mรฉthode de rรฉglage fin.
En utilisant un rรฉseau et des poids prรฉ-entraรฎnรฉs, nous n'avons pas besoin de former l'ensemble du rรฉseau. Nous avons juste besoin de former la derniรจre couche utilisรฉe pour rรฉsoudre notre tรขche, ce que nous appelons la mรฉthode de rรฉglage fin.
Prรฉparation du modรจle de rรฉseau
Pour le modรจle prรฉ-entraรฎnรฉ, nous pouvons charger une variรฉtรฉ de modรจles que Keras a dรฉjร dans sa bibliothรจque, tels que :
- VGG16
- CrรฉationV3
- ResNet
- Rรฉseau mobile
- Xception
- CrรฉationResNetV2
Mais dans ce processus, nous utiliserons le modรจle de rรฉseau VGG16 et imageNet comme poids pour le modรจle. Nous allons affiner un rรฉseau pour classer 8 types diffรฉrents de classes ร l'aide d'images de Ensemble de donnรฉes d'images naturelles Kaggle
Architecture du modรจle VGG16
Tรฉlรฉchargement de nos donnรฉes sur le compartiment AWS S3
Pour notre processus de formation, nous utiliserons une image d'images naturelles provenant de 8 classes diffรฉrentes telles que les avions, la voiture, le chat, le chien, la fleur, le fruit, la moto et la personne. Tout d'abord, nous devons tรฉlรฉcharger nos donnรฉes sur Amazon Seau S3.
Amazon Compartiment S3
รtape 1) Aprรจs vous รชtre connectรฉ ร votre compte S3, crรฉons un bucket en pointant Crรฉer Bucket
รtape 2) Choisissez maintenant un nom de compartiment et votre rรฉgion en fonction de votre compte. Assurez-vous que le nom du compartiment est disponible. Aprรจs ce clic Crรฉer.
รtape 3) Comme vous pouvez le constater, votre Bucket est prรชt ร รชtre utilisรฉ. Mais comme vous pouvez le voir, l'accรจs n'est pas public, c'est bien pour vous si vous souhaitez le garder privรฉ pour vous-mรชme. Vous pouvez modifier ce bucket pour l'accรจs public dans les propriรฉtรฉs du bucket.
รtape 4) Vous commencez maintenant ร tรฉlรฉcharger vos donnรฉes d'entraรฎnement sur votre bucket. Ici, je vais tรฉlรฉcharger le fichier tar.gz qui contient des images pour le processus de formation et de test.
รtape 5) Cliquez maintenant sur votre fichier et copiez le Lien afin que nous puissions le tรฉlรฉcharger.
Prรฉparation des donnรฉes
Nous devons gรฉnรฉrer nos donnรฉes de formation ร l'aide de Keras ImageDataGenerator.
Vous devez dโabord tรฉlรฉcharger en utilisant wget avec le lien vers votre fichier depuis S3 Bucket.
!wget https://s3.us-east-2.amazonaws.com/naturalimages02/images.tar.gz !tar -xzf images.tar.gz
Aprรจs avoir tรฉlรฉchargรฉ les donnรฉes, commenรงons le processus de formation.
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)
Les donnรฉes d'imageGenerator crรฉera une donnรฉe X_training ร partir d'un rรฉpertoire. Le sous-rรฉpertoire de ce rรฉpertoire sera utilisรฉ comme classe pour chaque objet. L'image sera chargรฉe avec le mode couleur RVB, avec le mode classe catรฉgorielle pour les donnรฉes Y_training, avec une taille de lot de 16. Enfin, mรฉlangez les donnรฉes.
Voyons nos images au hasard en les traรงant avec 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()
Aprรจs cela, crรฉons notre modรจle de rรฉseau ร partir de VGG16 avec le poids prรฉ-entraรฎnรฉ imageNet. Nous allons geler ces couches afin qu'elles ne puissent pas รชtre entraรฎnรฉes afin de nous aider ร rรฉduire le temps de calcul.
Crรฉer notre modรจle ร partir de 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())
Comme vous pouvez le voir ci-dessous, le rรฉsumรฉ de notre modรจle de rรฉseau. ร partir d'une entrรฉe des couches VGG16, nous ajoutons ensuite 2 couches entiรจrement connectรฉes qui extrairont 1024 fonctionnalitรฉs et une couche de sortie qui calculera les 8 classes avec l'activation 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
Entraรฎnement
# # 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()
Rรฉsultats
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
Comme vous pouvez le constater, nos pertes ont รฉtรฉ considรฉrablement rรฉduites et la prรฉcision est proche de 100 %. Pour tester notre modรจle, nous avons sรฉlectionnรฉ des images au hasard sur Internet et les avons placรฉes dans le dossier de test avec une classe diffรฉrente ร tester.
Tester notre modรจle
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()
Et notre test est comme indiquรฉ ci-dessous ! Une seule image est prรฉdite fausse sur un test de 1 images !
Rรฉseau neuronal de reconnaissance faciale avec Keras
Pourquoi nous avons besoin de reconnaissance
Nous avons besoin de reconnaissance pour nous permettre de reconnaรฎtre ou d'identifier plus facilement le visage d'une personne, le type d'objet, l'รขge estimรฉ d'une personne ร partir de son visage, ou mรชme de connaรฎtre les expressions faciales de cette personne.
Peut-รชtre rรฉalisez-vous qu'ร chaque fois que vous essayez de marquer le visage de votre ami sur une photo, la fonctionnalitรฉ de Facebook l'a fait pour vous, c'est-ร -dire qu'elle marque le visage de votre ami sans que vous ayez besoin de le marquer au prรฉalable. Il s'agit de la reconnaissance faciale appliquรฉe par Facebook pour nous permettre de marquer plus facilement nos amis.
Alors, comment รงa marche? Chaque fois que nous marquons le visage de notre ami, l'IA de Facebook l'apprendra et tentera de le prรฉdire jusqu'ร obtenir le bon rรฉsultat. Le mรชme systรจme que nous utiliserons pour crรฉer notre propre reconnaissance faciale. Commenรงons ร crรฉer notre propre reconnaissance faciale ร l'aide du Deep Learning
Modรจle de rรฉseau
Nous utiliserons un modรจle de rรฉseau VGG16 mais avec un poids VGGFace.
Architecture du modรจle VGG16
Quโest-ce que VGGFace ? il s'agit de l'implรฉmentation Keras de la reconnaissance faciale profonde introduite par Parkhi, Omkar M. et al. ยซ Reconnaissance faciale profonde. ยป BMVC (2015). Le framework utilise VGG16 comme architecture rรฉseau.
Vous pouvez tรฉlรฉcharger le VGGFace depuis 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()
Comme vous pouvez le voir le rรฉsumรฉ du rรฉseau
_________________________________________________________________ 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):
nous ferons un Transfert d'apprentissage + Rรฉglage fin pour rendre la formation plus rapide avec de petits ensembles de donnรฉes. Tout dโabord, nous allons geler les couches de base afin quโelles ne puissent pas รชtre entraรฎnรฉes.
for layer in face_model.layers:
layer.trainable = False
puis nous ajoutons notre propre calque pour reconnaรฎtre nos visages de test. Nous ajouterons 2 couches entiรจrement connectรฉes et une couche de sortie avec 5 personnes ร dรฉtecter.
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)
Voyons le rรฉsumรฉ de notre rรฉseau
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
Comme vous pouvez le voir ci-dessus, aprรจs la couche pool5, elle sera aplatie en un seul vecteur de caractรฉristiques qui sera utilisรฉ par la couche dense pour la reconnaissance finale.
Prรฉparer nos visages
Maintenant, prรฉparons nos visages. J'ai crรฉรฉ un annuaire composรฉ de 5 personnes cรฉlรจbres
- Jack Ma
- Jason Statham
- Johnny Depp
- Robert Downey Jr
- Rowan Atkinson
Chaque dossier contient 10 images, pour chaque processus de formation et d'รฉvaluation. Il sโagit dโune trรจs petite quantitรฉ de donnรฉes, mais cโest lร le dรฉfi, nโest-ce pas ?
Nous utiliserons l'aide de l'outil Keras pour nous aider ร prรฉparer les donnรฉes. Cette fonction parcourra le dossier de l'ensemble de donnรฉes, puis le prรฉparera afin qu'il puisse รชtre utilisรฉ dans la formation.
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,
)
Former notre modรจle
Commenรงons notre processus de formation en compilant notre rรฉseau avec fonction de perte et optimiseur. Ici, nous utilisons sparse_categorical_crossentropy comme fonction de perte, avec l'aide de SGD comme optimiseur d'apprentissage.
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
Comme vous pouvez le constater, la prรฉcision de notre validation atteint 64 %, ce qui est un bon rรฉsultat pour une petite quantitรฉ de donnรฉes d'entraรฎnement. Nous pouvons amรฉliorer cela en ajoutant plus de calques ou en ajoutant plus d'images d'entraรฎnement afin que notre modรจle puisse en apprendre davantage sur les visages et obtenir plus de prรฉcision.
Testons notre modรจle avec une image 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']
en utilisant la photo de Robert Downey Jr. comme photo de test, cela montre que le visage prรฉdit est vrai !
Prรฉdiction en utilisant Live Cam !
Et si nous testions nos compรฉtences en lโimplรฉmentant avec une entrรฉe provenant dโune webcam ? En utilisant OpenCV avec la cascade Haar Face pour trouver notre visage et avec l'aide de notre modรจle de rรฉseau, nous pouvons reconnaรฎtre la personne.
La premiรจre รฉtape consiste ร prรฉparer votre visage et celui de vos amis. Plus nous avons de donnรฉes, meilleur est le rรฉsultat !
Prรฉparez et entraรฎnez votre rรฉseau comme ร l'รฉtape prรฉcรฉdente. Une fois la formation terminรฉe, ajoutez cette ligne pour obtenir l'image d'entrรฉe de la camรฉra.
#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()
Quel est le meilleur? Keras ou Tensorflow
Keras offre la simplicitรฉ lors de l'รฉcriture du script. On peut commencer ร รฉcrire et comprendre directement avec Keras car ce n'est pas trop difficile ร comprendre. Il est plus convivial et facile ร mettre en ลuvre, pas besoin de crรฉer de nombreuses variables pour exรฉcuter le modรจle. Nous nโavons donc pas besoin de comprendre tous les dรฉtails du processus backend.
D'un autre cรดtรฉ, Tensorflow correspond aux opรฉrations de bas niveau qui offrent une flexibilitรฉ et des opรฉrations avancรฉes si vous souhaitez crรฉer un graphique ou un modรจle de calcul arbitraire. Tensorflow peut รฉgalement visualiser le processus ร l'aide de Tableau Tenseur et un outil de dรฉbogage spรฉcialisรฉ.
Donc, si vous souhaitez commencer ร travailler avec le deep learning sans trop de complexitรฉ, utilisez Keras. Parce que Keras offre une simplicitรฉ et une convivialitรฉ ร utiliser et facile ร mettre en ลuvre que Tensorflow. Mais si vous souhaitez รฉcrire votre propre algorithme dans un projet ou une recherche d'apprentissage en profondeur, vous devez plutรดt utiliser Tensorflow.
Rรฉsumรฉ
Rรฉsumons donc tout ce dont nous avons discutรฉ et fait dans ce tutoriel.
- Keras dans une API de haut niveau utilisรฉe pour faciliter les rรฉseaux d'apprentissage en profondeur ร l'aide d'un moteur backend.
- Keras est facile ร utiliser et ร comprendre avec le support Python, ce qui le rend plus naturel que jamais. C'est bon pour les dรฉbutants qui souhaitent en savoir plus sur l'apprentissage profond et pour les chercheurs qui souhaitent une API facile ร utiliser.
- Le processus d'installation est simple et vous pouvez utiliser un environnement virtuel ou utiliser une plateforme externe telle que AWS.
- Keras est รฉgalement livrรฉ avec diffรฉrents types de modรจles de rรฉseau, ce qui nous permet d'utiliser plus facilement le modรจle disponible pour prรฉ-entraรฎner et affiner notre propre modรจle de rรฉseau.
- En outre, il existe de nombreux didacticiels et articles sur l'utilisation de Keras provenant de codes de communautรฉs du monde entier ร des fins d'apprentissage en profondeur.























