Blog ENI : Toute la veille numérique !
-25€ dès 75€ sur les livres en ligne, vidéos... avec le code FUSEE25. J'en profite !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. TensorFlow et Keras
  3. Simuler les attributs de l’intelligence
Extrait - TensorFlow et Keras L'intelligence artificielle appliquée à la robotique humanoïde
Extraits du livre
TensorFlow et Keras L'intelligence artificielle appliquée à la robotique humanoïde Revenir à la page d'achat du livre

Simuler les attributs de l’intelligence

Identifier visuellement les objets

1. Le problème

Même de façon purement statique, qu’un artifact se déplace ou pas, l’identification des objets présents dans son contexte immédiat peut s’avérer très utile.

Comme pour un humain, cette identification peut se révéler incertaine ou imprécise. Après une phase de reconnaissance d’un objet, purement basée sur son aspect visuel et la détermination d’une probabilité associée, on a parfois besoin d’acquérir d’autres informations sur cet objet.

Au repérage global de la position de l’objet correspondant à une image captée dans une direction donnée, on voudra alors appliquer une deuxième passe de reconnaissance pour préciser divers attributs de l’objet qui pourraient par exemple être sa taille, sa position dans un espace 3D, la direction de son éventuel mouvement, sa texture…

On tentera de conforter la détermination des objets ou de leurs attributs en croisant diverses informations et en tenant compte de ce que l’on connaît du contexte de la prise de vue, de la direction de cette prise de vue et des évènements précédents.

Quand on dispose de plusieurs sources d’informations complémentaires, un système de reconnaissance visuelle par ailleurs peu précis peut suffire pour des applications robotiques opérationnelles.

Le travail en deux passes permet de converger vers une reconnaissance plausible. Il est par exemple peu probable de croiser un lion dans sa cuisine ! Ce qui permet d’éliciter plus rapidement l’option chat lors d’une reconnaissance visuelle qui donnerait une certaine probabilité à lion et une autre probabilité raisonnable à chat. Bien entendu, cette appréciation serait à reconsidérer si la direction de la prise de vue était dirigée vers la télévision du salon !

Que cela soit pour reconnaître visuellement des objets, ou pour d’autres prises de décision, il est souvent utile de faire appel à plusieurs technologies en parallèle ou les unes après les autres (en série).

Rappelons que l’on peut confier les décisions finales d’agrégation...

Transfert learning

Quand on ne dispose pas d’un modèle déjà entraîné via imageai, ou que l’on a soi-même entraîné un autre modèle, imageai vous donne la possibilité d’utiliser également d’autres modèles externes.

Mais il existe une solution intermédiaire, qui permet d’utiliser une certaine partie d’un modèle existant (avec ses poids) et de l’adapter à votre problème spécifique, c’est le transfert learning.

Dans de nombreux cas, ne serait-ce que si l’on ne traite pas d’images classiques, ou s’il est utile de contrôler finement le processus d’utilisation d’un modèle déjà entraîné en lui ajoutant d’autres couches, le transfert learning consiste à :

1. charger les premières couches d’un réseau déjà entraîné dont on pense qu’il va extraire de bonnes features par rapport à notre problème (car il a déjà fait ses preuves) ;

2. ajouter de nouvelles couches qui vont stocker l’apprentissage que nous voulons faire sur de nouvelles données ;

3. connecter tout cela sur les outputs que l’on veut obtenir.

Par exemple, après avoir entraîné un modèle avec Keras sur le dataset MNIST, imaginez que vous vouliez identifier...

RNN et LSTM, quand le temps et les sentiments s’en mêlent…

1. Le problème

On veut créer un modèle qui tient compte d’une succession d’observations, typiquement dans le temps, comme :

  • des images successives ;

  • des fréquences successives, par exemple pour la reconnaissance de la parole, ou des notes de musique ;

  • des suites de mots ;

  • des suites de positions de composants d’un robot (bones, articulations, effecteurs…) ;

  • des trajectoires ;

  • des séries temporelles (cours de bourse, analyse d’un phénomène économique, consommation électrique d’un robot…).

On considère que les états précédents vont influencer les états suivants et donc les modèles de réseaux neuronaux habituels ne vont pas avoir la capacité de bien modéliser le phénomène, car ils ne gèrent pas les liens entre deux observations. 

2. La solution

