Outils pour utilisateurs

Outils du site


l_intelligence_du_semaphore

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
l_intelligence_du_semaphore [2019/02/08 16:24]
serge
l_intelligence_du_semaphore [2020/02/04 17:43] (Version actuelle)
serge ↷ Liens modifiés en raison d'un déplacement.
Ligne 1: Ligne 1:
 ====== L'​intelligence du sémaphore ====== ====== L'​intelligence du sémaphore ======
 +<WRAP center round box 80% centeralign>​
 +**{{tagpage>​semaphore|Sémaphores}}** ​ ....  **{{tagpage>​bge|Blender Game Engine}}** ....  **{{tagpage>​ia|Intelligence Artificielle}}**
 +</​WRAP>​
 +<WRAP center round box 60% centeralign>​
 +C'est quoi un sémaphore ?
 +{{ youtube>​F3sY6_fOx2I?​medium }}
 +{{ chappe.jpeg?​400 }}
 +</​WRAP>​
  
 <WRAP center round box 60% centeralign>​ <WRAP center round box 60% centeralign>​
-**{{tagpage>​ia|Toutes les pages sur L'​Intelligence Artificielle}}**+**Calcul de [[Le sémaphore avec TensorFlow|Le sémaphore avec TensorFlow]] ​sur GPU au lieu du CPU avec TensorFlow**
 </​WRAP>​ </​WRAP>​
 +=====Les sources sur GitHub=====
 +  * **[[https://​github.com/​sergeLabo/​semaphore|semaphore chez github.com]]**
 +=====Les images utilisées pour l'​apprentissage=====
 +====Images sorties de Blender====
 +<WRAP group>
 +<WRAP third column>
 +{{media_03:​shot_0_a.png?​200|}}
 +</​WRAP>​
 +<WRAP third column>
 +{{media_03:​shot_1_b.png?​200|}}
 +</​WRAP>​
 +<WRAP third column>
 +{{media_03:​shot_2_c.png?​200|}}
 +</​WRAP>​
 +</​WRAP>​
 +====Images adaptées pour l'​apprentissage====
 +L'​optimisation a montré que la meilleure solution est avec ce type d'​image.
 +<WRAP group>
 +<WRAP third column>
 +{{media_01:​shot_0_a.png?​200|}}
 +</​WRAP>​
 +<WRAP third column>
 +{{media_01:​shot_1_.png?​200|}}
 +</​WRAP>​
 +<WRAP third column>
 +{{media_01:​shot_2_b.png?​200|}}
 +</​WRAP>​
 +</​WRAP>​
 +
  
 ===== Des maths ! ==== ===== Des maths ! ====
 ====Relu Rectifier neural networks==== ====Relu Rectifier neural networks====
 +{{ relu.jpg?​400 |}}
   * **[[https://​en.wikipedia.org/​wiki/​Rectifier_(neural_networks)|Rectifier (neural networks)]]** ​ sur Wikipedia en   * **[[https://​en.wikipedia.org/​wiki/​Rectifier_(neural_networks)|Rectifier (neural networks)]]** ​ sur Wikipedia en
 <code python> <code python>
Ligne 26: Ligne 64:
 <code python> <code python>
 def relu_prime(z):​ def relu_prime(z):​
-    """​La fonction de Heaviside (également fonction échelon unité, fonction +    """​La fonction de Heaviside (également fonction échelon unité, fonction marche d'​escalier) est la fonction indicatrice de R. 
-    ​marche d'​escalier) est la fonction indicatrice de R. +    ​ 
-    Une fonction ​fonction indicatrice,​ est une fonction définie sur un +Une fonction indicatrice,​ est une fonction définie sur un ensemble E qui explicite l’appartenance ou non à un sous-ensemble F de E de tout élément de E.  
-    ​ensemble E qui explicite l’appartenance ou non à un sous-ensemble F de E +C'est donc la fonction H (discontinue en 0) prenant la valeur 1 pour tous les réels positifs et la valeur 0 pour les réels strictement négatifs.
-    ​de tout élément de E.  +
-    C'est donc la fonction H (discontinue en 0) prenant la valeur 1 pour tous +
-    ​les réels positifs et la valeur 0 pour les réels strictement négatifs.+
     """​     """​
     return np.asarray(z > 0, dtype=np.float32)     return np.asarray(z > 0, dtype=np.float32)
 </​code>​ </​code>​
 ====Sigmoïd==== ====Sigmoïd====
 +{{ sigmoid.png?​400 |}}
   * **[[https://​fr.wikipedia.org/​wiki/​Sigmo%C3%AFde_(math%C3%A9matiques)|Sigmoïde]]** ​ sur Wikipedia fr   * **[[https://​fr.wikipedia.org/​wiki/​Sigmo%C3%AFde_(math%C3%A9matiques)|Sigmoïde]]** ​ sur Wikipedia fr
-Elle représente la fonction de répartition de la loi logistique. Elle est souvent utilisée dans les réseaux de neurones parce qu'​elle est dérivable, ce qui est une contrainte pour l'​algorithme de [[https://​fr.wikipedia.org/​wiki/​R%C3%A9tropropagation_du_gradient|rétropropagation]] de Werbos. La forme de la dérivée de sa fonction inverse est extrêmement simple et facile à calculer, ce qui améliore les performances des algorithmes. ​+Elle représente la fonction de répartition de la loi logistique. Elle est souvent utilisée dans les réseaux de neurones parce qu'​elle est dérivable, ce qui est une contrainte pour l'​algorithme de [[https://​fr.wikipedia.org/​wiki/​R%C3%A9tropropagation_du_gradient|rétropropagation]] de [[https://​fr.wikipedia.org/​wiki/​Perceptron_multicouche#​Perceptron_multicouche_%C3%A0_r%C3%A9tropropagation|Werbos]]. La forme de la dérivée de sa fonction inverse est extrêmement simple et facile à calculer, ce qui améliore les performances des algorithmes. ​
 <code python> <code python>
 def sigmoid(x): def sigmoid(x):
-    """​la fonction sigmoïde est une courbe en S+    """​La fonction sigmoïde est une courbe en S."""​
-    https://fr.wikipedia.org/​wiki/​Sigmo%C3%AFde_(math%C3%A9matiques)"""​+
     return 1 / (1 + np.exp(-x))     return 1 / (1 + np.exp(-x))
 </​code>​ </​code>​
Ligne 52: Ligne 87:
     return z * (1 - z)     return z * (1 - z)
 </​code>​ </​code>​
-===== Réseau de neurones Perceptron multicouches ​ ===== 
  
-Un réseau de neurones Perceptron multicouches ​est un type de réseau ​de neurones artificiels dans lequel le motif de connexion entre les neurones est inspiré par le cortex visuel des animaux.+====Algorithme du gradient stochastique==== 
 +  * **[[https://​fr.wikipedia.org/​wiki/​Algorithme_du_gradient_stochastique|Algorithme du gradient stochastique]]** 
 +L'​algorithme du gradient stochastique ​est une méthode ​de descente ​de gradient (itérative) utilisée pour la minimisation d'une fonction objectif qui est écrite comme une somme de fonctions différentiables
  
 +====Diagonale de 1====
 +{{ media_01:​matrice_3x3_1.png?​200 |}}
  
-=====Code qui marche à 96 %===== +  numpy.eye(N,​ M=None, k=0, dtype=<class '​float'>,​ order='​C'​) 
-La totalité du projet ​est à **[[https://​github.com/​sergeLabo/​semaphore|Semaphore]]** sur Github, et  **[[jeu_du_semaphore_dans_le_blender_game_engine|Jeu du sémaphore dans le Blender Game Engine]]**+   
 +  Return a 2-D array with ones on the diagonal and zeros elsewhere. 
 +Matrice ou la sortie ​est idéale: le 1 correspond ​à entée[i] = sortie[i], et entée[j],sortie[k=0 si j différent de k
  
-<code python> +====Initialisation de X. Glorot et He==== 
-#!/usr/bin/env python3 +X = Xavier = prénom 
--*- coding: UTF-8 -*-+  * **[[http://deepdish.io/2015/​02/​24/​network-initialization/​|Initialization of deep networks]]**
  
-import shutil +===== Réseau de neurones Perceptron multicouches ​ ===== 
-import numpy as np +  * **[[https://​fr.wikipedia.org/​wiki/​Perceptron_multicouche|Perceptron multicouche]]** 
-import cv2 +Un réseau de neurones Perceptron multicouches est un type de réseau dont l'​information circule dans un unique sens, de la couche d'​entrée vers la couche de sortie. Ont dit qu'il est un réseau "à propagation directe"​ (feedforward).
-from pymultilame import MyTools+
  
  
-def sigmoid(x):​ +===== Réseau de neurones Convolutif ===== 
-    """​La fonction sigmoïde est une courbe en S: +  * **[[https://​fr.wikipedia.org/​wiki/​R%C3%A9seau_neuronal_convolutif|Réseau neuronal convolutif]]** 
-    https://​fr.wikipedia.org/​wiki/​Sigmo%C3%AFde_(math%C3%A9matiques) +Un réseau de neurones Convolutif est un type de réseau de neurones artificiels dans lequel le motif de connexion entre les neurones est inspiré par le cortex visuel des animaux. Actuellement,​ il est très utilisé pour l'​analyse des images, des vidéos et du langage naturel.
-    """​+
  
-    return 1 / (1 + np.exp(-x))+Ce type de réseau est développé avec [[yolo_avec_mes_propres_images|Yolo Darknet Préparation de mes propres images]] puis [[yolo_sans_carte_graphique|Yolo Darknet sans carte graphique]] et enfin [[yolo_darknet_sur_un_portable_optimus|Yolo Darknet sur un portable Optimus]].
  
-def sigmoid_prime(z):​ +=====Réseau ​de neurones Perceptron multicouches en python===== 
-    """​La dérivée ​de la fonction sigmoid, +**Du code expliqué avec beaucoup d'amour** 
-    soit sigmoid' ​comme f' ! +Enfin, là c'est de l'​intelligence qu'on cherche, pas de l'​amour.
-    """​+
  
-    return z (1 - z)+====Notre réseau==== 
 + **Une colonne de 1600 en entrée, 2 nodes de 100, une sortie de 27 caractères.**
  
-def relu(x): +{{ media_01:perceptron.svg.png?​1000 |}}
-    """​Rectifie les négatifs à 0: +
-    -1 > 0 +
-     1 > 1 +
-     ​Rectified Linear Unit:+
  
-    In the context of artificial neural networks, the rectifier is an +La totalité du projet est à **[[https://github.com/sergeLabo/​semaphore|Semaphore]]** ​sur Github, et  **[[jeu_du_semaphore_dans_le_blender_game_engine|Jeu du sémaphore dans le Blender Game Engine]]** pour la création des images.
-    activation function defined as the positive part of its argument. +
-    ​https://bit.ly/2HyT4ZO ​sur Wikipedia en. +
-     """​+
  
-    return np.maximum(0, x)+====Installation==== 
 +Installation de pip3: 
 +  sudo apt install pip3 
 +Installation de numpy et opencv 
 +  sudo pip3 install opencv numpy 
 +Il faut installer mon [[pymultilame|module python perso]] disponible sur Github 
 +  sudo pip3 install -e git+https://​github.com/​sergeLabo/​pymultilame.git#​egg=pymultilame 
 +   
 +====Le script==== 
 +<file python ia.py> 
 +#​!/​usr/​bin/​env python3 
 +# -*- coding: UTF-8 -*-
  
-def relu_prime(z):​ +import shutil 
-    """​Fonction:​ 1 pour tous les réels positifs ou nuls et 0 pour les réels négatifs.+import numpy as np 
 +import cv2 
 +from pymultilame import MyTools
  
-    La fonction de Heaviside ​(également fonction échelon unité, fonction +def sigmoid(x): return 1 / (1 + np.exp(-x)) 
-    marche d'​escalierest la fonction indicatrice de R+def sigmoid_prime(z):​ return z * (1 z) 
-    Une fonction fonction indicatrice,​ est une fonction définie sur un +def relu(x): return np.maximum(0, x) 
-    ensemble E qui explicite l’appartenance ou non à un sous-ensemble F de E +def relu_prime(z): ​return np.asarray(z > 0, dtype=np.float32)
-    de tout élément de E+
-    """​ +
- +
-    ​return np.asarray(z > 0, dtype=np.float32)+
  
 class SemaphoreIA:​ class SemaphoreIA:​
Ligne 140: Ligne 180:
  
     def training(self):​     def training(self):​
-        """​Apprentissage avec 60 000 images. Poids enregistré dans weights.npy"""​+        """​Apprentissage avec 50 000 images. Poids enregistré dans weights.npy"""​
         print("​Training..."​)         print("​Training..."​)
  
Ligne 154: Ligne 194:
         # Initialisation des poids des nodes, pour ne pas à être à 0         # Initialisation des poids des nodes, pour ne pas à être à 0
         # Construit 3 matrices (100x1600, 100x100, 27x100)         # Construit 3 matrices (100x1600, 100x100, 27x100)
-        # /np.sqrt() résultat expérimental de l'​initialisation ​de Glorot He Xavier+        # /np.sqrt() résultat expérimental de l'​initialisation ​d'un gars qui s'​appelle Xavier ​Glorot ​et d'un autre qui s'​appelle ​He !
         weight_list = [np.random.randn(self.layers[k+1],​ self.layers[k]) / \         weight_list = [np.random.randn(self.layers[k+1],​ self.layers[k]) / \
                        ​np.sqrt(self.layers[k]) for k in range(len(self.layers)-1)]                        ​np.sqrt(self.layers[k]) for k in range(len(self.layers)-1)]
Ligne 164: Ligne 204:
  
             # Affichage pour distraire les mangalore             # Affichage pour distraire les mangalore
-            # TODO: mettre ça dans un truc à l'ext de cette méthode 
             if i % 10000 == 0:             if i % 10000 == 0:
                 print(i, nombre_lettre)                 print(i, nombre_lettre)
Ligne 183: Ligne 222:
  
                 # self.activations = non linéaire sinon sortie fonction linéaire de l'​entrée                 # self.activations = non linéaire sinon sortie fonction linéaire de l'​entrée
-                # imite le seuil d'​activation électrique du neuronne+                # imite le seuil d'​activation électrique du neurone
                 vecteur_colonne = self.activations[k](z)                 vecteur_colonne = self.activations[k](z)
  
Ligne 190: Ligne 229:
             # Retro propagation,​ delta_a = écart entre la sortie réelle et attendue             # Retro propagation,​ delta_a = écart entre la sortie réelle et attendue
             delta_a = vecteur_colonne - diagonale[:,​[nombre_lettre]]             delta_a = vecteur_colonne - diagonale[:,​[nombre_lettre]]
-            # Parcours des nodes en sens inverse pour corriger ​proportionnellemnt+            # Parcours des nodes en sens inverse pour corriger ​proportionnellement
             # les poids en fonction de l'​erreur par rapport à la valeur souhaitée             # les poids en fonction de l'​erreur par rapport à la valeur souhaitée
             # Descente du Gradient stochastique             # Descente du Gradient stochastique
Ligne 229: Ligne 268:
                 success += 1                 success += 1
             else:             else:
-                # TODO: mettre ça dans un truc à l'ext de cette méthode 
                 if self.failed:​                 if self.failed:​
                     self.write_failed(img,​ nombre_lettre,​ reconnu, success)                     self.write_failed(img,​ nombre_lettre,​ reconnu, success)
Ligne 264: Ligne 302:
  
     for i in range(5):     for i in range(5):
-        print("​Petit test de l'​influence du random dans la liste des poids"​) 
         learningrate = 0.022         learningrate = 0.022
         failed = 0         failed = 0
Ligne 271: Ligne 308:
         resp = sia.testing()         resp = sia.testing()
         print("​Learningrate:​ {} Résultat {}"​.format(learningrate,​ round(resp, 1)))         print("​Learningrate:​ {} Résultat {}"​.format(learningrate,​ round(resp, 1)))
 +</​file> ​   ​
 +
  
-</​code> ​   ​+===== Etape suivante: YOLO Darknet===== 
 +**[[computer_vision_and_pattern_recognition_segmentation_d_image|Computer Vision and Pattern Recognition Mask R-CNN]]**
  
-{{tag>​ia ​semaphore ​sb}}+{{tag> ​bge ia python ​sb semaphore ​}}
  
l_intelligence_du_semaphore.1549639499.txt.gz · Dernière modification: 2019/02/08 16:24 par serge