Une fonction pour gérer les minibatch de données

Un réseau de neurones avec une seule couche

Dans PyTorch, une couche entièrement connectée est définie dans la classe Linear. Notez que nous avons passé deux arguments dans nn.Linear. Le premier spécifie la dimension de la donnée d'entrée qui est $2$, et le second est la dimension de la donnée de sortie, qui est un scalaire unique et donc $1$.

Initialisation des paramètres du modèle

Avant d'utiliser l'objet net, nous devons initialiser les paramètres du modèle, comme les poids et le biais dans le modèle de régression linéaire. Ici, nous spécifions que chaque paramètre de poids doit être échantillonné de manière aléatoire à partir d'une distribution normale avec une moyenne de $0$ et un écart type de $0.01$. Le paramètre de biais sera initialisé à zéro.

Comme nous avons spécifié les dimensions d'entrée et de sortie lors de la construction de nn.Linear, nous pouvons maintenant accéder directement aux paramètres pour spécifier leurs valeurs initiales. Nous localisons d'abord la couche par net[0], qui est la première couche du réseau, puis nous utilisons les méthodes weight.data et bias.data pour accéder aux paramètres. Ensuite, nous utilisons les méthodes de remplacement normal_ et fill_ pour écraser les valeurs des paramètres.

Déclaration de la fonction de perte

Déclaration de l'algorithme d'optimisation

La descente de gradient stochastique par minibatch est un outil standard pour l'optimisation des réseaux de neurones et PyTorch le prend donc en charge, ainsi qu'un certain nombre de variations de cet algorithme dans le module optim. Lorsque nous instancions une instance SGD, nous spécifions les paramètres à optimiser (que nous pouvons obtenir de notre réseau via net.parameters()), avec un dictionnaire d'hyperparamètres requis par notre algorithme d'optimisation. La descente de gradient stochastique par minibatch nécessite simplement que nous définissions la valeur lr, qui est fixée à $0.03$ ici.

Entrainement

Pendant un certain nombre d'époques (epoch), nous ferons un passage complet sur l'ensemble de données (train_data), en saisissant itérativement un minibatch d'entrées et les vraies valeurs de la variable réponse (labels). Pour chaque minibatch, nous suivons le étapes suivantes :

Nous calculons et affichons la perte après chaque epoch pour suivre la progression.

Ci-dessous, nous comparons les paramètres du modèle appris par l'entraînement sur les données et les paramètres réels qui ont généré les données.

Jeu de données de classification d'images

L'un des jeux de données les plus utilisés pour la classification d'images est le jeu de données MNIST [LeCun et al., 1998]. Bien qu'il ait eu un bon parcours en tant que jeu de données de référence, même les modèles simples selon les normes actuelles atteignent une précision de classification supérieure à 95 %, ce qui le rend impropre à distinguer les modèles les plus forts des plus faibles. Aujourd'hui, MNIST sert davantage de vérification que de référence. Nous allons nous concentrer sur le jeu de données Fashion-MNIST [Xiao et al., 2017], qualitativement similaire mais comparativement complexe, qui a été publié en 2017.

Lecture du jeu de données

Nous pouvons télécharger et lire le jeu de données Fashion-MNIST en mémoire grâce aux fonctions intégrées.

Fashion-MNIST se compose d'images de 10 catégories, chacune représentée par 6000 images dans l'ensemble de données d'entraînement et par 1000 dans l'ensemble de données de test. Un ensemble de données de test (ou ensemble de test) est utilisé pour évaluer les performances du modèle et non pour l'apprentissage. Par conséquent, l'ensemble d'entraînement et l'ensemble de test contiennent respectivement 60000 et 10000 images.

La hauteur et la largeur de chaque image d'entrée sont toutes les deux de $28$ pixels. Notez que le jeu de données est constitué d'images en niveaux de gris, dont le nombre de canaux est de $1$. Une image est de hauteur $h$, de largeur $w$ pixels sous la forme $h \times w$ ou $(h, w)$.

Les images de Fashion-MNIST sont associées aux catégories suivantes : t-shirt, pantalon, pull-over, robe, manteau, sandale, chemise, basket, sac et bottine. La fonction suivante permet de convertir les indices numériques des étiquettes en leurs noms dans le texte.

Voici les images et leurs étiquettes correspondantes (en texte) pour les premiers exemples de l'ensemble de données d'entraînement.

Lecture des minibatch

Pour nous faciliter la vie lors de la lecture des ensembles d'apprentissage et de test, nous utilisons l'itérateur de données intégré plutôt que d'en créer un de toutes pièces. Rappelons qu'à chaque itération, un itérateur de données lit un mini-batch de données de taille batch_size à chaque fois. Nous mélangeons également de manière aléatoire les exemples pour l'itérateur de données d'apprentissage.