Ia Framework Machines Deep Learning dl4j Tfjs
Ia Framework Machines Deep Learning dl4j Tfjs
Ia Framework Machines Deep Learning dl4j Tfjs
Mobiles
Networkx
Justice and IOT
& Telecom
Transparen Agriculture Apps
cy SMA
Interaction Organisation
SMA
Intelligence Artificielle? Intelligence Artificielle
Apprentissage Mémorisation
Raisonnement Conscience
Perception Intention
Environnement
Migration Emotion
Education
Interaction Agent Ethique
Environnement
Santé
Ecologique
Interaction Organisation
Coordination Motrice
Agriculture Sécurité
• L'intelligence artificielle : cherche à doter les systèmes informatiques
de capacités intellectuelles comparables à celles des êtres humains »
• Intelligence Artificielle Distribuée =
Agriculture Sécurité
Apprentissage Supervisé Apprentissage Par Renforcement
Sorties
Récompense
Entrées Action
x1 y1
Sport et Transport et
x2 Automatisation y2
x3 Nouvel
Divertissement Trafic Routier
x4 Extraction de y3
x5 La connaissance état
Justice et x6
Transparence y4
Environnement
Intelligence Artificielle, Machines
Learning, Deep Learning Intelligence Artificielle
Machines Learning
Deep
Learning
Agriculture Sécurité
Sport et Transport et
Divertissement Trafic Routier
Justice et
Transparence CNN : [ Convolution, RELU, MAX PULLING ] [ Fully Connected ]
Machines Learning
Deep
Learning
Agriculture Sécurité
Deep Reinforcement Learning
Deep Learning
Apprentissage Par Renforcement
Récompense
Action
+
Sport et Transport et
Divertissement Trafic Routier
Justice et Nouvel
Transparence état
Environnement
Exemple très simple de machines learning expliqué aux artisans
Imaginez que vous êtes un botaniste et que vous vous intéresser à déterminer la relation qui existe entre le diamètre et
la hauteur des troncs d’une catégorie d’arbres.
Un neurone artificiel (NA) est une unité de calcul élémentaire (fonction mathématique )
permet de mettre en relations des entrées Xi avec une sortie Y
X1 W1
Un neurone artificiel est représentation approximative d’un neurone
biologique W2 Y
X2
◦ Additionne ses entrées xi pondérées par des poids wi ,
◦ compare la somme résultante à une valeur seuil selon un fonction X3 W3
d’activation,
◦ répond en émettant un signal si cette somme est supérieure ou égale à • Sum=x1w1+x2w+x3w3
ce seuil (modèle ultra-simplifié du fonctionnement d'un neurone
biologique). • Si Sum>Seuil => Y=1 Si non Y=0
◦ Ces neurones sont par ailleurs associés en réseaux dont la topologie des
connexions est variable : réseaux proactifs, récurrents, etc.
◦ Enfin, l'efficacité de la transmission des signaux d'un neurone à l'autre
peut varier : on parle de « poids synaptique », et ces poids peuvent être
modulés par des règles d'apprentissage (ce qui mime la plasticité
synaptique des réseaux biologiques).
• 𝑺 = σ𝒎
𝒊=𝟏 𝒙𝒊𝒘𝒊
• Ensuite on applique à cette somme une fonction d’activation non linéaire qui produit une
sortie binaire. : Exemple Seuillage
𝟏 𝒔𝒊 𝑺 ≥ 𝜽
• 𝒀=ቊ
−𝟏 𝒔𝒊 𝑺 < 𝜽
Pr 1 Inputs :
?
1. Pregnancies : Nombre de grossesses
2
G 2. Glucose : La taux de Glucose dans le sang
3 3. Blood Pressure : La pression du sang
BP
4. Skin Thickness : Epaisseur de la peau
4
ST Output : 5. Insulin : Le taux de l’insuline présent dans le sang
Diabète (0, 1) 6. BMI : Indice de masse corporel
5
IN 7. Diabetes Pedigree Function Antécédents de diabète sucrégénitique.
B 6 8. Age : Age du patient
m Output : Présence ou non du diabète
7
Dp
Multi Layer Perceptron : Fully Connected Layer 1 Layer 2 Layer 2
8
A
• 8 Entrées
Pr Gluc BP ST Ins BMI DPF Age Output • 1 Sortie
6 148 72 35 0 33.6 0.627 50 1
1 85 66 29 0 26.6 0.351 31 0
• 3 Couches de neurones
8 183 64 0 0 23.3 0.672 32 1 • Layer 1 : 4 neurones
1 89 66 23 94 28.1 0.167 21 0
0 137 40 35 168 43.1 2.288 33 1 • Layer 2 : 3 neurones
5 116 74 0 0 25.6 0.201 30 0 • Layer 3 : 1 neurone
3 78 50 32 88 31 0.248 26 1
10 115 0 0 0 35.3 0.134 29 0 • Nre Cxions : 8x4+4x3+3=47
Pour ajuster les poids de connexions: Algo de Rétro Propagation du Gradient : (SGD, ADAM, etc.)
Qu’en est ils, pour le cas de classification des images ?
Covolution Layer
Kernel size : 3 x 3
Image Originale
Stride : 1
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => 0.78
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(1) + (1)*(-1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(1) + (1)*(-1) ) /9 => -0.11
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(-1) + (-1)*(-1)+
Stride : 1
(-1)*(1) + (-1)*(-1) + (1)*(-1) ) /9 => 0.11
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(-1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(-1) ) /9 => 0.33
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(-1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => 0.58
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(1)+
Stride : 1
(-1)*(-1) + (-1)*(1) + (1)*(-1) ) /9 => -0.11
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(1) + (-1)*(-1) + (1)*(-1) ) /9 => 0.33
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(1) + (-1)*(-1)+
(-1)*(-1) + (1)*(-1) + (-1)*(1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(-1) ) /9 => -0.11
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => 1
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => -0.11
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => 0.33
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => -0.11
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => 0.11
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => -0.11
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => 0.11
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => -0.11
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => 1
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => -0.33
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => 0.11
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => 0.78
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => 0.58
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => 0.33
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => 0.33
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => -0.33
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => 0.56
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => -0.33
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => 0.33
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => 0.33
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => 0.56
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => -0.11
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => 0.11
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => -0.33
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => 1
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => -0.11
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => 0.11
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => -0.11
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => 0.78
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => -0.11
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => 0.33
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => -0.11
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => 1
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => -0.11
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => 33
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => -0.11
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => 0.56
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => 0.33
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => 0.11
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => -
0.11
Image Originale
Image Filtrée
Convolution
Kernel
Kernel size : 3 x 3 ( (1)*(-1) + (-1)*(-1) + (-1)*(-1)+
(-1)*(-1) + (1)*(1) + (-1)*(-1)+
Stride : 1
(-1)*(-1) + (-1)*(-1) + (1)*(1) ) /9 => 0.78
Image Originale
Image Filtrée
Convolution
RELU Activation Function
Image Filtrée
Image Filtrée avec RELU
RELU Activation
POOLING Layer (POOL MAX)
Kernel size : 2 x 2 Stride : 2
Image Filtrée avec RELU
POOL MAX
POOLING (POOL MAX)
Kernel size : 2 x 2 Stride : 2
Image Filtrée avec RELU
POOL MAX
POOLING (POOL MAX)
Kernel size : 2 x 2 Stride : 2
Image Filtrée avec RELU
POOL MAX
POOLING (POOL MAX)
Kernel size : 2 x 2 Stride : 2
Image Filtrée avec RELU
POOL MAX
POOLING (POOL MAX)
Kernel size : 2 x 2 Stride : 2
Image Filtrée avec RELU
POOL MAX
POOLING (POOL MAX)
Kernel size : 2 x 2 Stride : 2
Image Filtrée avec RELU
POOL MAX
POOLING (POOL MAX)
Kernel size : 2 x 2 Stride : 2
Image Filtrée avec RELU
POOL MAX
POOLING (POOL MAX)
Kernel size : 2 x 2 Stride : 2
Image Filtrée avec RELU
POOL MAX
POOLING (POOL MAX)
Kernel size : 2 x 2 Stride : 2
Image Filtrée avec RELU
POOL MAX
POOLING (POOL MAX)
Kernel size : 2 x 2 Stride : 2
Image Filtrée avec RELU
POOL MAX
POOLING (POOL MAX)
Kernel size : 2 x 2 Stride : 2
Image Filtrée avec RELU
POOL MAX
POOLING (POOL MAX)
Kernel size : 2 x 2 Stride : 2
Image Filtrée avec RELU
POOL MAX
POOLING (POOL MAX)
Kernel size : 2 x 2 Stride : 2
Image Filtrée avec RELU
POOL MAX
POOLING (POOL MAX)
Kernel size : 2 x 2 Stride : 2
Image Filtrée avec RELU
POOL MAX
POOLING (POOL MAX)
Kernel size : 2 x 2 Stride : 2
Image Filtrée avec RELU
POOL MAX
POOLING (POOL MAX)
Kernel size : 2 x 2 Stride : 2
Image Filtrée avec RELU
POOL MAX
Fully Connected Layer (Dense Layer)
Filtre 1
0.90 X
Conv RELU PULL
Filtre 2
Période d’Incertitude de l’Intelligence Artificielle
Pour avoir un modèle qui représente plus la réalité, il faudrait bien choisir :
Architectures
Parallèles • Le bon type du modèle (MLP, CNN, RNN, etc.)
GPU • Le bon nombre de couches de neurones
Open Systèmes
Source Distribués • Pour chaque couche il faut choisir :
• Le nombre de neurones adéquat
• La bonne fonction d’activation (RELU, SIGMOID, …)
App
Réseaux & Mobiles • Le nombre de filtres, la taille des filtres, types filtres
Télécom • La bonne valeur de la vitesse d’apprentissage (Entre 0 et 1)
IOT
• La bonne fonction de perte (Loss Function) produisant l’erreur à minimiser
(Mean squared error, Cross entropy, etc.)
• Le bon algorithme de rétropropagation du gradient permettant de mettre à
Cloud Big Data
jour les poids des connexions en minimisant la fonction de perte : SGD,
ADAM, etc...
Framework Algo • Et surtout un data set de très grande taille pour représenter le maximum
ML et DL ML et DL d’échantillons de la réalité.
• Ce qui fait que pendant la phase d’apprentissage => Beaucoup de temps de calcul
Catalyseurs de l’Intelligence Artificielle : Architectures Massivement Parallèles
Framework Algo
ML et DL ML et DL
Carte GPU Nvidia GeForce GTX Titan Z : ( prix $2999 )
5760 stream processors, 12GB of fast GDDR5 memory
Catalyseurs de l’Intelligence Artificielle : Architectures Massivement Parallèles
Architectures
➢ Architectures Massivement parallèles avec GPU :
Parallèles
Open GPU Systèmes
Source Distribués
App
Réseaux & Mobiles
Télécom
IOT
Framework Algo 8 GPU TITAN RTX RIG -Crypto Mining for altcoins & super-
ML et DL ML et DL computing, 40,000+ cores ( Prix US $29,990.00 )
Catalyseurs de l’Intelligence Artificielle : Systèmes Distribués
App messageries
Réseaux & Mobiles asynchrones:
Télécom
IOT • AMQP, MQTT, STOMP
• Brokers : RabbitMQ,
ActiveMQ
• Caches mémoires
Cloud Big Data
Distribués : Hazelcast
• Middlewares SMA :
Framework Algo
JADE
ML et DL ML et DL
Catalyseurs de l’Intelligence Artificielle : Applications Mobiles et IOT
Framework Algo
ML et DL ML et DL
Catalyseurs de l’Intelligence Artificielle : Big Data
• Stockage : • Programmation
Architectures • HDFS : Hadoop fonctionnelle :
Parallèles • Java script
GPU • NoSQL : MongoDB, Cassandra,..
Open Systèmes • BD Orientés Graphes : Neo4J
• Python
Source Distribués • Scala, Kotlin
• Batch Processing : MapReduce,
• Programmation
• Micro-Batch Processing: Spark,
Réactive
App • Stream Processing : KAFKA Stream
Réseaux & • ReactiveX
Mobiles • Caches Mémoires Distribués : Hazelcast
Télécom • Reactor
IOT
Big Data Et Systèmes Distribués Middlewares
Cloud
Big
Data
Framework Algo
ML et DL ML et DL
Catalyseurs de l’Intelligence Artificielle : Algorithmes DL
Framework Algo
ML et DL ML et DL
Catalyseurs de l’Intelligence Artificielle : Framework de ML et DL
• Mise en pratique les algo de l’IA en exploitant les GPUs et les SD.
Architectures • API de calcul parallèle sur GPU des algo de l’algèbre linéaire basée sur C
Parallèles (CUDA, OpenCL)
GPU
Open Systèmes
•
•
API de haut niveau avec Python, C++, Java
2015 : Framework de ML : TensorFlow
Source Distribués • API de haut niveau : KERAS (Python et C++)
• PyTorch, ML.Net(C#), DL4J (Java), TensorFlow.JS
• Algo basés sur les RN: MLP, CNN et RNN
Réseaux App
& Mobiles
Votre Application Application
Télécom IOT
ML5.JS KERAS
Algo
Framework
ML et DL ML et
DL
Catalyseurs de l’Intelligence Artificielle : Réseaux Télécom
Réseaux App
& Mobiles Virtualisation & Cloud Computing
Télécom IOT
Algo
Framework
ML et DL ML et
DL
Catalyseurs de l’Intelligence Artificielle : Open Source
Architectures
Parallèles
Open GPU
Systèmes
Source Distribués
Réseaux App
& Mobiles
Télécom IOT
Algo
Framework
ML et DL ML et
DL
TensorFlow.JS
• TensorFlowJS est un
Framework de machines et
Deep Learning basée sur
JavaScript
• La couche bas niveau de TensorFlow est développée en C car la programmation parallèle sur les GPU de Nvidea utilise CUDA qui est basé sur le langage C.
• Il existe plusieurs implémentations de API de haut niveau permettant programmer des applications de faire du machines learning basées sur TensorFlow :
• KERAS est une API de haut niveau qui permet de faire du machines Learning avec TensorFlow d’une manière plus simple
• TensorFlow.JS est une implémentation Java Script de TensorFlow basée sur WebGL
Comment utiliser TensorFlow avec Java Script
HTTP, JSON
Java Script Web Socket
Phyton
TensorFlow
<script src="node_modules/@tensorflow/tfjs/dist/tf.min.js"></script>
Tensors.JS : Core API => Tensors tf.tensor (values, shape?, dtype?)
t2
let t1=tf.tensor([2,6,7,8,9,5],[2,3]); t1
console.log("Tensor t1 [2x3]:"); 2.7 6
t1.print(); 2 6 7
X 1 2
8 9 5
1 4
let t2=tf.tensor([2.7,6,1,2,1,4],[3,2]);
console.log("Tensor t2 [3x2]:"); Tensor t1 [2x3]:
t1.print(); [ [2, 6, 7],
[8, 9, 5] ]
console.log("Tensor t3 transposée de t1:"); Tensor t2 [3x2]:
let t3=t1.transpose(); [[2, 6, 7],
t3.print(); [8, 9, 5]]
Tensor t3 transposée de t1:
console.log("Tensor t4: t1 x t2 "); [[2, 8],
let t4=t1.matMul(t2); [6, 9],
t4.print(); [7, 5]]
Tensor t4: t1 x t2
[[18.3999996, 52],
t1.dispose();t2.dispose();t3.dispose();t4.dispose(); [35.5999985, 86]]
Libérer les Tensors :
t2
tensor.dispose(); ou bien tf.tidy(()=>{}); t1
2.7 6
2 6 7
tf.tidy(()=>{ X 1 2
8 9 5
let t1=tf.tensor([2,6,7,8,9,5],[2,3]); 1 4
console.log("Tensor t1 [2x3]:");
Tensor t1 [2x3]:
t1.print();
[ [2, 6, 7],
let t2=tf.tensor([2.7,6,1,2,1,4],[3,2]); [8, 9, 5] ]
console.log("Tensor t2 [3x2]:"); Tensor t2 [3x2]:
t1.print(); [[2, 6, 7],
console.log("Tensor t3 transposée de t1:"); [8, 9, 5]]
let t3=t1.transpose(); Tensor t3 transposée de t1:
t3.print(); [[2, 8],
console.log("Tensor t4: t1 x t2 "); [6, 9],
let t4=t1.matMul(t2); [7, 5]]
Tensor t4: t1 x t2
t4.print();
[[18.3999996, 52],
}); [35.5999985, 86]]
TensorFlow.JS : Layers API
https://www.kaggle.com/uciml/iris
https://github.com/mohamedYoussfi/iris_tfjs_angular
Application
• Outils à installer :
• NodeJS (npm)
• Git
• Angular : > npm install –g @angular/cli
• Création d’un projet Angular :
• > ng new iris-ml-tfjs
• Démendances à installer :
• TensorFlow.JS :
• > npm install --save @tensorflow/tfjs
• Framework CSS Bootstrap :
• > npm install --save bootstrap@3
• Angular Progress Bar :
• > npm install --save angular-progress-bar
Application : dépendances et configuration
package.json app.module.ts
angular.json
example={SepalLengthCm:5.1,SepalWidthCm:3.5,PetalLengthCm:1.4,PetalWidthCm:0.2};
prediction: any;
epochs:number=100;
constructor(private httpClient:HttpClient){}
app.component.ts : les opérations sur les tensors
ngOnInit(): void {
this.tensors['X']=tf.tensor([3,10,11,1.70,-12,1.20,100,1.70,7, 25,-12,-34],[3,4]);
this.tensors['Y']=tf.tensor([[0.3,0.5,0.24],[0.1,0.5,0.74],[-0.13,0.56,0.24],
[0.1,0.8,0.28]]);
this.tensors['X'].print();
this.tensors['Y'].print();
}
app.component.ts : les opérations sur les tensors
onMult() {
this.tensors['Z']=this.tensors['X'].matMul(this.tensors['Y']);
this.operation="X.matMul(Y)";
}
onTranspose(t: string) {
this.tensors['Z']=this.tensors[t].transpose();
this.operation="X.transose()";
}
app.component.ts : les opérations sur les tensors
onRelu(t: string) {
this.tensors['Z']=tf.relu(this.tensors[t]);
this.operation="X.relu()";
}
onSigmoid(t: string) {
this.tensors['Z']=tf.sigmoid(this.tensors[t]);
this.operation="X.sigmoid()";
}
app.component.ts : Création du modèle de réseaux de neurones
onCreateModel() {
this.model=tf.sequential();
this.model.add(tf.layers.dense({
units:10, inputShape:[4],activation:'sigmoid'
}));
this.model.add(tf.layers.dense({
units:3,activation:'softmax'
}));
this.model.compile({
optimizer:tf.train.adam(this.learningRate),
loss:tf.losses.meanSquaredError,
metrics:['accuracy']
});
this.modelCreated=true;
}
app.component.ts : Préparation du Data Set
onLoadData() {
this.httpClient.get("assets/iris-train.csv",{responseType:'text'})
.subscribe(data=>{ 5.1,3.5,1.4,0.2,0
let parsedData=this.parseData(data);
4.9,3.0,1.4,0.2,0
4.7,3.2,1.3,0.2,0
this.xs=parsedData.xs;
…
this.ys=parsedData.ys; 6.4,3.2,4.5,1.5,1
},err=>{ 6.9,3.1,4.9,1.5,1
console.log(err); 5.5,2.3,4.0,1.3,1
}); this.httpClient.get("assets/irisTest.csv",{responseType:'text'})
…
6.3,3.3,6.0,2.5,2
.subscribe(data=>{
5.8,2.7,5.1,1.9,2
let parsedData=this.parseData(data); 7.1,3.0,5.9,2.1,2
this.xsTest=parsedData.xs;
this.ysTest=parsedData.ys;
},err=>{
console.log(err);
}); }
app.component.ts : Préparation du Data Set
parseData(data){ 5.1,3.5,1.4,0.2,0
let inputs=[]; let outputs=[]; 4.9,3.0,1.4,0.2,0
4.7,3.2,1.3,0.2,0
let lines=data.split(/\n/);
…
for (let i = 0; i < lines.length; i++) {
6.4,3.2,4.5,1.5,1
if(lines[i]!==''){ 6.9,3.1,4.9,1.5,1
let line=lines[i].split(","); 5.5,2.3,4.0,1.3,1
inputs.push([ …
6.3,3.3,6.0,2.5,2
parseFloat(line[0]), parseFloat(line[1]),
5.8,2.7,5.1,1.9,2
parseFloat(line[2]), parseFloat(line[3])]);
7.1,3.0,5.9,2.1,2
let output=[0,0,0];output[parseInt(line[4])]=1;
outputs.push(output); getIrisClass(data){
} //let t=tf.tensor1d(data);
} let index=data.indexOf(1);
return {xs:inputs,ys:outputs }; return this.irisClasses[index];
} }
app.component.ts : Entrainer le modèle
onTrainModel() {
const inputs:tf.Tensor2D=tf.tensor2d(this.xs);
const targets:tf.Tensor2D=tf.tensor2d(this.ys);
const inputsTest:tf.Tensor2D=tf.tensor2d(this.xsTest);
const targetsTest:tf.Tensor2D=tf.tensor2d(this.ysTest);
this.model.fit(inputs,targets,{
epochs:this.epochs,
validationData:[inputsTest,targetsTest],
callbacks:{
onEpochEnd:(epoch,logs)=>{
this.currentEpoch=epoch;
this.currentLoss=logs.loss;
this.currentAccuracy=logs.acc;
}
}
}).then(resp=>{ }); }
app.component.ts : Save the model
onSaveModel() {
this.model.save('localstorage://irisModel')
.then(result=>{
alert('Success saving model!');
},err=>{
alert('Error saving Model!');
})
}
app.component.ts : Load the model
onLoadModel() {
tf.loadLayersModel('localstorage://irisModel')
.then(m=>{
this.model=m;
this.model.compile({
optimizer:tf.train.adam(this.learningRate),
loss:tf.losses.meanSquaredError,
metrics:['accuracy']
});
this.modelCreated=true;
alert("Model loaded!");
})
}
app.component.ts : Evaluate the model
onEvalModel() {
let inputsTest=tf.tensor2d(this.xsTest);
let targetTest=tf.tensor2d(this.ysTest);
let yTrue=targetTest.argMax(-1).dataSync();
let predictions=this.model.predict(inputsTest);
// @ts-ignore
let yPredictions=predictions.argMax(-1).dataSync();
this.correctEval=0;
this.wrongEval=0;
for (let i = 0; i < yPredictions.length; i++) {
if(yTrue[i]==yPredictions[i]) ++this.correctEval
else ++this.wrongEval;
}}
app.component.ts : Prediction
onPredict(value: any) {
let x1=parseFloat(value.SepalLengthCm);
let x2=parseFloat(value.SepalWidthCm);
let x3=parseFloat(value.PetalLengthCm);
let x4=parseFloat(value.PetalWidthCm);
let input=tf.tensor2d([[x1,x2,x3,x4]]);
const prediction=this.model.predict( input);
// @ts-ignore
let index=prediction.argMax(-1).dataSync()[0];
this.prediction=this.irisClasses[index];
}
}
app.component.html : Boutons des opérations sur le tensors
<div class="container">
<p></p>
<div class="row">
<ul class="nav nav-pills">
<li> <button class="btn btn-primary" (click)="onMult()">Mat Mul</button> </li>
<li> <button class="btn btn-primary" (click)="onTranspose('X')">Transpose X</button> </li>
<li> <button class="btn btn-primary" (click)="onTranspose('Y')">Transpose Y</button> </li>
<li> <button class="btn btn-primary" (click)="onRelu('X')">RELU (X)</button> </li>
<li> <button class="btn btn-primary" (click)="onSigmoid('X')">Sigmoid (X)</button> </li>
</ul>
</div>
<p></p>
app.component.html : Affichage des données des tensors
<div class="row">
<p> Operation : {{operation}} </p>
<div class="col-md-5" *ngFor="let t of tensors | keyvalue">
<div class="panel panel-primary">
<div class="panel-heading">Tensor {{t.key}}</div>
<div class="panel-body">
<table class="table">
<tr *ngFor="let line of t.value.arraySync()">
<td *ngFor="let v of line">{{v|number:'0.2'}}</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>
app.component.html : Modèle
<div class="container">
<div class="panel panel-default">
<div class="panel-heading">Neural Net Model</div>
<div class="panel-body">
<ul class="nav nav-pills">
<li><button class="btn btn-success" (click)="onCreateModel()">Create Model</button></li>
<li><button class="btn btn-success" (click)="onLoadData()">Load Data</button></li>
<li><button class="btn btn-success" (click)="onTrainModel()">Train</button></li>
<li><button class="btn btn-success" (click)="onSaveModel()">Save Model</button></li>
<li><button class="btn btn-success" (click)="onLoadModel()">Load Model</button></li>
<li><button class="btn btn-success" (click)="onEvalModel()">Evaluate Model</button></li>
</ul>
app.component.html : Modèle
<div class="row">
<div class="col-md-8">
<progress-bar [progress]="currentEpoch" [color-degraded]="{'0': '#00cbcb', '15': '#f9c3d3', '25':
'#fd8c8e'}"></progress-bar>
</div>
<div class="col-md-4">
<label>Loss: {{currentLoss}}</label>
<label>Accuracy: {{currentAccuracy}}</label>
<label>Evaluation: {{100*correctEval/(correctEval+wrongEval)}} %</label>
</div>
</div>
app.component.html : Modèle
<div class="row" *ngIf="modelCreated">
<div class="row">
<div class="col-md-4">
<img src="assets/images/model.png" width="300" >
</div>
<div class="col-md-4">
<div class="panel panel-default">
<div class="panel-heading">Prediction :<strong>{{prediction}}</strong></div>
<div class="panel-body">
<form #f="ngForm" (ngSubmit)="onPredict(f.value)">
<div class="form-group">
<label class="control-label">SepalLengthCm:</label>
<input class="form-control" type="text" name="SepalLengthCm" ngModel=""
[(ngModel)]="example.SepalLengthCm">
</div>
app.component.html : Modèle
<div class="form-group">
<label class="control-label">SepalWidthCm:</label>
<input class="form-control" type="text" name="SepalWidthCm" ngModel=""
[(ngModel)]="example.SepalWidthCm">
</div>
<div class="form-group">
<label class="control-label">PetalLengthCm:</label>
<input class="form-control" type="text" name="PetalLengthCm" ngModel=""
[(ngModel)]="example.PetalLengthCm">
</div>
<div class="form-group">
<label class="control-label">PetalWidthCm:</label>
<input class="form-control" type="text" name="PetalWidthCm" ngModel=""
[(ngModel)]="example.PetalWidthCm">
</div>
<button type="submit">Predict</button>
app.component.html : Modèle
</form>
</div>
</div>
</div>
<div class="col-md-3">
<img src="assets/images/{{prediction}}.png" width="200">
</div>
</div>
app.component.html : Modèle
<div class="col-md-6">
<table class="table" *ngIf="xs">
<tr>
<th>SepalLengthCm</th> <th>SepalWidthCm</th>
<th>PetalLengthCm</th> <th>PetalWidthCm</th>
<th>Species</th>
</tr>
<tr *ngFor="let d of xs; let i=index">
<td>{{xs[i][0]}}</td> <td>{{xs[i][1]}}</td>
<td>{{xs[i][2]}}</td> <td>{{xs[i][3]}}</td>
<td>{{getIrisClass(ys[i])}}</td>
</tr>
</table>
</div> </div></div>
</div>
</div>
https://github.com/mohamedYoussfi/angular-ml5.js-mobilenet-feature-extractor
angular.json
ngOnInit(): void {
this.mobileNetFeatureExtractor = ml5.featureExtractor('MobileNet', () => {
this.featureClassifier = this.mobileNetFeatureExtractor.classification(this.video.nativeElement, () => {
console.log('Vidéo ready');
});
});
}
app.component.ts : Ajouter une image au modèle capturée par la caméra
addImage() {
this.featureClassifier.addImage(this.newLabel);
this.capture();
}
app.component.ts : Entrainer le modèle
train() {
this.iteration = 0; this.loss = 0; this.currentProgress = 0;
this.featureClassifier.train((loss) => {
if (loss == null) {
this.iteration = 100;
this.mobileNetFeatureExtractor.classify((e, r) => {
this.gotResults(e, r);
});
} else {
this.zone.run(() => {
++this.currentProgress; ++this.iteration; this.loss = loss;
});
}
});
}
app.component.ts : Afficher la capture de la améra
public ngAfterViewInit() {
if ( navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
navigator.mediaDevices.getUserMedia({ video: true })
.then(stream => {
this.video.nativeElement.srcObject = stream;
this.video.nativeElement.play();
});
}
}
app.component.ts : Faire une capture d’une image avec la UserCam
public capture() {
const context = this.canvas.nativeElement.getContext('2d’)
.drawImage(this.video.nativeElement, 0, 0, 320, 240);
this.captures.push(this.canvas.nativeElement.toDataURL('image/png'));
}
app.component.ts : Prédiction de l’objet présenté à la caméra
gotResults(err, results) {
if (err) { console.log(err); } else {
this.zone.run(() => {
this.label = results[0].label;
this.confidence = results[0].confidence;
});
this.mobileNetFeatureExtractor.classify((e, r) => {
this.gotResults(e, r);
});
}
}
}
app.component.html:
<p></p>
<div class="container">
<div class="form-group">
<label class="control-label">Label:</label>
<input type="text" [(ngModel)]="newLabel">
<button (click)="addImage()" class="btn btn-primary">Add Image</button>
<button (click)="train()" class="btn btn-danger">Train</button>
</div>
app.component.html: Progress Bar et affichage de itération et loss
<div class="row">
<div class="col-md-4">
<progress-bar [progress]="currentProgress" [color-degraded]="{'0': '#00cbcb', '15':
'#f9c3d3', '25': '#fd8c8e'}"></progress-bar>
</div>
<div class="col-md-4">
<p>Itération :{{iteration}}</p>
<p>Loss:{{loss}}</p>
</div>
</div>
app.component.html: Affichage de la WebCam et des prédictions label et confidence
<div>
<div class="panel panel-default">
<div class="panel-heading">
<h3>{{label}} | {{confidence*100 | number : '0.1'}} %</h3>
</div>
<div class="panel-body">
<video #video id="video" width="320" height="240" autoplay class="img-thumbnail"></video>
<canvas #canvas id="canvas" width="320" height="240" class="img-thumbnail"></canvas>
</div>
app.component.html: Affichage de la liste des images capturées
<div class="panel-body">
<ul class="nav nav-pills">
<li *ngFor="let c of captures" class="list-group-item">
<img src="{{ c }}" height="50" />
</li>
</ul>
</div>
</div>
</div>
<div>
</div>
</div>
Deeplearning4J : Machines et Deep Learning four les applications Java
• Deep Learning 4j est une Framework open source (licence Apache) qui permet de construire,
entraîner et tester une grande diversité d’algorithmes de Deep Learning (depuis les réseaux
standard, jusqu’aux réseaux à convolutions, en passant par des architectures plus complexes).
• Il se base sur sa structure de données (Nd4j) permettant d’effectuer les opérations de l’algèbre
linéaires sur les architectures massivement parallèles GPU et les architectures distribuées
• Nd4j utilise du code natif ( Cuda oblige), et alloue de l’espace or du tas Java. Ceci est
impérativement à prendre en compte lorsque la volumétrie des données est importante.
• ND4J permet de réaliser des manipulations des calculs linéaires et matriciel dans un
environnement de production.
• Elle s'intègre à Apache Hadoop et Spark pour fonctionner avec des unités centrales
de traitement (UC) ou des unités de traitement graphiques (GPU). Il prend en charge
les tableaux n-dimensionnels pour les langages basés sur JVM.
• ND4J est un logiciel gratuit et à code source ouvert, publié sous Apache License 2.0,
et développé principalement par le groupe basé à San Francisco qui a créé
Deeplearning4j, sous une licence Apache.
Dépendances Maven
<!– Cœur de DL4J --> <!– ND4J Natif pour CPU -->
<dependency>
<dependency>
<groupId>org.nd4j</groupId>
<groupId>org.deeplearning4j</groupId> <artifactId>nd4j-native-platform</artifactId>
<artifactId>deeplearning4j-core</artifactId> <version>1.0.0-beta3</version>
</dependency>
<version1.0.0-beta3</version>
<!– User Interface de DL4J -->
</dependency> <dependency>
<!– ND4J Pour basée sur CUDA pour les GPUs--> <groupId>org.deeplearning4j</groupId>
<artifactId>deeplearning4j-ui_2.11</artifactId>
<dependency>
<version>1.0.0-beta3</version>
<groupId>org.nd4j</groupId> </dependency>
<artifactId>nd4j-cuda-8.0- <dependency>
platform</artifactId> <groupId>org.slf4j</groupId>
<version1.0.0-beta3</version> <artifactId>slf4j-simple</artifactId>
<version>1.6.1</version>
</dependency>
</dependency>
Dépendances Maven
• ND4J est une bibliothèque de calcul scientifique et d'algèbre linéaire, écrite en langage de
programmation Java, fonctionnant sur la machine virtuelle Java (JVM) et compatible avec d'autres
langages tels que Scala et Clojure.
• ND4J a été à la base de la contribution de la fondation Eclipse en octobre 2017.
• ND4J permet de réaliser des manipulations de calcul linéaire et matriciel dans un environnement
de production.
• Il s'intègre à Apache Hadoop et Spark pour fonctionner avec des unités centrales de traitement
(UC) ou des unités de traitement graphiques massivement parallèle (GPU).
• Il prend en charge les tableaux n-dimensionnels pour les langages basés sur JVM.
• ND4J est une laibririe Open source, publié sous Apache License 2.0, et développé principalement
par le groupe basé à San Francisco qui a créé Deeplearning4j.
• Les opérations de ND4J incluent des versions parallèles distribuées.
• Les opérations peuvent se dérouler dans un cluster et traiter d’énormes quantités de données.
• La manipulation matricielle se produit en parallèle sur les processeurs ou les GPU sur le cloud
computing et peut fonctionner dans les clusters Apache Spark ou Hadoop.
Utilisation de ND4J : Maven dependencies
<dependencies>
<!-- https://mvnrepository.com/artifact/org.nd4j/nd4j-native-platform -->
<dependency>
<groupId>org.nd4j</groupId>
<artifactId>nd4j-native-platform</artifactId>
<version>1.0.0-beta3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.nd4j/nd4j-cuda-9.2-platform -->
<dependency>
<groupId>org.nd4j</groupId>
<artifactId>nd4j-cuda-9.2-platform</artifactId>
<version>1.0.0-beta3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.6.1</version>
</dependency>
</dependencies>
Utilisation de ND4J
• En termes d'encodage, un NDArray peut être encodé dans l'ordre C (row-major) ou Fortran (column-
major).
• Nd4J peut utiliser simultanément une combinaison de tableaux d’ordres C et F.
• La plupart des utilisateurs peuvent simplement utiliser l'ordre de tableau par défaut, mais notez qu'il est
possible d'utiliser un ordre spécifique pour un tableau donné, le cas échéant.
t1,Rank: 2,Offset: 0
Nd4j.setDataType(DataBuffer.Type.DOUBLE);
Order: c Shape: [4,2], stride: [2,1]
[[ 5.0000, 7.0000],
[ 8.0000, 9.0000],
INDArray t1=Nd4j.create(new [ 3.0000, 4.0000],
double[][]{{5,7},{8,9},{3,4},{1,3}}); [ 1.0000, 3.0000]]
t2,Rank: 2,Offset: 0
System.out.println("t1,"+t1.shapeInfoToString()); Order: c Shape: [2,3], stride: [3,1]
System.out.println(t1); [[ 5.0000, 7.0000, 5.0000],
[ 8.0000, 9.0000, 5.0000]]
INDArray t2=Nd4j.create(new t3,Rank: 2,Offset: 0
Order: f Shape: [4,3], stride: [1,4]
double[][]{{5,7,5},{8,9,5}}); [[ 81.0000, 98.0000, 60.0000],
System.out.println("t2,"+t2.shapeInfoToString()); [ 112.0000, 137.0000, 85.0000],
[ 47.0000, 57.0000, 35.0000],
System.out.println(t2); [ 29.0000, 34.0000, 20.0000]]
INDArray t3=t1.mmul(t2);
System.out.println("t3,"+t3.shapeInfoToString());
System.out.println(t3);
Utilisation de ND4J , Création des NDArray => vstack, hstack
• Création de NDArrays à partir d'autres NDArrays ****************
• Il existe trois méthodes principales pour créer des [[ 1.0000, 1.0000, 0, 0],
NDArrays à partir d'autres table NDArrays: [ 1.0000, 1.0000, 0, 0],
• Création d'une copie exacte d'un NDArray existant à [ 1.0000, 1.0000, 0, 0]]
l'aide de INDArray.dup () ****************
• Créer le tableau en tant que sous-ensemble d'un [[ 1.0000, 1.0000],
[ 1.0000, 1.0000],
NDArray existant
[ 1.0000, 1.0000],
• Combinez plusieurs NDArrays existants pour créer un [ 0, 0],
nouveau NDArray [ 0, 0],
[ 0, 0]]
INDArray tens6=Nd4j.hstack(tens1,tens2);
INDArray tens7=Nd4j.vstack(tens1,tens2);
System.out.println("****************");
System.out.println(tens6.toString());
System.out.println("****************");
System.out.println(tens7.toString());
Utilisation de ND4J : Création des NDArray => combine
### COMBINED dimension 0####
int nRows = 2; [[0.00, 0.00],
int nColumns = 2;
[0.00, 0.00],
[1.00, 1.00],
//INDArray of zeros
[1.00, 1.00]]
INDArray zeros = Nd4j.zeros(nRows, nColumns); ### COMBINED dimension 1 ####
// Create one of all ones [[0.00, 0.00, 1.00, 1.00],
INDArray ones = Nd4j.ones(nRows, nColumns); [0.00, 0.00, 1.00, 1.00]]
// Concat on dimension 0
INDArray combined = Nd4j.concat(0,zeros,ones);
System.out.println("### COMBINED dimension 0####");
System.out.println(combined);
//Concat on dimension 1
INDArray combined2 = Nd4j.concat(1,zeros,ones);
System.out.println("### COMBINED dimension 1 ####");
System.out.println(combined2);
Utilisation de ND4J : Création des NDArray => pad
### Padded ####
[[0.00, 0.00, 0.00, 0.00],
int nRows = 2;
[0.00, 1.00, 1.00, 0.00],
int nColumns = 2; [0.00, 1.00, 1.00, 0.00],
[0.00, 0.00, 0.00, 0.00]]
// Create INDArray of all ones
INDArray ones = Nd4j.ones(nRows, nColumns);
// pad the INDArray
INDArray padded = Nd4j.pad(ones, new
int[]{1,1}, Nd4j.PadMode.CONSTANT );
System.out.println("### Padded ####");
System.out.println(padded);
Utilisation de ND4J : Création des NDArray => diag
********************a=
System.out.println(data); 0.4446452856063843
0.31768351793289185
0.15411998331546783
0.07683958858251572
10.0
NdIndexIterator iterator=new
0.05254953354597092
NdIndexIterator(new int[]{3,3}); 0.4882369637489319
0.6860827803611755
while (iterator.hasNext()){ 0.692496120929718
long[] index=iterator.next();
System.out.println(data.getDouble(index));
}
Utilisation de ND4J : Création des NDArray => getRow() and putRow()
data.putRow(0,d1); *************
System.out.println(data); [[ 0.4688, 0.4689, 0.0496]]
System.out.println("*************");
System.out.println(data.getRow(2));
Utilisation de ND4J : Création des NDArray => tensorAlongDimension
• ND4J définit :
• 5 catégories d’oprations qui peuvent être appliquées aux tensors :
• Scalar
• Transform
• Accumulation
• Index Accumulation
• Broadcast
• Et deux méthodes execution pour chacune:
• Sur la totalité d’un INDArray,
• Ou sur une dimention d’un INDArray
• Les opérations peuvent agir de deux manières “in-place” qui modifie le contenu du tensor
ou “Copy” qui crée une copie résultat de l’opération.
• Par exemple pour additionner deux INDArrays. Nd4j ddéfinie deux méthodes :
• INDArray.add(INDArray)
• INDArray.addi(INDArray).
Utilisation de ND4J : Scalar Ops
System.out.println(t);
System.out.println(tanh);
Utilisation de ND4J : Accumulation (Reduction) Ops
System.out.println(argMaxCols);
System.out.println(argMaxRows);
Utilisation de ND4J : Broadcast and Vector Ops
System.out.println(res.dataType());
System.out.println(res.data());
data.csv
Paramètres:
int batchSize=1; int outputSize=3; int classIndex=4;
double learninRate=0.001;
int inputSize=4; int numHiddenNodes=10;
int nEpochs=100;
String[] labels={"Iris-setosa","Iris-versicolor","Iris-
virginica"};
Application : Classifieur Multi-classes :
Création du modèle
MultiLayerConfiguration configuration=new NeuralNetConfiguration.Builder()
.seed(123)
.updater(new Adam(learninRate))
.list()
.layer(0,new DenseLayer.Builder()
.nIn(inputSize).nOut(numHiddenNodes).activation(Activation.SIGMOID).build())
.layer(1,new OutputLayer.Builder()
.nIn(numHiddenNodes).nOut(outputSize)
.lossFunction(LossFunctions.LossFunction.MEAN_SQUARED_LOGARITHMIC_ERROR)
.activation(Activation.SOFTMAX).build())
.build();
MultiLayerNetwork model=new MultiLayerNetwork(configuration);
model.init();
http://localhost:9000
Application : Classifieur Multi-classes :
Entrainement du modèle :
UIServer uiServer=UIServer.getInstance();
InMemoryStatsStorage inMemoryStatsStorage=new
InMemoryStatsStorage();
uiServer.attach(inMemoryStatsStorage);
File fileTrain=new ClassPathResource("iris-
train.csv").getFile();
RecordReader recordReaderTrain=new CSVRecordReader();
recordReaderTrain.initialize(new FileSplit(fileTrain));
DataSetIterator dataSetIteratorTrain=
new
RecordReaderDataSetIterator(recordReaderTrain,batchSize,class
Index,outputSize);
for (int i = 0; i <nEpochs ; i++) {
model.fit(dataSetIteratorTrain);
}
Application : Classifieur Multi-classes :
Evaluation du modèle :
System.out.println("Model Evaluation"); Model Evaluation
================Evaluation
File fileTest=new ClassPathResource("irisTest.csv").getFile();
Metrics===============
RecordReader recordReaderTest=new CSVRecordReader(); # of classes: 3
recordReaderTest.initialize(new FileSplit(fileTest)); Accuracy: 1,0000
DataSetIterator dataSetIteratorTest=
Precision: 1,0000
Recall: 1,0000
new RecordReaderDataSetIterator(recordReaderTest,batchSize,classIndex,outputSize); F1 Score: 1,0000
Evaluation evaluation=new Evaluation(outputSize); Precision, recall & F1: macro-
averaged (equally weighted avg.
of 3 classes)
while (dataSetIteratorTest.hasNext()){
DataSet dataSet = dataSetIteratorTest.next(); =====Confusion Matrix========
INDArray features=dataSet.getFeatures(); 0 1 2
INDArray labels=dataSet.getLabels();
-------
10 0 0 | 0 = 0
INDArray predicted=model.output(features); 0 10 0 | 1 = 1
evaluation.eval(labels,predicted); 0 0 10 | 2 = 2
}
System.out.println(evaluation.stats());
Application : Classifieur Multi-classes :
Prédiction :
System.out.println("Prédiction"); Prédiction
**************
INDArray input= Nd4j.create(new double[][]{
[[ 0.9880, 0.0120, 4.8603e-7],
{5.1,3.5,1.4,0.2}, {4.9,3.0,1.4,0.2}, [ 0.9852, 0.0148, 6.8171e-7],
{6.7,3.1,4.4,1.4}, {5.6,3.0,4.5,1.5}, [ 0.0119, 0.9657, 0.0224],
{6.0,3.0,4.8,1.8}, {6.9,3.1,5.4,2.1}
[ 0.0008, 0.6436, 0.3556],
[ 9.1299e-5, 0.2578, 0.7421],
}); [ 1.543e-5, 0.1004, 0.8996]]
System.out.println("**************"); -----------------
INDArray output=model.output(input); [0,
0,
INDArray classes=output.argMax(1);
1.0000,
System.out.println(output); 1.0000,
System.out.println("-----------------"); 2.0000,
System.out.println(classes);
2.0000]
****************
System.out.println("****************"); Iris-setosa
Iris-setosa
int[] predictions=classes.toIntVector(); Iris-versicolor
Iris-versicolor
for (int i = 0; i < predictions.length; i++) {
Iris-virginica
System.out.println(labels[predictions[i]]); Iris-virginica
}
Application : Classifieur Multi-classes :
@Override
public void start(Stage primaryStage) throws Exception {
BorderPane borderPane=new BorderPane();
HBox hBoxTop=new HBox(10); hBoxTop.setPadding(new Insets(10));
Button buttonCreateModel=new Button("Create Model");
Button buttonLoadData=new Button("Load data");
Button buttonTrain=new Button("Train Model");
Button buttonEval=new Button("Evaluate Model");
Button buttonPrection=new Button("Predict");
Button buttonSaveModel=new Button("Save Model");
Button buttonLoadModel=new Button("Load Model");
hBoxTop.getChildren().addAll(buttonCreateModel,buttonLoadData,buttonTrain,buttonEval,buttonPrection,buttonSaveMod
el,buttonLoadModel);
borderPane.setTop(hBoxTop);
Application Complète avec Interface graphique
gridPane.add(labelSepalLength,0,0); gridPane.add(textFieldSepalLength,1,0);
gridPane.add(labelSepalWidth,0,1); gridPane.add(textFieldSepalWidth,1,1);
gridPane.add(labelPetalLength,0,2); gridPane.add(textFieldPetalLength,1,2);
gridPane.add(labelPetalWidth,0,3); gridPane.add(textFieldPetalWidth,1,3);
gridPane.add(buttonPredict,0,4);
gridPane.add(labelPrection,0,5);
Image imagePrediction=new Image(new FileInputStream(new
ClassPathResource("images/unknown.png").getFile()));
ImageView imageViewPrediction=new ImageView(imagePrediction);
hBoxPrediction.getChildren().add(gridPane);
hBoxPrediction.getChildren().add(imageViewPrediction);
tabPredictions.setContent(hBoxPrediction);
tabPane.getTabs().add(tabPredictions);
HBox hBoxCenter=new HBox(10);hBoxCenter.setPadding(new Insets(10));
VBox vBox1=new VBox(10);vBox1.setPadding(new Insets(10));
Application Complète avec Interface graphique
buttonCreateModel.setOnAction(evr->{
new Thread(()->{
MultiLayerConfiguration configuration=new NeuralNetConfiguration.Builder()
.seed(123)
.updater(new Adam(learninRate))
.list()
.layer(0,new DenseLayer.Builder()
.nIn(inputSize)
.nOut(numHiddenNodes)
.activation(Activation.SIGMOID).build())
.layer(1,new OutputLayer.Builder()
.nIn(numHiddenNodes)
.nOut(outputSize)
.lossFunction(LossFunctions.LossFunction.MEAN_SQUARED_LOGARITHMIC_ERROR)
.activation(Activation.SOFTMAX).build())
.build();
model=new MultiLayerNetwork(configuration);
model.init();
imageView.setVisible(true);
}).start();
});
Application Complète avec Interface graphique
buttonLoadData.setOnAction(evt->{
NumberFormat numberFormat=new DecimalFormat("#0.00");
for (int i = 0; i < featuresLabels.length; i++) {
TableColumn<Map<String,Object>,String> column=new TableColumn<>(featuresLabels[i]);
column.setCellValueFactory(p->{
return new SimpleObjectProperty(p.getValue().get(p.getTableColumn().getText()));
});
column.setCellFactory(p->{
TableCell tableCell=new TableCell(){
@Override
protected void updateItem(Object item, boolean empty) {
super.updateItem(item, empty); if(item instanceof Number) this.setText(numberFormat.format(item));
else if(item==null) this.setText("NULL"); else this.setText(item.toString());
}
};
return tableCell;
});
tableViewData.getColumns().add(column);
}
TableColumn<Map<String,Object>,String> tableColumnLabel=new TableColumn<>("Label");
tableColumnLabel.setCellValueFactory(p->{
return new SimpleObjectProperty(p.getValue().get(p.getTableColumn().getText()));
});
tableViewData.getColumns().add(tableColumnLabel);
viewDataSet("iris-train.csv",tableViewData);
});
Application Complète avec Interface graphique
buttonTrain.setOnAction(evt->{
new Thread(()->{
try {
progressBar.setProgress(0); progressValue=0; UIServer uiServer=UIServer.getInstance();
inMemoryStatsStorage=new InMemoryStatsStorage(); uiServer.attach(inMemoryStatsStorage);
//model.setListeners(new ScoreIterationListener(10));
model.setListeners(new StatsListener(inMemoryStatsStorage));
Platform.runLater(()->{
vBox1.setVisible(true); webEngine.load("http://localhost:9000");
});
File fileTrain=new ClassPathResource("iris-train.csv").getFile();
RecordReader recordReaderTrain=new CSVRecordReader();
recordReaderTrain.initialize(new FileSplit(fileTrain));
DataSetIterator dataSetIteratorTrain=
new RecordReaderDataSetIterator(recordReaderTrain,batchSize,classIndex,outputSize);
for (int i = 0; i <nEpochs ; i++) {
model.fit(dataSetIteratorTrain);
Platform.runLater(()->{
progressValue+=(1.0/nEpochs);
progressBar.setProgress(progressValue);
});
}
} catch (Exception e) {
e.printStackTrace();
}
}) .start();
});
Application Complète avec Interface graphique
buttonEval.setOnAction(evt->{
new Thread(()->{
try {
System.out.println("Model Evaluation");
File fileTest=new ClassPathResource("irisTest.csv").getFile();
RecordReader recordReaderTest=new CSVRecordReader();
recordReaderTest.initialize(new FileSplit(fileTest));
DataSetIterator dataSetIteratorTest=
new RecordReaderDataSetIterator(recordReaderTest,batchSize,classIndex,outputSize);
Evaluation evaluation=new Evaluation(outputSize);
while (dataSetIteratorTest.hasNext()){
DataSet dataSet = dataSetIteratorTest.next();
INDArray features=dataSet.getFeatures();
INDArray labels=dataSet.getLabels();
INDArray predicted=model.output(features);
evaluation.eval(labels,predicted);
}
textAreaConsole.appendText(evaluation.stats());
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
});
Application Complète avec Interface graphique
buttonDataTrain.setOnAction(evt->{
viewDataSet("iris-train.csv",tableViewData);
});
buttonDataTest.setOnAction(evt->{
viewDataSet("irisTest.csv",tableViewData);
});
buttonPredict.setOnAction(evt->{
try {
double sl=Double.parseDouble(textFieldSepalLength.getText());
double sw=Double.parseDouble(textFieldSepalWidth.getText());
double pl=Double.parseDouble(textFieldPetalLength.getText());
double pw=Double.parseDouble(textFieldPetalWidth.getText());
System.out.println("Prediction :");
INDArray input= Nd4j.create(new double[][]{{sl,sw,pl,pw}});
INDArray ouput=model.output(input);
textAreaConsole.appendText(ouput.toString());
String labelOutput=labels[Nd4j.argMax(ouput).getInt(0)];
labelPrection.setText(labelOutput);
imageViewPrediction.setImage(new Image(new FileInputStream(new ClassPathResource("images/"+labelOutput+".png").getFile())));
} catch (IOException e) {
e.printStackTrace();
}
});
}
Application Complète avec Interface graphique
while (dataSetIterator.hasNext()){
DataSet dataSet=dataSetIterator.next();
INDArray features=dataSet.getFeatures();
INDArray targets=dataSet.getLabels();
for (int k = 0; k <batchSize ; k++) {
INDArray batchFeature=features.getRow(k); INDArray batchLabel=targets.getRow(k);
Map<String,Object> data=new HashMap<>(); double[] row=batchFeature.toDoubleVector();
INDArray rowLabels=batchLabel.getRow(0);
for (int j = 0; j <row.length ; j++) {
data.put(featuresLabels[j],row[j]);
}
data.put("Label",labels[rowLabels.argMax().getInt(0)]); tableView.getItems().add(data);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Application 2 : Classification des images en utilisant CNN
https://github.com/mohamedYoussfi/deeplearning4j-cnn-mnist-app
========================Evaluation Metrics========================
# of classes: 10
Accuracy: 0,9851
Precision: 0,9853
Recall: 0,9849
F1 Score: 0,9850
Precision, recall & F1: macro-averaged (equally weighted avg. of 10 classes)
Application 2 : Classification des images en utilisant CNN
Entrainement et évaluation du modèle pour chaque époque
=========================Confusion Matrix=========================
0 1 2 3 4 5 6 7 8 9
---------------------------------------------------
973 2 0 0 1 0 0 2 0 2 | 0 = 0
0 1131 0 1 0 0 2 0 1 0 | 1 = 1
3 2 1012 0 2 0 0 8 5 0 | 2 = 2
1 0 2 992 0 4 0 4 7 0 | 3 = 3
0 0 0 0 981 0 0 0 1 0 | 4 = 4
3 0 0 5 0 870 4 3 4 3 | 5 = 5
9 4 0 0 6 0 939 0 0 0 | 6 = 6
0 4 6 0 0 0 0 1016 1 1 | 7 = 7
6 1 1 0 2 0 0 2 961 1 | 8 = 8
3 4 0 1 14 2 0 6 3 976 | 9 = 9
@Override
public void start(Stage stage) throws Exception {
canvas = new Canvas(canvasWidth, canvasHeight);
GraphicsContext ctx = canvas.getGraphicsContext2D();
ImageView imgView = new ImageView(); imgView.setFitHeight(28);
imgView.setFitWidth(28);
ctx.setLineWidth(10); ctx.setLineCap(StrokeLineCap.SQUARE);
Label labelMessage=new Label("Draw a digit and Tape Enter de predict"+System.lineSeparator()+" Right Mouse
click to clear");
Label lblResult = new Label(); lblResult.setFont(new Font(30));
Button buttonLearn=new Button("Learn This Gigit to the Model");
Button buttonSaveModel=new Button("Save the Current Model");
UI Application avec JavaFX : Construire l’interface
canvas.setOnMousePressed(e -> {
ctx.setStroke(Color.WHITE); ctx.beginPath();
ctx.moveTo(e.getX(), e.getY());
ctx.stroke();
canvas.requestFocus();
});
UI Application avec JavaFX : Dessiner
canvas.setOnMouseDragged(e -> {
ctx.setStroke(Color.WHITE);
ctx.lineTo(e.getX(), e.getY());
ctx.stroke();
canvas.requestFocus();
});
UI Application avec JavaFX : Effacer le canvas
canvas.setOnMouseClicked(e -> {
if (e.getButton() == MouseButton.SECONDARY) {
clear(ctx);
}
canvas.requestFocus();
});
canvas.setOnKeyReleased(e -> {
if (e.getCode() == KeyCode.ENTER) {
BufferedImage scaledImg = getScaledImage(canvas);
imgView.setImage(SwingFXUtils.toFXImage(scaledImg, null));
try {
predictImage(scaledImg, lblResult);
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
clear(ctx);
canvas.requestFocus();
UI Application avec JavaFX : Prédiction de l’image dessinée
buttonLearn.setOnAction(evt->{
if(currentImage!=null) gridPane.setDisable(false);
});
UI Application avec JavaFX : Enregistrer le modèle
buttonSaveModel.setOnAction(evt->{
try {
ModelSerializer.writeModel(net,new File(basePath+"/model.zip"),true);
} catch (IOException e) {
e.printStackTrace();
}
});
}
UI Application avec JavaFX : Apprendre une nouvelle forme
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ML5</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.7.3/p5.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.7.3/addons/p5.dom.min.js"></script>
<script src="app.js"></script>
<script src="https://unpkg.com/[email protected]/dist/ml5.min.js"></script>
</head>
<body>
</body>
</html>
app.js
let mobilenet
let image;
function setup(){
createCanvas(640,480);
image=createImg('images/cat3.jpg',function(){
image(image,10,10);
}); image.hide(); background(0);
mobilenet=ml5.imageClassifier('MobileNet', function(){
mobilenet.predict(image,function(err,result){
if(err) console.log(err);
else{
console.log(result); let label=result[0].className;
let p=result[0].probability*100; fill(255);
textSize(20); text(label+" ( "+p.toFixed(2)+"% )",10,height-60);
createP(label); createP(p);
}})})
}
Version avec Vidéo
let mobilenet; let video; let label="";
function setup(){
createCanvas(640,480);
video=createCapture(VIDEO); video.hide();
background(0);
mobilenet=ml5.imageClassifier('MobileNet',video,ready);
}
function ready(){ mobilenet.predict(gotResults); }
function gotResults(err,results){
if(err) console.log(err);
else{
label=results[0].className;
let p=results[0].probability*100;
mobilenet.predict(gotResults);
}
}
function draw(){
background(0); image(video,10,10,320,240);
fill(255); textSize(20);
text(label,10,height-60);
}
Extraction des caractéristiques avec MobileNet : Images Extraite d’une vidéo
Index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ML5</title>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.7.3/p5.js"></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.7.3/addons/p5.dom.min.js"></sc
ript>
<script src="sketch.js"></script>
<script src="https://unpkg.com/[email protected]/dist/ml5.min.js"></script>
</head>
<body>
</body>
</html>
Version avec Vidéo
let mobilenet; let video; let label=""; function draw(){
let classifier; let addImageButton; let textInputLabel; background(0);
let imagesCount=0; let trainButton; image(video,10,10,320,240);
fill(255);
function setup(){ textSize(20);
text(label,10,height-60);
createCanvas(640,480); video=createCapture(VIDEO);
}
video.hide(); background(0);
mobilenet=ml5.featureExtractor('MobileNet',modelReady); function modelReady(){
textInputLabel=createInput("bouteille"); console.log("model ready");
classifier=mobilenet.classification(video,videoReady);
addImageButton=createButton("Add Image"); //mobilenet.predict(gotResults);
trainButton=createButton("Train The model"); }
addImageButton.mousePressed(function(){
let labelValue=textInputLabel.value(); function videoReady(){
console.log("video ready");
classifier.addImage(labelValue); ++imagesCount; }
console.log(imagesCount+" : "+labelValue);
}); function gotResults(err,results){
if(err)
trainButton.mousePressed(function(){
console.log(err);
classifier.train(function(loss){ else{
if(loss==null){ label=results;
mobilenet.classify(gotResults);
console.log("Model trained");
}
classifier.classify(gotResults()); }
}
else{ console.log(loss); }
})});
}
Quelques Applications de Deep Learning
http://www.divertissonsnous.com/2017/11/24/un-systeme-de-
reconnaissance-des-formes-applique-a-times-square/
• Reconnaissance de formes
• Reconnaissance vocale
• Traduction vocale
• Modèles génératifs (Donner une série d’images à
un réseaux profond et le forcer à y voir autres
choses)
• Etc.
https://deepdreamgenerator.com/
Références :
• https://deeplearning4j.org/
• https://js.tensorflow.org/
• https://ml5js.org/
• https://keras.io/
• https://p5js.org/
• https://www.lafabriquedunet.fr/blog/definition-data-science/
• https://www.youtube.com/watch?v=oU7tSpvDOIs
• https://www.youtube.com/watch?v=trWrEWfhTVg
te
Sigmoid
Poids (Kg)
SoftMax
1 Maigreur (0,1)
Normale (0,1)
Surpoids (0,1)
Taille (cm)
2
Obèse (0,1)
Algèbre linéaire
10%
Probabilités et statistiques
15% 35%
Calculs de hautes
performances
15%
Algorithmique et
25% complexité
Pré-traitement de données
Evénement important : Compétitions de reconnaissance des images :
Large Scale Visual Recognition Challenge
2010 : 2011 :
• NEC : 28% ◦ XRCE : 26%
• XRCE : 34% ◦ UV A : 31%
• ISIL : 45% ◦ ISI : 36%
• UCI : 47% ◦ NII : 50%
• Hminmax : 54%
Agriculture Sécurité
Sport et Transport et
Divertissement Trafic Routier
Justice et
Transparence
SYSTEMES
SSDIA INTELLIGENCE
Rehabilitation in Special EDucation
EDUCATIFS ET
SOCIOPROFESSI ENSET, UH2C ARTIFICIELLE ET
SYSTEMES SSDIA, UH2C KOKURITSU Univ De Ch
O.Bouattane
ONNELS DECISIONNELS
45 E.CH.
https://cordis.europa.eu/project/rcn/212970/factsheet/en
Intelligence Artificielle pour le citoyen, au
service des citoyens et par le citoyen
Architecture
Education s Parallèles
Environne GPU
Open Systèmes
ment Santé Source Distribués
Ecologique
App
Réseaux & Mobiles
Sport et Télécom
Divertissem Sécurité IOT
ent SMA