File size: 28,958 Bytes
0b86555
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
774e27c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0b86555
774e27c
 
 
0b86555
774e27c
 
 
 
 
 
0b86555
774e27c
 
0b86555
774e27c
0b86555
774e27c
 
 
 
 
 
0b86555
774e27c
 
 
 
0b86555
774e27c
 
 
0b86555
774e27c
ac65f3b
774e27c
 
 
 
ac65f3b
774e27c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
07dd12c
774e27c
 
ac65f3b
774e27c
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
import gradio as gr
import random
import pandas as pd
import numpy as np
import json

# Préparation des données
questions = [
    {
        "question": "Quelle est la différence principale entre un algorithme classique et un algorithme de Machine Learning ?",
        "options": [
            "A) Les algorithmes classiques sont plus précis",
            "B) Les algorithmes de Machine Learning utilisent les données historiques pour produire un modèle prédictif",
            "C) Les algorithmes classiques fonctionnent sur de plus grandes bases de données",
            "D) Les algorithmes de Machine Learning sont toujours supervisés"
        ],
        "correct": "B",
        "category": "Fondamentaux du Machine Learning"
    },
    {
        "question": "Dans un modèle linéaire f(x) = ax + b, que représentent a et b ?",
        "options": [
            "A) a est l'ordonnée à l'origine et b est la pente",
            "B) a est la pente et b est l'ordonnée à l'origine",
            "C) a est la variable d'entrée et b est la variable de sortie",
            "D) a est la moyenne et b est l'écart-type"
        ],
        "correct": "B",
        "category": "Fondamentaux du Machine Learning"
    },
    {
        "question": "Quel type d'apprentissage utilise des données étiquetées pour entraîner un modèle ?",
        "options": [
            "A) Apprentissage non supervisé",
            "B) Apprentissage par renforcement",
            "C) Apprentissage supervisé",
            "D) Apprentissage semi-supervisé"
        ],
        "correct": "C",
        "category": "Fondamentaux du Machine Learning"
    },
    {
        "question": "Qu'est-ce que le surapprentissage (overfitting) ?",
        "options": [
            "A) Un modèle qui apprend trop rapidement",
            "B) Un modèle qui ne parvient pas à capturer les tendances dans les données d'entraînement",
            "C) Un modèle qui capture trop bien les données d'entraînement mais généralise mal",
            "D) Un modèle qui nécessite trop de données d'entraînement"
        ],
        "correct": "C",
        "category": "Fondamentaux du Machine Learning"
    },
    {
        "question": "Pourquoi utilise-t-on le Deep Learning plutôt que le Machine Learning classique pour certains problèmes ?",
        "options": [
            "A) Le Deep Learning est toujours plus précis",
            "B) Le Machine Learning classique est limité avec les données non-structurées et de grande dimension",
            "C) Le Deep Learning nécessite moins de données",
            "D) Le Machine Learning classique est plus complexe à implémenter"
        ],
        "correct": "B",
        "category": "Fondamentaux du Machine Learning"
    },
    {
        "question": "Qu'est-ce qu'un perceptron ?",
        "options": [
            "A) Un algorithme de classification d'images",
            "B) L'élément de base d'un réseau de neurones artificiels, inspiré des neurones biologiques",
            "C) Une technique de visualisation de données",
            "D) Un type de fonction d'activation"
        ],
        "correct": "B",
        "category": "Réseaux de Neurones Artificiels"
    },
    {
        "question": "Quels sont les éléments caractéristiques d'un perceptron ?",
        "options": [
            "A) Son activation, ses connexions d'entrée, sa fonction d'entrée et sa fonction d'activation",
            "B) Sa taille, sa couleur, sa forme et sa position",
            "C) Son algorithme, sa mémoire, son processeur et son interface",
            "D) Son bias, son taux d'apprentissage, sa dimension et sa profondeur"
        ],
        "correct": "A",
        "category": "Réseaux de Neurones Artificiels"
    },
    {
        "question": "Quelles sont les principales couches d'un réseau de neurones ?",
        "options": [
            "A) Couche d'entrée, couche cachée, couche de sortie",
            "B) Couche primaire, couche secondaire, couche tertiaire",
            "C) Couche superficielle, couche intermédiaire, couche profonde",
            "D) Couche d'acquisition, couche de traitement, couche de restitution"
        ],
        "correct": "A",
        "category": "Réseaux de Neurones Artificiels"
    },
    {
        "question": "Comment fonctionne l'algorithme de rétropropagation (backpropagation) ?",
        "options": [
            "A) Il propage les entrées de la première à la dernière couche",
            "B) Il calcule le gradient de la fonction d'erreur et met à jour les paramètres du réseau",
            "C) Il supprime les neurones inutiles du réseau",
            "D) Il compare les sorties de différents modèles"
        ],
        "correct": "B",
        "category": "Réseaux de Neurones Artificiels"
    },
    {
        "question": "Qu'est-ce qu'une fonction d'activation dans un réseau de neurones ?",
        "options": [
            "A) Une fonction qui initialise les poids du réseau",
            "B) Une fonction qui transforme la somme pondérée des entrées d'un neurone en sortie",
            "C) Une fonction qui détermine la vitesse d'apprentissage",
            "D) Une fonction qui compte le nombre de neurones actifs"
        ],
        "correct": "B",
        "category": "Réseaux de Neurones Artificiels"
    },
    {
        "question": "Qu'est-ce qu'un hyperparamètre dans un réseau de neurones ?",
        "options": [
            "A) Un paramètre dont la valeur est apprise pendant l'entraînement",
            "B) Un paramètre qui contrôle les autres paramètres",
            "C) Un paramètre constant dont la valeur est fixée avant le début du processus d'apprentissage",
            "D) Un paramètre qui change automatiquement pendant l'exécution"
        ],
        "correct": "C",
        "category": "Hyperparamètres"
    },
    {
        "question": "Parmi ces éléments, lequel n'est PAS un hyperparamètre ?",
        "options": [
            "A) Taux d'apprentissage",
            "B) Poids des connexions entre neurones",
            "C) Nombre de couches cachées",
            "D) Taille des échantillons (batch size)"
        ],
        "correct": "B",
        "category": "Hyperparamètres"
    },
    {
        "question": "Quel est l'effet d'un taux d'apprentissage trop élevé ?",
        "options": [
            "A) L'apprentissage est plus lent mais plus stable",
            "B) L'apprentissage est plus rapide mais potentiellement instable",
            "C) L'apprentissage ne démarre pas",
            "D) L'apprentissage est toujours meilleur"
        ],
        "correct": "B",
        "category": "Hyperparamètres"
    },
    {
        "question": "À quoi sert la technique de \"dropout\" dans un réseau de neurones ?",
        "options": [
            "A) À augmenter la vitesse d'entraînement",
            "B) À réduire le surapprentissage en désactivant aléatoirement des neurones",
            "C) À ajouter plus de neurones progressivement",
            "D) À stabiliser la fonction d'activation"
        ],
        "correct": "B",
        "category": "Hyperparamètres"
    },
    {
        "question": "Qu'est-ce que la technique d'\"Early Stopping\" ?",
        "options": [
            "A) Arrêter l'entraînement après un nombre fixe d'époques",
            "B) Interrompre l'entraînement lorsqu'il n'y a plus d'amélioration sur le jeu de validation",
            "C) Commencer l'entraînement avec moins de neurones",
            "D) Limiter le nombre d'exemples d'entraînement"
        ],
        "correct": "B",
        "category": "Hyperparamètres"
    },
    {
        "question": "Quelle est la définition du Deep Learning ?",
        "options": [
            "A) Une technique d'apprentissage automatique basée sur des arbres de décision profonds",
            "B) Une catégorie d'IA qui exploite des réseaux de neurones artificiels avec plusieurs couches",
            "C) Un algorithme spécifique pour l'analyse de données complexes",
            "D) Une méthode d'apprentissage par renforcement avancée"
        ],
        "correct": "B",
        "category": "Deep Learning"
    },
    {
        "question": "Quelle est la principale différence entre le Deep Learning et le Machine Learning traditionnel ?",
        "options": [
            "A) Le Deep Learning nécessite moins de données",
            "B) Le Machine Learning utilise des réseaux de neurones plus complexes",
            "C) Le Deep Learning utilise des réseaux de neurones à plusieurs couches pour apprendre des représentations hiérarchiques",
            "D) Le Machine Learning est plus récent que le Deep Learning"
        ],
        "correct": "C",
        "category": "Deep Learning"
    },
    {
        "question": "Lequel de ces modèles n'appartient PAS au Deep Learning ?",
        "options": [
            "A) CNN (Convolutional Neural Network)",
            "B) RNN (Recurrent Neural Network)",
            "C) SVM (Support Vector Machine)",
            "D) Transformer"
        ],
        "correct": "C",
        "category": "Deep Learning"
    },
    {
        "question": "Pourquoi le Deep Learning est-il particulièrement efficace pour traiter des images ?",
        "options": [
            "A) Parce qu'il utilise moins de ressources computationnelles",
            "B) Parce qu'il peut extraire automatiquement des caractéristiques hiérarchiques",
            "C) Parce qu'il nécessite moins de données d'entraînement",
            "D) Parce qu'il est plus simple à implémenter"
        ],
        "correct": "B",
        "category": "Deep Learning"
    },
    {
        "question": "Qu'est-ce que le \"transfer learning\" en Deep Learning ?",
        "options": [
            "A) Transférer des données d'un ordinateur à un autre",
            "B) Transférer la connaissance acquise sur un jeu de données \"source\" pour mieux traiter un nouveau jeu de données \"cible\"",
            "C) Transférer un modèle d'un langage de programmation à un autre",
            "D) Transférer l'apprentissage d'un réseau de neurones à un autre type d'algorithme"
        ],
        "correct": "B",
        "category": "Deep Learning"
    },
    {
        "question": "Quelles sont les principales opérations appliquées dans un CNN ?",
        "options": [
            "A) Convolution, pooling et fonction d'activation",
            "B) Addition, soustraction et multiplication",
            "C) Encodage, décodage et normalisation",
            "D) Segmentation, classification et régression"
        ],
        "correct": "A",
        "category": "Réseaux de Neurones à Convolution (CNN)"
    },
    {
        "question": "À quoi sert l'opération de convolution dans un CNN ?",
        "options": [
            "A) À réduire la taille de l'image",
            "B) À détecter les caractéristiques d'une image",
            "C) À augmenter le nombre de pixels",
            "D) À transformer l'image en noir et blanc"
        ],
        "correct": "B",
        "category": "Réseaux de Neurones à Convolution (CNN)"
    },
    {
        "question": "Qu'est-ce que le \"pooling\" dans un CNN ?",
        "options": [
            "A) Une technique pour combiner plusieurs images",
            "B) Une méthode pour réduire la dimensionnalité en conservant les informations importantes",
            "C) Un algorithme de partage de poids",
            "D) Une fonction d'activation spécifique aux CNN"
        ],
        "correct": "B",
        "category": "Réseaux de Neurones à Convolution (CNN)"
    },
    {
        "question": "Quel est le rôle du \"flattening\" dans un CNN ?",
        "options": [
            "A) Transformer une matrice multidimensionnelle en vecteur unidimensionnel",
            "B) Aplatir physiquement le matériel informatique",
            "C) Réduire le nombre de couches du réseau",
            "D) Éliminer les variations d'intensité dans une image"
        ],
        "correct": "A",
        "category": "Réseaux de Neurones à Convolution (CNN)"
    },
    {
        "question": "Qu'est-ce que le \"padding\" dans une couche de convolution ?",
        "options": [
            "A) Une technique pour augmenter la taille des filtres",
            "B) L'ajout de zéros autour des bords d'une image avant la convolution",
            "C) Un paramètre qui détermine la couleur de fond",
            "D) Une méthode pour réduire le bruit dans l'image"
        ],
        "correct": "B",
        "category": "Réseaux de Neurones à Convolution (CNN)"
    },
    {
        "question": "Que signifie le terme \"stride\" dans une couche de convolution ?",
        "options": [
            "A) La largeur des filtres utilisés",
            "B) Le nombre de filtres appliqués",
            "C) La distance de déplacement du filtre à chaque application",
            "D) La profondeur de la couche de convolution"
        ],
        "correct": "C",
        "category": "Réseaux de Neurones à Convolution (CNN)"
    },
    {
        "question": "Parmi ces architectures, laquelle n'est PAS un modèle CNN ?",
        "options": [
            "A) VGG16",
            "B) ResNet",
            "C) LSTM",
            "D) AlexNet"
        ],
        "correct": "C",
        "category": "Réseaux de Neurones à Convolution (CNN)"
    },
    {
        "question": "Quel type de problème un CNN n'est PAS conçu pour résoudre ?",
        "options": [
            "A) Classification d'images",
            "B) Détection d'objets",
            "C) Prédiction de séries temporelles",
            "D) Segmentation sémantique"
        ],
        "correct": "C",
        "category": "Réseaux de Neurones à Convolution (CNN)"
    },
    {
        "question": "Pour quel type de données les RNN sont-ils particulièrement adaptés ?",
        "options": [
            "A) Images 2D",
            "B) Données séquentielles (texte, séries temporelles)",
            "C) Graphes",
            "D) Tables de données structurées"
        ],
        "correct": "B",
        "category": "Réseaux de Neurones Récurrents (RNN)"
    },
    {
        "question": "Quelle est la caractéristique principale des RNN par rapport aux réseaux feed-forward ?",
        "options": [
            "A) Ils utilisent plus de neurones",
            "B) Ils ont une mémoire interne qui conserve des informations sur les états précédents",
            "C) Ils sont plus rapides à entraîner",
            "D) Ils nécessitent moins de données d'entraînement"
        ],
        "correct": "B",
        "category": "Réseaux de Neurones Récurrents (RNN)"
    },
    {
        "question": "Quel problème majeur affecte les RNN simples lors de l'apprentissage de dépendances à long terme ?",
        "options": [
            "A) Le problème du gradient explosif",
            "B) Le problème du gradient qui disparaît (vanishing gradient)",
            "C) Le problème de surapprentissage",
            "D) Le problème de sous-apprentissage"
        ],
        "correct": "B",
        "category": "Réseaux de Neurones Récurrents (RNN)"
    },
    {
        "question": "Quelle architecture a été développée pour résoudre le problème du gradient qui disparaît dans les RNN ?",
        "options": [
            "A) CNN",
            "B) LSTM (Long Short-Term Memory)",
            "C) GAN",
            "D) ResNet"
        ],
        "correct": "B",
        "category": "Réseaux de Neurones Récurrents (RNN)"
    },
    {
        "question": "Quelles sont les trois opérations principales dans une cellule LSTM ?",
        "options": [
            "A) Convolution, pooling, activation",
            "B) Encodage, traitement, décodage",
            "C) Forget Gate, Input Gate, Output Gate",
            "D) Lecture, écriture, mise à jour"
        ],
        "correct": "C",
        "category": "Réseaux de Neurones Récurrents (RNN)"
    },
    {
        "question": "À quoi sert la \"Forget Gate\" dans une cellule LSTM ?",
        "options": [
            "A) À supprimer complètement le réseau",
            "B) À décider quelles informations de l'état précédent doivent être oubliées",
            "C) À ignorer les nouvelles entrées",
            "D) À réinitialiser tous les poids"
        ],
        "correct": "B",
        "category": "Réseaux de Neurones Récurrents (RNN)"
    },
    {
        "question": "Quelle est l'innovation principale introduite par l'architecture Transformer ?",
        "options": [
            "A) L'utilisation exclusive de couches de convolution",
            "B) Le mécanisme d'attention qui remplace les connexions récurrentes",
            "C) L'élimination complète des couches cachées",
            "D) L'utilisation de fonctions d'activation plus complexes"
        ],
        "correct": "B",
        "category": "Transformers et Mécanismes d'Attention"
    },
    {
        "question": "Qu'est-ce que le \"Scaled Dot-Product Attention\" dans les Transformers ?",
        "options": [
            "A) Une technique pour augmenter la taille des matrices",
            "B) Un mécanisme permettant de calculer l'importance relative entre différents éléments d'une séquence",
            "C) Une méthode de normalisation des données",
            "D) Un type de fonction d'activation"
        ],
        "correct": "B",
        "category": "Transformers et Mécanismes d'Attention"
    },
    {
        "question": "Que représentent les trois composantes Q, K, V dans le mécanisme d'attention ?",
        "options": [
            "A) Questions, Kilomètres, Valeurs",
            "B) Qualité, Kinésie, Vitesse",
            "C) Query (requête), Key (clé), Value (valeur)",
            "D) Quantité, Kurtosis, Variance"
        ],
        "correct": "C",
        "category": "Transformers et Mécanismes d'Attention"
    },
    {
        "question": "Quelle est la différence entre le \"Self-Attention\" et le \"Multi-Head Attention\" ?",
        "options": [
            "A) Le Self-Attention s'applique à une seule séquence, tandis que le Multi-Head Attention combine plusieurs mécanismes d'attention en parallèle",
            "B) Le Self-Attention utilise une tête, tandis que le Multi-Head Attention utilise plusieurs têtes physiques",
            "C) Le Self-Attention est supervisé, tandis que le Multi-Head Attention est non supervisé",
            "D) Le Self-Attention est utilisé pour les images, tandis que le Multi-Head Attention est utilisé pour le texte"
        ],
        "correct": "A",
        "category": "Transformers et Mécanismes d'Attention"
    },
    {
        "question": "Quelle est la particularité du \"Masked Multi-Head Attention\" utilisé dans le décodeur d'un Transformer ?",
        "options": [
            "A) Il masque certains neurones aléatoirement",
            "B) Il empêche les positions de faire attention aux positions futures",
            "C) Il cache certaines parties de l'image",
            "D) Il supprime les mots peu fréquents"
        ],
        "correct": "B",
        "category": "Transformers et Mécanismes d'Attention"
    },
    {
        "question": "Quelle architecture a été introduite dans le papier \"Attention is All You Need\" ?",
        "options": [
            "A) ResNet",
            "B) LSTM",
            "C) Transformer",
            "D) GAN"
        ],
        "correct": "C",
        "category": "Transformers et Mécanismes d'Attention"
    },
    {
        "question": "Quel est le principe de base d'un auto-encodeur ?",
        "options": [
            "A) Encoder les données puis les décoder pour retrouver l'entrée originale",
            "B) Classer automatiquement les données en catégories",
            "C) Générer de nouvelles données aléatoires",
            "D) Compresser les données de manière irréversible"
        ],
        "correct": "A",
        "category": "Auto-encodeurs"
    },
    {
        "question": "Qu'est-ce qu'un \"bottleneck\" (goulot d'étranglement) dans un auto-encodeur ?",
        "options": [
            "A) Un problème technique qui ralentit l'entraînement",
            "B) Une couche cachée de dimension réduite qui force le réseau à apprendre une représentation compressée",
            "C) Un défaut dans l'architecture du réseau",
            "D) Une limite dans la quantité de données qu'on peut traiter"
        ],
        "correct": "B",
        "category": "Auto-encodeurs"
    },
    {
        "question": "Comment calcule-t-on généralement l'erreur de reconstruction dans un auto-encodeur ?",
        "options": [
            "A) Par la différence entre le nombre de neurones d'entrée et de sortie",
            "B) Par la distance entre les représentations latentes de différentes entrées",
            "C) Par la différence entre l'entrée originale et la sortie reconstruite",
            "D) Par le temps nécessaire à l'encodage et au décodage"
        ],
        "correct": "C",
        "category": "Auto-encodeurs"
    },
    {
        "question": "Qu'est-ce qui caractérise un \"Denoising Auto-Encoder\" ?",
        "options": [
            "A) Il produit des sorties sans bruit",
            "B) Il ajoute du bruit aux données d'entrée et tente de reconstruire les données originales",
            "C) Il filtre automatiquement les données bruitées",
            "D) Il utilise le bruit comme fonction d'activation"
        ],
        "correct": "B",
        "category": "Auto-encodeurs"
    },
    {
        "question": "Quelle est l'utilité principale des auto-encodeurs en Deep Learning ?",
        "options": [
            "A) Uniquement pour la compression de données",
            "B) Pour la génération d'images réalistes",
            "C) Pour la capture de la structure des données et l'apprentissage de représentations utiles",
            "D) Pour remplacer les réseaux convolutifs"
        ],
        "correct": "C",
        "category": "Auto-encodeurs"
    },
    {
        "question": "Quelle méthode est utilisée pour évaluer les performances d'un modèle de classification ?",
        "options": [
            "A) Régression linéaire",
            "B) Matrice de confusion",
            "C) Analyse en composantes principales",
            "D) Clustering k-means"
        ],
        "correct": "B",
        "category": "Questions Diverses"
    },
    {
        "question": "Qu'est-ce que l'augmentation de données (data augmentation) en Deep Learning ?",
        "options": [
            "A) L'ajout de nouvelles caractéristiques aux données existantes",
            "B) La création de données synthétiques pour augmenter la taille du jeu d'entraînement",
            "C) L'application de transformations aux données existantes pour créer de nouveaux exemples d'entraînement",
            "D) L'augmentation artificielle du nombre d'époques d'entraînement"
        ],
        "correct": "C",
        "category": "Questions Diverses"
    },
    {
        "question": "Quelle technique est utilisée pour éviter le surapprentissage dans les modèles de Deep Learning ?",
        "options": [
            "A) Augmenter le nombre de paramètres",
            "B) Réduire le nombre d'exemples d'entraînement",
            "C) Régularisation (comme L1, L2, dropout)",
            "D) Utiliser uniquement des fonctions d'activation linéaires"
        ],
        "correct": "C",
        "category": "Questions Diverses"
    },
    {
        "question": "Dans quel cas utiliserait-on le transfert d'apprentissage (transfer learning) ?",
        "options": [
            "A) Lorsqu'on dispose de très grandes quantités de données d'entraînement",
            "B) Lorsqu'on a peu de données pour un problème mais qu'il existe un modèle pré-entraîné sur un problème similaire",
            "C) Uniquement pour les problèmes de traitement du langage naturel",
            "D) Lorsqu'on veut transférer les données d'un ordinateur à un autre"
        ],
        "correct": "B",
        "category": "Questions Diverses"
    },
    {
        "question": "Quelle est la différence entre la segmentation sémantique et la détection d'objets ?",
        "options": [
            "A) La segmentation sémantique identifie chaque pixel d'une image, tandis que la détection d'objets localise les objets avec des boîtes englobantes",
            "B) La segmentation sémantique fonctionne uniquement sur les images en noir et blanc",
            "C) La détection d'objets est une technique dépassée, remplacée par la segmentation sémantique",
            "D) Il n'y a pas de différence, ce sont deux termes pour la même technique"
        ],
        "correct": "A",
        "category": "Questions Diverses"
    }
]



