WEBVTT

00:00.520 --> 00:02.690
Bonjour et bienvenue dans ce tutoriel sur Python.

00:02.860 --> 00:05.680
Très bien, nous avons donc beaucoup d’excitatif devant les sols.

00:05.680 --> 00:10.690
Nous allons commencer par créer l’architecture du réseau de neurones, c’est-à-dire créer le réseau

00:10.690 --> 00:16.740
de neurones qui sera au cœur de notre intelligence artificielle et qui renverra l’action à 90 ans.

00:16.930 --> 00:18.060
Alors faisons ceci.

00:18.130 --> 00:23.130
Donc, puisque nous voulons que notre réseau de neurones soit objectif, nous allons le classer.

00:23.200 --> 00:25.100
Et c'est parce que c'est beaucoup plus pratique.

00:25.180 --> 00:28.370
Vous savez que la classe est le modèle de quelque chose que nous voulons construire.

00:28.540 --> 00:34.000
Nous voulons construire un réseau de neurones et nous devons faire une sorte d’instructions qui seront toutes contenues

00:34.090 --> 00:35.080
dans la classe.

00:35.140 --> 00:37.910
Et dans cette classe, nous allons créer deux fonctions.

00:37.960 --> 00:42.810
D'abord la fonction init qui est la fonction qui apparaît tout le temps lors de la création de classe.

00:43.000 --> 00:47.770
Et cela définit fondamentalement la variable de votre objet qui est le réseau de neurones.

00:47.920 --> 00:52.600
Vous connaissez les variables attachées à l'objet par opposition aux variables globales.

00:52.840 --> 00:57.910
C’est donc dans cette fonction que sera définie l’architecture du nouveau réseau que vous connaissez, définissant

00:57.910 --> 01:03.460
la couche d’entrée qui sera composée de cinq neurones d’entrée car nous avons cinq dimensions pour le

01:03.790 --> 01:05.680
vecteur codé des états d’entrée.

01:05.890 --> 01:08.080
Ensuite, nous définirons des couches cachées.

01:08.110 --> 01:12.940
Vous commencerez peut-être avec une couche cachée et vous pourrez ensuite essayer d'autres architectures du

01:12.940 --> 01:13.920
réseau de neurones.

01:14.200 --> 01:20.080
Et bien sûr, nous nous retrouverons avec la couche de sortie qui contiendra les actions possibles que nous

01:20.110 --> 01:21.940
pouvons jouer à chaque fois.

01:22.180 --> 01:24.730
C'est donc exactement ce que nous ferons dans cette fonction.

01:24.850 --> 01:30.460
Et ensuite, nous créerons une autre fonction dans la classe qui sera la fonction

01:30.460 --> 01:34.870
directe et qui activera les neurones du réseau de neurones.

01:34.870 --> 01:40.570
Vous savez que cela va activer les signaux et nous allons donc utiliser une fonction d'activation rectifiée

01:40.570 --> 01:46.920
car nous avons bien sûr affaire à un problème purement non linéaire et cette fonction rectifiée rompt la linéarité.

01:47.200 --> 01:53.340
Mais surtout, nous faisons en sorte que cette fonction Ford renvoie les valeurs q qui sont les sorties du réseau.

01:53.500 --> 01:56.110
Mais nous avons une valeur clé pour chaque action.

01:56.200 --> 02:02.710
Et plus tard, nous retournerons l'action finale en prenant le maximum des valeurs de clé ou en utilisant une

02:02.710 --> 02:03.880
méthode souple Max.

02:04.030 --> 02:05.270
Nous verrons cela après.

02:05.440 --> 02:10.330
Donc, dans ce tutoriel, nous allons commencer par implémenter la fonction init puis

02:10.330 --> 02:12.880
le suivant implémentera la fonction forward.

02:12.880 --> 02:13.810
Alors faisons ceci.

02:13.810 --> 02:17.060
Nous devons d’abord présenter notre classe.

02:17.200 --> 02:22.930
Donc, nous commençons avec classe et nous donnons un nom à notre classe qui est l'endroit où nous pouvons l'appeler réseau.

02:23.650 --> 02:29.980
Et ensuite, dans cette classe de réseau, je vais utiliser une technique de programmation par objet appelée héritage,

02:30.310 --> 02:35.120
qui consiste simplement à hériter de tous les outils d'une classe parente.

02:35.200 --> 02:41.550
Donc, notre classe de réseau que nous sommes sur le point de faire est un test enfant d’une classe plus grande qui est.

02:41.770 --> 02:44.110
Et ce module.