a. Les RNN classiques

On va utiliser des réseaux spécialisés récurrents (RNN pour Recurrent Neural Network) qui effectuent plusieurs fois un apprentissage de même nature pour diverses valeurs d’indices différents, souvent en temps discret.

Ces modèles calculent donc des poids sur deux axes au moins : l’axe des indices temporels et les autres dimensions du problème.

En bref, pour un RNN simple l’expression qui relie les activations des couches cachées  images/eq311.PNGpourrait alors ressembler à cela (les images/eq312.PNG sont les vecteurs de poids que l’on cherche à déterminer) :
images/eq313.PNG
La fonction d’activation images/eq314.PNG utilisée par les premiers praticiens des RNN était la tangente hyperbolique, comme dans le cas de nombreux réseaux neuronaux des origines.
Les résultats images/eq315.PNG et/ou images/eq316.PNG peuvent être réinjectés, ou pas, et en tout ou partie dans l’itération suivante selon la nature du RNN (et donc ce à quoi il va servir !), nous verrons cela en fin de section.

Nous allons nous inspirer du formalisme utilisé à la fin du chapitre Code et mathématiques, quand nous avons décrit un réseau de neurones simple, pour aller un peu plus loin dans la formulation d’un RNN de structure simple.

Ici, nous considérons un RNN avec une seule couche cachée. S’il n’y avait...

Passer du son au mot : speech to text

1. Le problème posé

Pour interfacer avec votre robot, ou IA incarnée (ou pas), il peut être commode d’utiliser la reconnaissance de la parole.

Afin de passer d’un son à une suite de mots, il faut :

1. acquérir le son ;

2. le nettoyer des bruits parasites et éliciter les bonnes fréquences ;

3. créer puis utiliser un modèle qui va des sons vers les phonèmes d’une ou plusieurs langues données (le cas échant, avoir un modèle pour déterminer la langue) ;

4. traduire les phonèmes en mots via un modèle adéquat ;

5. le cas échéant, se référer à des modèles de construction syntaxique ou sémantique concernant la langue en question pour sélectionner la bonne interprétation.

L’interprétation son -> phonèmes ou directement son -> mots pourrait être basée sur les techniques de réseaux récurrents vues plus haut, les exposer à nouveau aurait été redondant.

Nous avons donc préféré vous donner ici d’autres outils "sur étagère" qui vous permettront de mettre le pied à l’étrier avant que vous ne décidiez de construire votre propre système.

2. Une implémentation

Nous allons explorer quelques outils simples d’utilisation.

Tout d’abord, il faut installer les deux bibliothèques suivantes :...

Passer du mot au son : text to speech

1. Un problème moins simple qu’il n’y paraît

L’objectif est simple à décrire : passer d’un texte à un son. Encore faut-il choisir la bonne voix et la bonne langue !

C’est un des modes de communication privilégiés avec un robot humanoïde, qui en corrélant ce que vous lui exprimez oralement au contexte, à votre expression faciale et gestuelle va pouvoir générer la réponse la plus adéquate à votre sollicitation.

2. Une implémentation

Il nous faut installer une bibliothèque spécialisée (Google Text-to-Speech) :

pip install gTTS 

Il suffit alors de sélectionner une langue (ici fr) et de passer le texte en argument pour créer le fichier audio.

from gtts import gTTS 
 
son = gTTS(text='Bonjour à tous',  
  lang='fr',  
  slow=False) 
 
with open('bonjour_a_tous.mp3', 'wb') as f: 
  son.write_to_fp(f) 
 
with open('bonjour_a_tous.wav', 'wb') as f: 
  son.write_to_fp(f) 

Deux fichiers audio de formats différents ont été créés.