# Add correct_answers variable
correct_answers = [q["correct"] for q in questions]

def calculate_score(user_answers):
    # Convertir les réponses utilisateur de A,B,C,D à 0,1,2,3
    idx_answers = []
    for ans in user_answers:
        if ans == "A":
            idx_answers.append(0)
        elif ans == "B":
            idx_answers.append(1)
        elif ans == "C":
            idx_answers.append(2)
        elif ans == "D":
            idx_answers.append(3)
        else:
            idx_answers.append(None)  # Pour gérer les réponses vides
    
    # Convertir les réponses correctes
    correct_idx = []
    for ans in correct_answers:
        if ans == "A":
            correct_idx.append(0)
        elif ans == "B":
            correct_idx.append(1)
        elif ans == "C":
            correct_idx.append(2)
        elif ans == "D":
            correct_idx.append(3)
    
    # Calculer le score
    score = 0
    user_responses = []
    
    for i in range(len(idx_answers)):
        if idx_answers[i] is not None and idx_answers[i] == correct_idx[i]:
            score += 1
            user_responses.append(f"Question {i+1}: Correct ✓ - Votre réponse: {user_answers[i]}")
        else:
            user_responses.append(f"Question {i+1}: Incorrect ✗ - Votre réponse: {user_answers[i] if idx_answers[i] is not None else 'Non répondue'}, Réponse correcte: {correct_answers[i]}")
    
    # Calculer la note sur 20
    note_sur_20 = (score / len(correct_answers)) * 20
    
    return score, note_sur_20, user_responses