02:44.470 --> 02:50.790
Donc, il ne s'agit que d'hériter de tous les outils de cette classe de modules qui, bien entendu, permettent de mettre en œuvre

02:50.790 --> 02:51.940
un réseau de neurones.

02:51.940 --> 02:57.880
C'est donc un truc très puissant et évolutif dans la programmation orientée objet qui va en héritage.

02:57.910 --> 03:02.670
Et pour le moment, nous héritons de cette classe de module.

03:02.800 --> 03:06.000
Très bien et maintenant nous sommes prêts à entrer dans la classe.

03:06.130 --> 03:12.910
Donc, j'appuie deux fois sur Entrée parce que nous allons créer deux fonctions et nous commençons par la

03:13.140 --> 03:14.280
fonction de fin.

03:14.350 --> 03:20.470
Donc, la fonction init doit être nommée de cette façon avec deux sur ce parcours puis à l'intérieur.

03:20.650 --> 03:25.750
Et encore une fois, pour souligner que la syntaxe Python n’est que la façon dont nous devons le faire.

03:25.930 --> 03:28.460
Et puis nous devons mettre les arguments.

03:28.720 --> 03:30.340
Nous avons donc trois arguments.

03:30.340 --> 03:35.800
Le premier est un argument obligatoire qui est en réalité soi et Soi.

03:35.800 --> 03:42.250
Il n’ya pas de mystère à ce sujet qui fait référence à l’objet qui sera créé à partir de cette classe que nous sommes sur le point

03:42.250 --> 03:42.810
de fabriquer.

03:42.820 --> 03:44.400
Vous savez que nous faisons cette classe.

03:44.470 --> 03:48.980
C'est comme une instruction quelque modèle du réseau de neurones que nous voulons construire.

03:49.180 --> 03:53.620
Et puis, une fois que la classe est prête, nous pouvons créer autant de réseaux que nous le souhaitons.

03:53.620 --> 04:00.130
Et chacun de ces nouveaux réseaux sera un objet de cette classe et, puisque nous allons

04:00.400 --> 04:07.630
utiliser cet objet à d’autres fins, nous devons préciser quelles sont les variables de cet objet et aux

04:07.630 --> 04:11.900
spudis que nous utilisons ce self faites référence à l'objet.

04:12.100 --> 04:18.430
Donc, chaque fois que je veux utiliser disponible depuis mon objet, je vais utiliser self avant la variable

04:18.430 --> 04:21.340
pour spécifier qu'il s'agit d'une variable de l'objet.

04:21.340 --> 04:25.680
Très bien, voilà le premier argument, puis nous avons deux autres arguments qui

04:25.680 --> 04:30.240
sont bien sûr le nombre de neurones d’entrée et le nombre de neurones de sortie.

04:30.550 --> 04:38.220
Nous allons donc appeler le nombre de neurones d'entrée la taille d'entrée. Il s'agit en réalité de

04:38.310 --> 04:45.890
cinq, car nos vecteurs d'entrée ont cinq dimensions: trois signaux, plus l'orientation plus l'orientation moins, qui sont

04:45.900 --> 04:51.020
des vecteurs de valeurs codées décrivant un état de l'environnement.

04:51.210 --> 04:54.960
Ces cinq valeurs suffisent à décrire un état de l'environnement.

04:54.960 --> 05:00.600
Nous aurions pu penser à Moins de valeurs ou à plus de valeurs, mais c'est ce que j'ai essayé et cela a

05:00.600 --> 05:05.520
du sens, car nous avons besoin d'un signal de la gauche devant nous et d'un autre à droite.

05:05.520 --> 05:10.860
Vous savez, lorsque nous conduisons une voiture, nous aurions pu opter pour un signal 360. Vous savez, comme

05:10.860 --> 05:17.370
les signaux situés en haut des voitures Google, que nous pouvons totalement conduire de manière autonome avec trois capteurs, puis nous avons

05:17.400 --> 05:22.200
cette orientation et l'orientation moins pour vous savoir garder trace de l’objectif que vous tentiez d’atteindre.

05:22.530 --> 05:29.160
Et puis nous avons bien sûr les neurones de sortie de notre réseau qui correspondent aux actions et nous avons

05:29.160 --> 05:32.840
trois actions possibles allant de gauche à droite ou de droite.

05:32.880 --> 05:38.520
Et donc je vais l'appeler et l'action et il y en aura trois.

05:38.520 --> 05:39.030
D'accord.

05:39.120 --> 05:44.850
Jusqu'ici, nous n'avons qu'à donner des noms aux entrées, puis nous utiliserons ces ballons de volley-ball pour faire les conditions à l'intérieur