Ainsi, en première approximation, pour créer des fichiers audio labellisés avec les labels de votre choix (le vocabulaire de votre...

Traduction automatique

L’alternative qui s’offre à vous pourrait sembler brutale :

  • créer vos modèles de traduction et vous lancer dans une grande aventure,

  • ou utiliser les API "sur étagères".

En fait, il existe une voie du milieu : créer ses propres modèles s’avère efficace quand on procède par transfer learning et/ou que le vocabulaire à aborder est restreint. On ajoute alors certaines facultés de traduction spécifiques à un modèle déjà opérationnel.

Voici donc un succédané rapide à mettre en place avant de vous lancer dans cette éventuelle grande aventure babylonienne.

Nous allons rester dans la galaxie Google avec l’utilisation de goslate (pour Free Google Translate API). L’installation ne pose aucun problème.

pip install goslate 

L’utilisation du package est tout aussi triviale.

import goslate  
text = "Je suis belle, ô mortels, comme un rêve de pierre" 
 
gs = goslate.Goslate() 
traduction = gs.translate(text,'en') 
print(traduction) 

Ce qui donne :

I am beautiful, O mortals, like a dream of stone 

Google connaît ses classiques ! Notez que vous n’avez pas eu besoin de stipuler la langue de départ.

Vous disposez maintenant d’un outil pour générer toutes les données...

Manipuler le langage

1. Des problèmes courants

Il existe de nombreux outils de base pour manipuler le langage, ce que l’on nomme NLP en anglais (pour Natural Language Processing).

Il faut donc vous constituer rapidement une petite boîte à outils pour ne pas "réinventer la roue" et vous concentrer ensuite sur les problèmes spécifiques à l’IA que vous voulez implémenter.

Les manipulations que nous allons parcourir rapidement ici correspondront pour beaucoup au preprocessing des données à effectuer avant d’utiliser TensorFlow pour créer vos modèles spécifiques.

2. Implémentation

a. NLTK (Natural Language Toolkit) et ses compagnons

C’est un des outils les plus utilisés dans la sphère du NLP utilisée dans le biotope Python.

Les personnes qui écrivent en R utilisent souvent tm, Quanteda, Stanford CoreNLP et les outils qui s’appuient dessus. Ils obtiennent des résultats comparables (ou supérieurs, appréciation subjective de l’auteur !).

De toute façon, comme signalé en début d’ouvrage, il est très simple d’utiliser du Python et donc NLTK dans R grâce au package reticulate, et vice-versa.

b. Travailler un texte : tokenization et compagnons

La tokenization

On a vu plus haut que Keras nous fournit une solution pour la tokenization (scinder une phrase en mots), mais nous allons ici nous pencher une alternative courante.

On installe deux packages via textblob qui s’appuie sur NLTK, et l’on installe un corpus de textes minimal pour nos essais.

pip install textblob 
python -m textblob.download_corpora 
python -m nltk.downloader popular 

Remarquez que vous pouvez toujours installer d’autres corpus ou modèles de façon interactive de la façon suivante.

import nltk 
nltk.download() 
images/CH8_2_NLTK-1.png

Download interactif NLTK

Parmi les corpus installables, on trouve Wordnet, qui est un outil d’exception pour qui veut identifier des relations sémantiques dans le langage (ex : un chien est un mammifère carnivore).

Accéder au contenu brut d’un corpus ne pose pas de problème.

from nltk.corpus import gutenberg 
un_text = gutenberg.raw()[50:289] # 289 caractères à partir du caractère 50  
\n compris 
print(un_text) 

Emma Woodhouse...

Manipuler le son

Pour pouvoir apprendre à partir de sons, il faut être à même de les analyser et le cas échéant d’en extraire des features.

Toute une théorie du signal est à notre disposition depuis plus d’un siècle. Nous avons déjà évoqué un outil clé de la théorie du signal qui se nomme la transformée de Fourier sans pour autant la détailler.

Elle va nous être d’un grand secours ici. C’est une technique d’analyse harmonique, c’est-à-dire une technique qui permet de décomposer un signal en une sommation (discrète ou intégrale) d’autres fonctions plus simples, comme des fonctions trigonométriques de base (sin..).

En positionnant le temps en axe des abscisses, on peut considérer sans crainte que toutes les fonctions d’une variable que l’on traite sont analogues à des ondes "sur un intervalle de temps donné", ondes que l’on capte ou que l’on émet à un instant identifié.

On comprend alors mieux pourquoi on va parler d’énergie ou de puissance dans la suite de ce paragraphe, puisque l’énergie est un des attributs que l’on confère intuitivement à une onde (pensez à un son dans un concert de Rock, ou à une onde sismique pour vous en convaincre).

Toute personne ayant manipulé un equalizer pour améliorer l’écoute d’un son sur sa chaîne hi-fi ou sur son téléphone portable est familière avec le fait que les sons varient en amplitude et en fréquence au travers d’une convolution manifeste entre les deux concepts : puisque chaque fréquence possède une variation d’amplitude dans le temps.

Cette remarque n’est pas innocente, puisque l’on a vu plus haut certains liens entre les transformées, les filtres, les produits tensoriels, les équations différentielles et les convolutions (continues ou discrètes)....

Simuler la création et/ou jouer

1. GAN, un modèle qui donne l’initiative à l’IA

L’idée de ce modèle est assez simple, pour pouvoir produire des images, des sons (comme dans la section précédente), des textes nouveaux dans un contexte donné, mais d’une façon non déterministe (mais attention, GAN n’est souvent pas adapté à la production de séquences temporelles) :

1 - il faut organiser un combat entre la créativité débridée d’un modèle de génération d’artefacts et autre chose,

2 - puis créer une sélection impitoyable parmi ses artefacts pour ne conserver que ceux qui sont conformes.

Le papier suivant de Ian Goodfellow sur ce sujet est très complet et intéressant, plus de 50 pages explorent le sujet et ses motivations, à lire absolument : (Goodfellow 2016).

On n’est plus dans la classification ou la prédiction/régression et l’IA nous semble alors plus créatrice.

Il est enfin possible d’imaginer la programmer pour répondre à une sollicitation comme : "dessine-moi un mouton".

Dans les chargements de couche du modèle suivant, remarquez l’activation LeakyReLU, qui a pour caractéristique de pouvoir être légèrement négative avant le seuil d’activation et qui évite certains problèmes de gradient.

images/eq336.PNG
Si images/eq337.PNG ce sera en fait une simple activation Relu !
images/eq04.PNG est choisi petit (comme 0.01).
# -*- coding: utf-8 -*- 
# ce qu'il faut charger 
import tensorflow as tf 
from tensorflow.keras.models import Sequential 
from tensorflow.keras.layers import Flatten, Input, Dense 
from tensorflow.keras.layers import LeakyReLU, Reshape 
from tensorflow.keras.optimizers import Adam 

Il faut créer un modèle générateur des images que l’on veut produire (model_generator). 

images/CH8_4_GEN-1.png

Modèle de génération

Le discriminateur servira à éliminer les images non conformes (model_discriminator). 

images/CH8_5_DIS-1.png

Modèle de discrimination

Le modèle GAN complet inclut le générateur et le discriminateur (model).

images/CH8_9_GAN-1.png

Modèle GAN intégrant génération & discrimination

Après avoir compilé le générateur...

Bibliographie du chapitre

Chelba, Ciprian, Mohammad Norouzi, and Samy Bengio. 2017. "N-Gram Language Modeling Using Recurrent Neural Network Estimation." CoRR abs/1703.10724. http://arxiv.org/abs/1703.10724.

Goodfellow, Ian. 2016. "NIPS 2016 Tutorial: Generative Adversarial Networks." http://www.iangoodfellow.com/slides/2016-12-04-NIPS.pdf.

He, Kaiming, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. 2015. "Deep Residual Learning for Image Recognition." CoRR abs/1512.03385. http://arxiv.org/abs/1512.03385.

Huang, Gao, Zhuang Liu, and Kilian Q. Weinberger. 2016. "Densely Connected Convolutional Networks." CoRR abs/1608.06993. http://arxiv.org/abs/1608.06993.

Jing, Longlong, and Yingli Tian. 2019. "Self-Supervised Visual Feature Learning with Deep Neural Networks: A Survey." CoRR Journals/Corr/Abs-1902-06162 abs/1902.06162. http://arxiv.org/abs/1902.06162.

Kuznetsova, Alina, Hassan Rom, Neil Alldrin, Jasper R. R. Uijlings, Ivan Krasin, Jordi Pont-Tuset, Shahab Kamali, et al. 2018. "The Open Images Dataset V4: Unified Image Classification, Object Detection, and Visual Relationship Detection at Scale." CoRR Journals/Corr/Abs-1811-00982 abs/1811.00982. http://arxiv.org/abs/1811.00982.

Maas, Andrew L, Raymond E Daly, Peter T Pham, Dan Huang, Andrew Y Ng, and Christopher Potts. n.d. "Learning Word Vectors for Sentiment Analysis." https://www.aclweb.org/anthology/P11-1015.

Tan, Mingxing, and Quoc V. Le. 2019. "EfficientNet:...