Réseaux de neurones convolutifs — Les-mathematiques.net The most powerful custom community solution in the world

Réseaux de neurones convolutifs

Bonjour

Concernant ce type de réseaux, je n'ai pas trop de problèmes pour comprendre les outils mathématiques utilisés et la mise en application mais je suis dépourvu quant, au sens (s'il y en a un), des différentes couches notamment celle de convolution. Alors soit, je les prends comme des structures très efficaces soit un de vous pourrait-il m'expliquer ce mécanisme sous-jacent en des termes profanes ?

Cordialement.

Réponses

  • Bonjour,

    En gros, un filtre de convolution 2D appliqué à une image permet de quantifier le degré de présence d'une forme particulière dans l'image (par exemple des rayures ou des motifs plus sophistiqués).
    On peut même visualiser le résultat d'une convolution, voir https://towardsdatascience.com/visual-interpretability-for-convolutional-neural-networks-2453856210ce ou la fin du chapitre sur les réseaux convolutifs dans le livre Deep learning with Python de François Chollet.
  • Bonsoir,

    Entendu. Je vais prendre le temps d'intégrer cela et, peut-être revenir avec une nouvelle question.

    Merci et bon dimanche.
  • Bonjour,

    J'ai réussi à trouver ce post grâce à la barre de recherche du forum (:D . Du coup j'aimerais ajouter quelques questions.

    Tout d'abord voici un début de réseau de neurones convolutif
    model = models.Sequential()
    model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Conv2D(64, (3, 3), activation='relu'))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Conv2D(64, (3, 3), activation='relu'))
    

    Quand je demande
    model.summary()
    

    Et j'obtient
    Jupyter a écrit:
    Model: "sequential_1"
    _________________________________________________________________
    Layer (type) Output Shape Param #
    =================================================================
    conv2d_3 (Conv2D) (None, 26, 26, 32) 320
    _________________________________________________________________
    max_pooling2d_2 (MaxPooling2 (None, 13, 13, 32) 0
    _________________________________________________________________
    conv2d_4 (Conv2D) (None, 11, 11, 64) 18496
    _________________________________________________________________
    max_pooling2d_3 (MaxPooling2 (None, 5, 5, 64) 0
    _________________________________________________________________
    conv2d_5 (Conv2D) (None, 3, 3, 64) 36928
    =================================================================
    Total params: 55,744
    Trainable params: 55,744
    Non-trainable params: 0
    _________________________________________________________________

    Que ce passe-t-il on a $32$ filtres de taille $3 \times 3$ et on convole des matrces $28 \times 28$. Vous trouver pas ça bizarre qu'on obtient des matrices $26 \times 26$ ?
  • J'ai l'impression que ce phénomène est décrit dans le livre de Chollet par side effect et padding. En gros, la taille de la matrice 28x28 fait qu'on ne peut pas convoler la ligne 1 et 28 (de même la colonne 1 et 28). Il faut commencer à la ligne 2 colonne 2 jusqu'à ligne 27 colonne 27) cela donne bien 26. C'est ça ?
  • Oui c'est ça (aux indices près) : comme tu n'as pas spécifié padding = True dans ta couche Conv2D, il manque 2 lignes et 2 colonnes vu que tu as un filtre 3×3. Si tu mets du padding, ça rajoute une "couronne de zéros" autour de ta matrice 28×28 et ça permet d'avoir une matrice 30×30 au départ donc 28×28 à l'arrivée.
  • Ah je savais pas qu'on pouvait faire ça, je note merci :).
  • J'ai une autre question, je me demande si je devrais pas la poser sur la section informatique. En même temps puisque la question est sur le code de Chollet alors peut être que je pourrais la poser ici aussi. Que ne sais-je :)o
  • C'est vraiment d'une grande tristesse de prendre Chollet comme référence sur un forum de maths vu ce qu'il pense des maths et des mathématiciens ...
  • J'espère finir son livre d'ici dimanche soir. Emballé c'est pesé !
  • Au moins lundi je peux me consacrer sur un sujet plus mathématiques comprendre le kernel trick
  • Bonjour
    Sur ce code :
    history = model.fit_generator(
          train_generator,
          steps_per_epoch=100,
          epochs=30,
          validation_data=validation_generator,
          validation_steps=50)
    
    Je ne comprends pas l'intérêt des batch ici train_generator fournit des sample de 20 images et on fait 100 étapes donc on couvre 2000 images. Moi ce que je me dis c'est qu'on a une fonction de perte $l$ et une somme
    $$
    s(p) = \sum_{i=1}^{2000} l \left( f(x_{i},p), y_{i}) \right)

    $$ à minimiser selon les poids du CNN modélisé par $f$. Et pour cela on fait une descente de gradient pour approcher les valeurs des poids qui réalisent la perte minimale.
    $$
    p_{k+1} = p_{k} - \delta \nabla_{\text{poids}}{s}.


    $$ Donc on voit bien qu'on a besoin de toutes les images pas juste de lots de 20 enfin bref ça ma parait bizarre.
  • Je pense avoir une idée, je crois que les batch ça consiste à minimiser la perte restreint à un sous ensemble $I$ de point tiré aléatoirement dans l'ensemble (sans remise).
    $$
    s(p) = \sum_{i \in I } l \left( f(x_{i},p), y_{i}) \right)
    $$
    Et à chaque itération on tire un nouveau sous ensemble $I$.
  • Comment on calcul le nombre de mise à jour de gradients par epochs dans un mini-batch stochastic gradient ?
    Par exemple pour epochs = 5 et batch_size = 128.
  • J'ai une autre question même si je remarque par expérience sur le forum que lorsqu'on ne reçoit plus de réponse il est inutile de poser d'autres questions. Je vais quand même le faire déjà parce que il est possible que quelqu'un d'intéressé par le sujet souhaite y répondre. Et deuxièmement si je me pose la question peut être que d'autres se les poseront aussi donc il est intéressant de les écrire sur le forum.

    Pourquoi est-ce différent d'utiliser data augmentation pendant l'entraînement et d'utiliser data augmentation en amont pour enrichir le data set puis faire l'entraînement ?
  • Oublie ses tutos et son bouquin. C'est bon pour apprendre le code pour un data scientist (contrairement à ce que j'ai lu sur un autre post à propos de reconversion stat, 90% des data scientists ne comprennent rien au domaine et font de la bidouille), absolument pas à comprendre ce que tu fais (ce qui se voit d'ailleurs à tes questions). Prends un vrai livre, genre celui de Goodfellow, et tu acquerras une bien meilleure compréhension, te permettant de répondre à tes questions.

    Et google est aussi ton ami. D'ailleurs sur ta question, Goodfellow en personne répond sur Quora et renvoie à son bouquin : https://www.quora.com/In-deep-learning-why-dont-we-use-the-whole-training-set-to-compute-the-gradient

    Et enfin, lis des papiers et expérimente.

    Je n'ai pas le temps de regarder tous tes messages, mais on procède par mini-batch pour plusieurs raisons :
    - C'est hyper coûteux de prendre le dataset d'un seul coup, ça permet certes de faire des pas de descente un peu plus grand mais l'un dans l'autre c'est très largement perdant, le loss étant très escarpé.
    - La descente par mini-batch se rapproche théoriquement de la descente de gradient stochastique qui a des propriétés théoriques (démontrées ou supposées) très intéressantes. En particulier, le vrai but n'est pas de minimiser le loss empirique, mais le loss en espérance sur la distribution des données (qu'on ne connaît justement pas, n'ayant accès qu'à des samples, i.e. le training set).
  • Quant à la data augmentation, ça ne change pas grand chose théoriquement de la faire on the fly ou avant. Disons juste qu'en le faisant pendant l'entraînement ça permet d'avoir une plus grande variabilité puisqu'en le faisant à l'avance tu limites forcément le nombre d'augmentations que tu fais.

    En pratique ça peut changer pas mal de choses, ça dépend de l'implémentation. Typiquement l'augmentation de données est souvent faite en parallèle par le CPU sur le batch suivant pendant que le batch précédent est utilisé en GPU pour la descente de gradient. Cela fait partie du pre-fetching des données. Mais le faire à l'avance permet aussi potentiellement d'accélérer les choses ou de les simplifier si l'augmentation des données est complexe, c'est très dépendant du scénario exact.

  • Mathematicians say that deep learning lacks mathematical grounding. I will be vaguely amused when deep learning replaces the mathematicians.

    Cela démontre selon moi une compréhension limitée autant des mathématiques que du deep learning.
  • Bonjour,

    Oui, effectivement, mais en tant que mathématicien, je ne me sens pas énormément visé, ce n'est peut-être qu'une boutade.
    Si tu t'y connais en "deep learning" est ce que son bouquin est quand même un bon bouquin pour quelqu'un qui sait programmer, mais ne connait pas ce domaine ?
    Il a l'avantage d'être en français.

    Cordialement,

    Rescassol
  • C'est une semi boutade. Il indique lui-même qu'il manque des matheux dans le domaine, et que c'est une limitation. C'est un "practitioner" mondialement reconnu, à l'origine d'une (ou peut-être de la) API la plus utilisée en deep learning dans le monde industriel (Keras, intégré nativement dans TensorFlow à présent, mais dans le monde académique PyTorch a largement pris le dessus). Il a fait l'ENSTA, donc il a vu des maths (même s'il prétend avoir oublié tous les théorèmes). Je ne le considère néanmoins pas comme un chercheur (pas de PhD à ma connaissance, pas vraiment de publis hors librairies/architectures, etc.).

    Mais en même temps il n'a pas pleinement conscience du rôle fondamental des mathématiques qu'il voit davantage comme un outil ou un langage, à l'instar de la plupart des professionnels du domaine, plutôt que comme une matière à même de permettre de raisonner et comprendre les limitations en vue de les dépasser, en particulier à un niveau théorique plus avancé.

    Son livre est probablement bien pour devenir data scientist, mettre les mains dans le code, appliquer des modèles classiques, prendre en main des librairies. Ce n'est pas un livre qui permet de comprendre profondément les mathématiques du deep learning (car oui, même si les maths ne démontrent pas encore beaucoup de théorèmes dans ce domaine, elles sont primordiales à sa compréhension), ce qui me paraît essentiel pour un chercheur du domaine. Pour prendre du recul et conceptualiser les modèles futurs, il faut s'élever au-dessus des couches de convolution ou du learning rate, en caricaturant.

    En deep learning, on reconnaît très vite celui qui comprend vraiment ce qu'il fait et celui qui bidouille. Et en général, c'est fortement corrélé avec le niveau en maths (si tant est que le background en learning est présent évidemment, un matheux qui débarque ne va rien comprendre non plus).

    Attention, je ne prétends pas que Chollet n'est pas bon en maths, il comprend très bien ce qu'il fait. Je m'inscris simplement en faux sur tous ceux qui sous-estiment l'importance des maths dans ce domaine, sous prétexte que le data scientist qui déploie des modèles existants n'a pas besoin d'avoir un M2 en géométrie riemannienne pour les implémenter.
  • Bonsoir,

    Ok, merci, Chalk.
    Je m'y intéresse pour ne pas mourir idiot, comme on dit, pas dans un but professionnel.
    Et le côté mathématique ne me fait pas peur.

    Cordialement,

    Rescassol
  • Bonjour,

    J'ai reçu son bouquin aujourd'hui..
    Un truc m'avait échappé, je suis sous Windows 10, pas sous Linux, j'espère que ça ne va pas me pénaliser.

    Cordialement,

    Rescassol
  • Pour du python ça ne changera rien. En revanche ce n'est pas un bouquin théorique mais vraiment de code et de praticien. Et depuis 2017 les librairies de deep learning ont énormément changé.
  • Bonsoir,

    > ce n'est pas un bouquin théorique mais vraiment de code et de praticien

    Ça veut dire qu'il me faudra à un moment ou un autre un bouquin plus mathématique.
    Tu en connais, en français de préférence ?

    Cordialement,

    Rescassol
  • Tout dépend ce que tu veux faire. Si tu veux comprendre un peu le domaine ou bidouiller des codes.

    Si tu veux comprendre le domaine, il n'y a aucun livre idéal, c'est un champ trop en ébullition. Mais il y a largement mieux que le bouquin de Chollet !

    Une référence c'est celui-ci : https://www.deeplearningbook.org/
    Il a l'avantage de ne parler que de deep learning, d'aborder certaines thématiques très récentes de recherche, d'être gratuit en ligne, d'exister sur papier, et même d'avoir une "traduction" française en livre papier ... Bon la traduction a été faite automatiquement avec du deep learning justement, elle n'est donc pas parfaite, d'autant plus que les algorithmes de langage naturel se sont encore grandement améliorés très récemment avec les mecanismes d'attention qui n'existaient pas à l'époque.

    Après il y a des bouquins plus théoriques, mais ils sont beaucoup moins récents et très peu orientés deep.

    Sur l'apprentissage par renforcement (deep ou non, AlphaGo pour ceux qui se demandent ce que c'est), qui n'est pas abordé dans le livre précédent, ce livre est une référence : https://www.google.com/url?q=https://web.stanford.edu/class/psych209/Readings/SuttonBartoIPRLBook2ndEd.pdf&sa=U&ved=2ahUKEwj4iK7PhqTvAhWoy4UKHermB00QFjABegQIAxAB&usg=AOvVaw31hDTh8nB7NZqgPWmg8Sjo

    Et enfin ne pas oublier comme je disais plus haut, que pour aller plus loin, le domaine étant très vaste et très actuel, il ne faut pas hésiter à se plonger dans des papiers.

    Parmi les innombrables applications du deep learning, un petit deep fake à la fois flippant mais impressionnant pour la route, surtout en sachant que c'est complètement non supervisé, donc très facilement adaptable à n'importe qui :
    Parce que contrairement à ce que disait le huffpost il y a quelques jours, ce n'est justement PAS la technologie utilisée par Hollywood, où ils ont des gros efforts de supervision pour que ce soit parfait, même si peut-être qu'ils utilisent du deep pour aller plus vite.
  • Bonjour,

    @Rescassol : il y a ce livre en français de S.Tufféry, (2019), "Big Data, Machine Learning et Apprentissage Profond", Technip.

    Cordialement.
  • Bonjour,

    Merci, Chalk et Jma.

    Cordialement,

    Rescassol
  • Bonjour,

    @Rescassol : bien de rien. Je voulais te signaler le cours de Stéphane Mallat au Collège de France mais cela représente un volume horaire conséquent que l'on ne peut pas toujours se permettre. Ce lien dirige vers ses cours sur l'apprentissage profond : https://www.college-de-france.fr/site/stephane-mallat/_course.htm

    Cordialement.
  • Bonjour,

    Merci, Jma, ça va m'occuper.

    Cordialement,

    Rescassol
  • Dans la salle d'à côté, tu peux voir Yann LeCun.
Connectez-vous ou Inscrivez-vous pour répondre.
Success message!