05:44.940 --> 05:46.140
du réseau de neurones.

05:47.090 --> 05:55.010
Très bien alors et vous commencez par utiliser une autre astuce par la torche, cette astuce

05:55.010 --> 05:59.310
est une fonction superficielle qui hérite du module

05:59.390 --> 06:02.730
C'est pourquoi nous avons également dû utiliser l'héritage pour hériter du module.

06:02.750 --> 06:04.440
C'est le premier à utiliser.

06:04.520 --> 06:11.120
Et donc, fondamentalement, nous n’utilisons cette super-super-astuce que pour pouvoir utiliser les outils de module

06:11.580 --> 06:13.320
beaucoup plus efficaces.

06:13.670 --> 06:18.620
Et à l'intérieur de la super-fonction, il me suffit de spécifier d'abord le réseau.

06:18.650 --> 06:25.100
C’est donc notre classe de contrôle de réseau que vous connaissez, car elle hérite de la classe parente du

06:25.550 --> 06:27.360
module, puis de notre objet.

06:27.380 --> 06:35.220
Et puis j'ajoute simplement cela et je suis dans une fonction comme celle-ci exactement comment nous l'avons nommée.

06:35.570 --> 06:39.350
Très bien, alors c'est juste un truc qui consiste à utiliser tous les outils que j'ai.

06:39.360 --> 06:46.270
Et dans ce module, nous pouvons passer à l'étape suivante qui consiste à spécifier la couche d'entrée.

06:46.550 --> 06:53.300
Donc, fondamentalement, ce que je dois faire est d’introduire une nouvelle variable qui sera attachée à l’objet

06:53.300 --> 06:57.120
et cette variable contiendra le nombre de neurones d’entrée.

06:57.170 --> 07:05.140
Donc, ne pas confondre avec la taille d'entrée taille d'entrée est l'argument de la fonction de fin.

07:05.180 --> 07:09.710
Mais ce n'est pas la variable qui est attachée à l'objet mais la variable qui est attachée

07:09.710 --> 07:10.360
à l'objet.

07:10.520 --> 07:16.520
Comme je viens de le dire, nous devons spécifier qu’il est plutôt attaché à l’objet, nous utilisons donc un

07:17.230 --> 07:22.130
autodidacte et nous donnons maintenant un nom à cette première variable attachée à l’objet.

07:22.190 --> 07:24.870
Et ainsi, nous pouvons simplement donner le même nom que l’entrée.

07:24.920 --> 07:33.650
Nous pouvons appeler cela la taille d'entrée et nous dirons qu'elle est égale aux arguments d'une fonction qui est la taille d'entrée.

07:33.680 --> 07:34.080
D'accord.

07:34.130 --> 07:39.900
Chaque fois que je crée un objet de la classe network et que je spécifie la taille d'entrée, par

07:39.900 --> 07:41.170
exemple, je mets 5.

07:41.180 --> 07:47.330
Il y aura 5 ici et donc la variable de taille d'entrée de notre objet aura la valeur

07:47.690 --> 07:54.110
5 parce que cette taille d'entrée sera ici 5 et donc notre nouveau réseau aura 5 neurones d'entrée dans

07:54.110 --> 07:55.470
la couche d'entrée.

07:55.490 --> 07:55.790
D'accord.

07:55.790 --> 08:02.180
Et puis c'est la même chose pour l'autre variable que nous voulons attacher aux objets.

08:02.210 --> 08:08.100
Et comme vous l'avez peut-être deviné, il s'agira d'une variable pour le nombre de neurones de sortie.

08:08.330 --> 08:15.030
Et dire que nous prenons nous-mêmes l'objet et que nous donnons un nom à cette seconde variable de l'objet

08:15.040 --> 08:17.740
que nous allons appeler et à l'action.

08:18.170 --> 08:23.600
Et ce sera égal à cet argument ici étant donné le nombre d'actions qui est le nombre de neurones

08:23.600 --> 08:24.250
de sortie.

08:24.530 --> 08:30.850
Et donc nous le fixons réellement à l'action et l'action sera égale à trois.

08:30.890 --> 08:37.930
Par conséquent, la variable et l'action attachée à notre objet sur un réseau obtiendront la valeur de trois.

08:38.240 --> 08:41.680
En fait, nous pouvons voir un avertissement ici qui dit nom non défini.

08:41.720 --> 08:44.180
Et puis bien c'est parce que nous utilisons ici le.

08:44.230 --> 08:46.030
Et puis raccourci.

08:46.350 --> 08:48.530
Et nous devons utiliser un raccourci ici.