# Modified qcm_app to handle multiple arguments from Gradio click event
def qcm_app(*user_responses):
    # Convert tuple of responses to list
    answers = list(user_responses)
    # Calculer le score
    score, note, detailed_responses = calculate_score(answers)
    
    # Formatter la sortie
    output = f"# Résultats du QCM sur la Gouvernance des Données\n\n"
    output += f"## Score: {score}/{len(questions)} questions correctes\n"
    output += f"## Note: {note:.2f}/20\n\n"
    
    output += "## Détail des réponses:\n\n"
    for resp in detailed_responses:
        output += f"- {resp}\n"
    
    return output

# Créer l'interface Gradio
with gr.Blocks(title="QCM - Gouvernance des Données") as demo:
    gr.Markdown("# Questionnaire à Choix Multiples - Gouvernance des Données")
    gr.Markdown("Répondez aux questions en sélectionnant la réponse correcte (A, B, C ou D).")
    
    user_choices = []
    with gr.Accordion("Questions", open=True):
        for i in range(len(questions)):
            with gr.Row():
                with gr.Column(scale=10):
                    gr.Markdown(f"### {questions[i]['question']}")
                    for opt in questions[i]['options']:
                        gr.Markdown(f"- {opt}")
                with gr.Column(scale=1):
                    # Changed from Dropdown to Radio for clickable answers
                    user_choice = gr.Radio(
                        choices=["A", "B", "C", "D"],
                        label=f"Question {i+1}"
                    )
                    user_choices.append(user_choice)
    
    submit_btn = gr.Button("Soumettre")
    output = gr.Markdown()
    
    submit_btn.click(
        fn=qcm_app,
        inputs=user_choices,
        outputs=output
    )

if __name__ == "__main__":
    demo.launch()