08:48.590 --> 08:52.780
Et pour notre flambeau commencer et à Mudgal et puis il va disparaître.

08:52.880 --> 08:53.670
Et c'est parti.

08:53.690 --> 08:54.580
Parfait.

08:54.590 --> 09:00.800
À l'heure actuelle, nous avons de nouveaux avertissements. Tous les avertissements ici sont juste pour spécifier que ce que nous importons n'est pas

09:00.800 --> 09:01.520
encore utilisé.

09:01.580 --> 09:04.660
C'est bon, nous les utiliserons après.

09:04.670 --> 09:10.010
Très bien alors nous avons deux autres variables que nous voulons définir pour objet.

09:10.190 --> 09:15.820
Et ce seront les connexions complètes des connexions complètes entre les différentes couches de notre réseau

09:15.830 --> 09:16.810
de neurones.

09:16.820 --> 09:21.800
Donc, comme nous voulons créer un réseau de neurones composé d’une seule tête dans leur monde, il

09:21.800 --> 09:23.440
y aura deux connexions complètes.

09:23.570 --> 09:27.740
Il y aura une première connexion complète entre la couche d'entrée et la couche masquée.

09:27.980 --> 09:32.450
Et une seconde connexion complète entre la colline et la couche de sortie.

09:32.480 --> 09:34.770
Commençons donc par la première connexion complète.

09:34.890 --> 09:43.310
Nous allons l'appeler SE1. Encore une fois, j'utilise moi-même ici pour spécifier que FC est une variable de mon objet pour résoudre ce

09:43.780 --> 09:44.530
problème.

09:44.530 --> 09:47.490
FC un qui sera égal à.

09:47.630 --> 09:55.160
Et maintenant, nous utilisons le module N dans et nous allons utiliser une fonction appelée R linéaire et c’est

09:55.160 --> 10:02.080
précisément pour établir cette connexion complète entre les neurones et la couche d’entrée aux neurones cachés.

10:02.180 --> 10:04.090
Et qu'est-ce que je veux dire par connexion complète.

10:04.160 --> 10:09.190
Cela signifie que tous les neurones de la couche d'entrée seront tous connectés à tous les neurones

10:09.190 --> 10:09.920
de l'ici.

10:10.190 --> 10:16.140
Et donc pour établir cette connexion, nous utilisons cette fonction linéaire à laquelle nous devons ajouter des arguments.

10:16.190 --> 10:19.880
Et comme vous pouvez le constater, ces arguments figurent dans les fonctionnalités.

10:19.880 --> 10:25.370
C’est donc le nombre de neurones de la première loi sur laquelle vous souhaitez connecter des entités, c’est-à-dire

10:25.370 --> 10:30.110
le nombre de neurones de la deuxième couche à connecter, la couche de droite qui

10:30.110 --> 10:32.360
est la couche cachée et vraie.

10:32.420 --> 10:38.850
Donc, en vélo, nous garderons la valeur par défaut, c'est-à-dire pour avoir un biais et pas seulement un poids

10:38.900 --> 10:43.350
lié à la course, il faudra attendre et un biais pour chaque couche.

10:43.610 --> 10:46.140
Et si bien voyons ce que nous devons entrer.

10:46.280 --> 10:51.850
Le premier argument des entités est donc le nombre de neurones d’entrée dans la couche d’entrée.

10:52.000 --> 10:52.930
Et alors où est-il.

10:53.030 --> 10:55.080
Eh bien c'est en fait imprécis.

10:55.100 --> 11:01.930
C’est l’argument de notre fonction init qui nous permettra plus tard de combattre l’orientation à trois signaux

11:02.200 --> 11:04.150
et l’orientation de Mannus.

11:04.160 --> 11:05.020
Alors on y va.

11:05.190 --> 11:14.300
Lorsque les premiers arguments et la taille, puis le deuxième argument sont des fonctionnalités à savoir c'est le nombre de neurones que nous

11:14.300 --> 11:17.090
voulons avoir dans la deuxième couche.

11:17.180 --> 11:20.450
La deuxième couche qui sera entièrement connectée à la première couche.

11:20.450 --> 11:24.960
Et maintenant, la question est de savoir combien de neurones voulons-nous dans cette couche cachée.

11:25.220 --> 11:27.420
Eh bien, j'ai beaucoup d'entraînement aux paramètres.

11:27.440 --> 11:29.110
J'ai beaucoup expérimenté.

11:29.210 --> 11:31.940
C'est ce que nous faisons ou c'est ce que nous faisons plus en profondeur.

11:31.940 --> 11:38.270
En général, nous expérimentons beaucoup pour voir quel serait le meilleur réseau de neurones pour notre

11:38.270 --> 11:39.170
problème spécifique.

11:39.170 --> 11:45.950
J'ai donc essayé de nombreuses valeurs et j'ai fini par choisir 30 pistes dans une couche cachée. Vous verrez qu'avec ce

11:45.950 --> 11:50.750
nombre, vous obtiendrez de très bons résultats, mais n'hésitez pas à changer l'architecture du réseau

11:50.750 --> 11:51.580
de neurones.

11:51.580 --> 11:53.120
N'hésitez pas à jouer avec.

11:53.180 --> 11:58.730
Vous pouvez non seulement modifier le nombre de neurones dans l'ici et là, mais vous pouvez également ajouter

11:59.150 --> 12:05.000
quelques couches supplémentaires afin d'obtenir une voiture encore meilleure, mais 30 neurones Hinna nous fourniront un bon réseau neuronal et

12:05.000 --> 12:06.000
une bonne cause.

12:06.020 --> 12:07.390
C'est ce que nous recherchons.

12:07.520 --> 12:08.410
Et c'est parti.

12:08.420 --> 12:13.500
Nous avons vraiment notre première connexion complète avec cette fonction linéaire.

12:13.520 --> 12:16.910
Nous établissons la connexion entre la couche d’entrée et la jambe cachée.

12:17.360 --> 12:23.270
Et maintenant, il est temps d'établir la deuxième connexion complète, à savoir la connexion complète entre la couche masquée

12:23.600 --> 12:25.180
et la couche de sortie.

12:25.490 --> 12:26.750
Alors on y va.

12:26.750 --> 12:31.380
Nous allons appeler cette deuxième connexion complète à C2.

12:31.490 --> 12:32.280
Nous y voilà.

12:32.360 --> 12:36.400
Et encore, cela est disponible pour plus d'objets utilisant Saphir.

12:36.650 --> 12:38.330
Et là encore, nous utilisons.

12:38.450 --> 12:45.310
En fait, nous pouvons copier ceci parce que nous allons utiliser le module N dans le module, puis la fonction linéaire.

12:45.530 --> 12:49.250
Mais nous devons d'abord modifier les arguments bien sûr.

12:49.280 --> 12:55.050
C'est la même chose en premier lieu, c'est le nombre de neurones que nous allons avoir dans la première couche de la connexion.

12:55.190 --> 12:56.510
Donc c'est le caché là.

12:56.720 --> 13:03.810
Et donc cela fait 30 et puis le deuxième argument est le nombre de neurones dans la deuxième couche de la connexion

13:04.010 --> 13:08.810
et cela correspond à la couche de sortie et à la sortie qu’elle a.

13:08.980 --> 13:15.020
Et les neurones réels qui seront plus tard trois, car nous avons trois actions possibles, mais nous devons jusqu’à présent utiliser

13:15.020 --> 13:16.930
les noms que nous avons définis.

13:17.050 --> 13:23.990
C'est le nom de l'argument de la fonction init et par conséquent nous entrons ici et l'action et

13:23.990 --> 13:24.950
c'est parti.

13:24.950 --> 13:27.760
Tout d’abord nos connexions de nuplets re.

13:27.920 --> 13:30.980
Et deuxièmement, toute fonction est Israël.

13:31.400 --> 13:36.940
C'est donc ce que nous allons initialiser notre objet chaque fois que nous créons un objet à partir de la classe network.

13:37.130 --> 13:44.300
Et donc, dès que nous créons bien un objet, toutes ces variables pour variables ici ont une taille et une réaction.

13:44.380 --> 13:46.980
Vous et un deux seront définis.

13:47.180 --> 13:52.060
Et c’est ainsi que nous obtiendrons l’architecture de notre réseau d’animaux pour chaque objet que nous créons.

13:52.160 --> 13:59.450
Chaque objet correspondra à un réseau de neurones de cinq neurones d’entrée, de 30 neurones cachés et de trois neurones

13:59.450 --> 14:00.440
de sortie.

14:00.470 --> 14:01.430
Alors on y va.

14:01.430 --> 14:06.980
Nous en avons terminé avec cette première fonction et nous pouvons maintenant passer à la deuxième fonction

14:06.980 --> 14:13.100
qui est la fonction de transfert et qui sera utilisée pour activer les neurones du réseau de neurones à

14:13.100 --> 14:19.500
l’aide de la fonction d’activation du redresseur et surtout pour revenir aux valeurs de cube les sorties d'un seul réseau.

14:19.580 --> 14:23.420
J'ai donc hâte de le faire dans le prochain tutoriel et jusque-là I.
