Apprendre à partir de zéro PyTorch (bas): régression logistique et classification des images

[New Ji-won EXAMEN Grâce à un code détaillé, comment installer PyTorch depuis le début, étape par étape, pour diriger le lecteur est familier avec ordinateur portable PyTorch et Jupyter, l'utilisation finale PyTorch réaliser une régression linéaire, la régression logistique et la classification d'image, très approprié pour les débutants 0 base.

Effectuer un classement d'images par régression logistique de PyTorch

MNIST données numériques manuscrites rédigées à partir de la base de données. 28px composition de l'image en niveaux de gris et une étiquette qui multiplie chaque images de chiffres manuscrits (0 à 9) de 28px.

Présentation de la torche, et torchvision MNIST

Rechercher lengh:

Cet ensemble de données a 60.000 images peuvent être utilisées pour former le modèle. Il y a une série de tests supplémentaires de 10.000 images peuvent être créées par le passage du train = False à la classe MNIST.

L'image est une classe PIL.Image.Image d'objet, l'image 28x28 et les tags. PIL est la Python Imaging Library Pillow.

Nous pouvons utiliser des images de vue matplotlib Jupyter dans, Matplotlib Python est le fait que les données scientifiques de traçage et bibliothèque graphique.

Regardez l'ensemble des données de quelques images:

En plus du matplotlib d'importation, a également ajouté une déclaration spéciale% en ligne de matplotlib, dit Jupyter pour dessiner des graphiques pour ordinateur portable.

Sans cette déclaration, alors, l'image Jupyter sera affiché dans une fenêtre pop-up. % Au début de l'instruction appelée commande magique IPython pour configurer le comportement Jupyter lui-même.

PyTorch pas directement sur l'image, vous devez convertir l'image en un tenseur.

ensemble de données PyTorch nous permet de définir une ou plusieurs fonctions de conversion qui sont appliquées à l'image au moment du chargement.

torchvision.transforms contient beaucoup de cette fonction prédéfinie, nous utiliserons la transformation ToTensor convertit l'image en PyTorchtensor.

Maintenant, l'image est convertie en tenseur 1x28x28. Une première dimension de canal de couleur pour le suivi. Etant donné que l'ensemble de données d'image est MNIST niveau de gris, de sorte qu'un seul canal. D'autres ensembles de données ont des images en couleur, il y a trois canaux dans ce cas: le rouge, le vert et le bleu (RVB).

Le regard de déposons sur quelques exemples de valeurs dans le tenseur:

0 représente le noir et blanc pour 1, les valeurs intermédiaires représentent les différentes nuances de gris. Ah, vous pouvez également utiliser plt.imshow le tenseur dessiné sous forme d'images.

S'il vous plaît noter que nous devons transférer à la plt.imshow matrice 28x28, sans la nécessité de la taille du canal.

Nous avons également adopté une cartographie couleur (CMAP = « gris »), des moyens que nous voulons voir l'image en échelle de gris.

Formation et validation des ensembles de données

Lors de la construction d'une machine dans le monde réel des modèles d'apprentissage, l'ensemble de données est divisé en trois parties est très commun:

  • Formation ensemble: pour la formation du modèle, à savoir, le calcul de la perte et le droit d'utiliser une descente de gradient pour ajuster les poids Modèle
  • Kit de validation: utilisé pour évaluer au cours de modèle de formation, les paramètres ultra-réglage (taux d'apprentissage, etc.) et choisir la meilleure version du modèle
  • La précision finale utilisée pour comparer différents modèles ou différents types de méthodes de modélisation et le modèle de reporting: L'ensemble de test
  • Dans ensemble de données MNIST, il y a 60000 à 10000 images de formation et des images de test. Ensemble de test est standardisé afin que les différents chercheurs rapportent les résultats pour le même ensemble d'images de ses modèles.

    Parce qu'il n'y a pas d'ensemble prédéfini de validation, il faut manuellement 60000 images divisés en ensembles de données de formation et de validation

    Définissons une fonction qui sélectionne au hasard une partie donnée de l'ensemble de validation d'images.

    split_indices index de tableau mélangées au hasard 0,1, ... n-1, et la séparation de la partie souhaitée de l'ensemble de validation.

    Avant de créer un ensemble de validation est très important pour la lecture aléatoire d'index, parce que les images de formation sont généralement classés par l'image de l'étiquette cible est 0 et 1 de l'image est ensuite suivie par image 2 s, et ainsi de suite.

    Si nous choisissons de seulement 20% de l'ensemble de validation en choisissant les derniers 20% des images, l'ensemble de validation comprendra que 8s et 9s de l'image, tout ensemble de formation ne contiendra pas 8s et 9s de l'image, il est donc impossible de former un bon modèle.

    Nous ajustons au hasard l'index et sélectionnez une petite partie (20%) comme un ensemble de validation.

    Vous pouvez maintenant créer PyTorch utiliser SubsetRandomSampler pour chaque chargeur de données, éléments d'échantillonnage aléatoire SubsetRandomSampler d'une liste d'index donné, tout en créant des données par lots.

    modèle

    Maintenant, nous sommes prêts chargeur de données, nous pouvons définir notre modèle.

    • Modèle de régression logistique avec presque le même modèle de régression linéaire, à savoir la présence des poids et des matrices de polarisation, et l'utilisation de simples opérations de matrice (pred = x @ w.t () + b) pour obtenir un signal de sortie
    • Tout comme nous utilisons la régression linéaire, on peut utiliser nn.Linear pour créer des modèles plutôt que de définir manuellement et initialiser la matrice
    • Depuis nn.Linear souhaitable est un tenseur pour chaque échantillon de formation, de sorte que chaque tenseur 1x28x28 image avant d'être livré au modèle doit être aplati dans une taille de 784 (28 * 28) du tenseur
    • La sortie de chaque image est la taille du tenseur 10, chaque élément tenseur représente la probabilité qu'une marque cible particulier (par exemple, de 0 à 9) de la. Prédites juste une image de l'étiquette avec la plus grande étiquette de probabilité

    Nous examinons les poids et les préjugés

    Bien que nos paramètres de volume programmé quantité de 7850, mais l'idée générale est similaire. Nos ensemble de données, et obtenir le premier lot, il contient 100 images, le transfert au modèle.

    Ensuite, diriger la sortie de l'erreur. En raison de la forme de nos données d'entrée est incorrecte. Notre forme d'image 1x28x28, mais nous en avons besoin d'être 784 vecteur.

    Que nous avons besoin, « Zhanping. » Nous utiliserons un tenseur de .reshape méthode, qui nous permettra de manière efficace « voir » chaque plan d'image comme vecteur, sans modifier les données sous-jacentes.

    Pour inclure cette fonctionnalité supplémentaire dans notre modèle, nous devons définir un modèle personnalisé en étendant la classe nn.Module de PyTorch.

    Dans __init__ méthode constructeur, nous utilisons l'exemple de poids nn.Linear et parti pris.

    méthode appelée avant lorsque nous avons adopté un certain nombre d'entrées au modèle, nous allons entrer dans le tenseur aplatir, puis passer à self.linear.

    xb.reshape (-1,28 * 28) à PyTorch spécifié, nous voulons voir xbtensor ayant deux dimensions, où la longueur le long de la seconde dimension est de 28 * 28 (à savoir, 784).

    .Reshape un paramètre peut être réglé à -1 (dans ce cas, la première dimension), de sorte PyTorch calculé automatiquement en fonction de la forme du tenseur d'origine.

    Notez que le modèle et ne pas avoir les attributs .weight de .BIAS (car ils sont dans des propriétés .linéaire), mais il a une méthode .parameters qui retourne une liste des poids et biais et peuvent être utilisés optimiseur PyTorch.

    Notre nouveau peut être utilisé comme modèle personnalisé avant. Voyons voir si elle est valide.

    Pour chaque image d'entrée 100, nous obtenons 10 sorties, pour chaque catégorie a. Comme mentionné précédemment, nous espérons que ces résultats ont représente la probabilité, mais cette fin, chaque élément des lignes de sortie doit être comprise entre 1 et ajouter entre 0-1, c'est clairement pas le cas ici.

    Pour convertir la ligne de sortie probabilité, nous utilisons la fonction softmax, qui a la formule suivante:

    Tout d'abord, par la somme de tous les éléments pour veiller à ce qu'ils ajoutent à celui que nous allons lignes de sortie chaque élément est remplacé yi e ^ yi, de sorte que tous les éléments sont positifs, nous chaque élément.

    Bien qu'il soit facile de réaliser la fonction softmax, nous utiliserons pour obtenir PyTorch fourni, car il applique tenseur multidimensionnel (la ligne de sortie de la liste dans notre exemple).

    softmax torch.nn.functional fonction incluse dans le paquet, et exige que nous devons appliquer la dimension spécifiée de softmax.

    Enfin, nous pouvons simplement sélectionner un index pour chaque ligne d'éléments de sortie avec la plus forte probabilité pour déterminer l'étiquette prévue de chaque image.

    Cela se fait à l'aide torch.max, elle renvoie l'index du plus grand élément et les éléments les plus long d'une dimension particulière du tenseur.

    L'impression numérique est au-dessus de la première étiquette de prédiction des images de formation. Nous les comparer avec l'étiquette réelle.

    De toute évidence, les prévisions et l'étiquette de l'étiquette réelle est complètement différent. En effet, nous avons commencé à utiliser des poids et des biais au hasard initialisés.

    Nous devons former le modèle, qui est, à l'aide d'une descente de gradient ajuster les poids pour faire de meilleures prédictions.

    Évaluer et mesurer la perte de la fonction

    Comme avec la régression linéaire, nous avons besoin d'une méthode pour évaluer la mise en uvre du modèle. Une façon naturelle est de trouver le pourcentage de l'étiquette de prédictions correctes, que la précision de la prédiction.

    == opérateur effectue un élément par deux tenseur de comparaison ayant la même forme, le tenseur de même forme et les rendements pour l'élément inégale contient 0, 1 pour les éléments équivalents contiennent.

    Le résultat est transmis à des rendements de torch.sum le nombre d'étiquettes correctement prédit. Enfin, nous avons divisé par le nombre total d'images pour obtenir une précision.

    Laissez-nous d'abord calculer la précision des données du modèle actuel. De toute évidence, nous nous attendons à ce sera très mauvais.

    Bien que la précision est une bonne façon que nous (les humains) modèle d'évaluation, mais il ne peut pas être utilisé fonction de perte en utilisant le modèle d'optimisation de descente de gradient pour les raisons suivantes:

  • Ce n'est pas une caractéristique distincte. == torch.max et sont non-fonctionnement continu et non différentiable, donc on ne peut pas utiliser la précision de calcul du poids et du gradient de l'écart
  • Il ne considère pas le modèle de probabilité réelle de prédire, et ne peut donc pas fournir suffisamment de rétroaction à des améliorations supplémentaires
  • Pour ces raisons, l'exactitude de l'évaluation est un bon indicateur de classement, mais pas une bonne fonction de perte. Le classement est couramment utilisé fonction de perte d'entropie croisée, qui a la formule suivante:

    Bien qu'il semble compliqué, mais en fait, il est très simple:

    • Pour chaque ligne de sortie, le prédit la probabilité de sélection de la bonne étiquette. Par exemple. Si la probabilité prédite de l'image est et que l'étiquette correcte est 1, nous sélectionnons les éléments appropriés 0,3 et ignorer le reste du
    • Puis, en prenant le nombre de la probabilité sélectionnée. Si la probabilité est élevée, qui est proche de 1, son nombre est très faible valeur négative, proche de zéro. Si la probabilité est faible (proche de 0), le nombre est très grande valeur de négatif. Nous allons également résultat multiplié par -1, le résultat est un grand facteur prédictif positif de perte défavorable du dernier pour obtenir l'entropie croisée moyenne de toutes les lignes de sortie pour obtenir une perte globale de données par lots

    Et la précision des différents entropie croisée est une fonction continue et dérivable, il fournit également une bonne rétroaction dans le modèle d'amélioration progressive (conduit d'étiquetage propres à une faible probabilité de perte est légèrement plus élevé). Cela en fait un bon choix pour la perte de la fonction.

    PyTorch fournir un tenseur efficace et facile à atteindre l'entropie croisée, dans le cadre de torch.nn.functionalpackage.

    De plus, il effectue également SOFTMAX en interne, afin que nous puissions exporter le modèle passé directement sans les convertir en probabilités.

    Etant donné que l'entropie croisée est la moyenne de la probabilité prédite de logarithme négatif correcte de l'étiquette, de sorte que l'explication des résultats sur le nombre d'échantillons de formation pour toutes les méthodes, par exemple un 2,23 e ^ -2,23, valeur moyenne d'environ 0,1, comme prévu étiquette correcte probabilité. Réduire les pertes et améliorer le modèle.

    optimisation

    Nous utiliserons optimiseur optim.SGD lors de la mise à jour la formation des poids et des biais, mais des taux plus élevés d'apprentissage, 1E-3.

    la taille des lots, le taux d'apprentissage et d'autres paramètres nécessaires pour sélectionner l'avance dans les modèles d'apprentissage de la machine de formation et de super appelés paramètres.

    Le choix des bons paramètres pour le modèle ultra-précis de la formation est essentielle dans un délai raisonnable, et est un domaine de recherche et d'expérimentation. Ne hésitez pas à essayer différents taux d'apprentissage et de voir comment il affecte le processus de formation.

    entraîneur

    Maintenant que nous avons défini le chargeur de données, le modèle, la perte de fonction et optimiseur, nous sommes prêts à former le modèle.

    processus de formation est presque la même régression linéaire. Cependant, nous augmenterons la fonction d'ajustement, nous avons défini plus haut, à utiliser à la fin de chaque jeu de validation d'époque pour évaluer le modèle de précision et de la perte.

    Nous définissons d'abord une fonction loss_batch:

    • Calcul de la perte d'un certain nombre de données
    • Si un optimiseur, vous pouvez choisir d'effectuer l'étape de mise à jour de descente de gradient
    • En variante, en utilisant la métrique est calculée cible prédite et réelle (par exemple, la précision)

    Optimizer est un paramètre optionnel pour assurer que nous pouvons réutiliser loss_batch pour calculer la perte sur l'ensemble de validation.

    Nous avons également le traitement par lots en raison de la longueur de la partie de retour, car il est très utile compositions / métrique qui la perte de l'ensemble des données.

    Ensuite, nous définissons une fonction d'évaluer, vérifier qu'il calcule l'ensemble global de perte.

    Si vous ne pouvez pas comprendre le rôle de cette fonction immédiatement, essayez d'exécuter chaque instruction dans une cellule séparée, puis voir les résultats.

    Nous devons également définir la précision de l'ensemble des opérations par lots afin de diriger la sortie, afin que nous puissions être utilisé comme une mesure d'ajustement.

    S'il vous plaît noter que nous ne devons SOFTMAX appliquée à la sortie, parce que l'ordre relatif des résultats, il ne change pas.

    En effet, e ^ x est une fonction croissante, qui est, si y1 >  y2, alors e ^ y1 >  e ^ y2, et la même chose est vraie de la valeur après le calcul de la moyenne pour obtenir un softmax.

    Voyons voir comment le modèle en utilisant les poids initiaux et jeu de polarisation à effectuer sur l'ensemble de validation.

    Précision initiale inférieure à 10%, ce qui est des attentes de la population du modèle d'initialisation aléatoire (car il a une chance d'obtenir un dixième de l'étiquette par une estimation aléatoire).

    S'il vous plaît noter également que nous utilisons .format méthodes et les chaînes de message pour imprimer seulement les quatre premiers chiffres après la virgule.

    Nous pouvons maintenant définir loss_batch facilement et d'évaluer la fonction d'ajustement.

    Nous sommes maintenant prêts à former le modèle. Formons cinq époque et d'observer les résultats.

    Eh bien! Plus au point eploch

    ligne d'affichage plus intuitif aux résultats de la figure.

    Il ressort clairement de l'image ci-dessus, même après une très longue période de formation, le modèle ne peut pas être plus de 90% seuil de précision.

    Une raison possible est que le taux d'apprentissage peut être trop élevé. Les paramètres du modèle peuvent être autour du paramètre optimal défini avec la plus faible perte de « rebond ».

    Vous pouvez essayer de réduire la vitesse d'apprentissage et de formation plusieurs époque, pour voir si ça aide.

    La raison la plus probable est que le modèle est pas assez fort. Si vous vous rappelez notre hypothèse de départ, nous supposons que la sortie (dans cette classe probabilité cas) sont entrés (intensité de pixel) de la fonction linéaire de la matrice de poids en effectuant la multiplication de la matrice et en ajoutant l'écart obtenu.

    Ceci est une hypothèse assez faible, il ne peut pas exister en réalité comme une relation linéaire entre le pixel et une image d'intensité numérique, il représente.

    Bien qu'il soit pour des ensembles de données simples comme MNIST (afin que nous puissions atteindre 85% de précision) fonctionnent très bien, mais nous avons besoin de modèles plus complexes pour saisir la relation non linéaire entre les pixels d'image et des étiquettes pour identifier les objets de tous les jours, animaux de tâches complexes.

    En utilisant une image test unique

    Bien que jusqu'à présent, nous avons suivi la précision globale du modèle, mais le modèle considérons quelques exemples d'images sur le résultat est une bonne idée.

    Utilisons le test prédéfini 10.000 images de quelques-uns de l'ensemble de données d'image pour tester nos modèles. Nous utilisons d'abord ToTensor transformer pour recréer l'ensemble de données de test.

    Échantillon seul ensemble de données d'image:

    Définissons une fonction d'aide predict_image, qui retourne un tenseur d'étiquette de prédiction d'image.

    img.unsqueeze juste ajouter le montant au début de 1x28x28 Zhang une autre dimension, ce qui en fait 1x1x28x28 modèle tenseur comme un lot contenant une seule image.

    En recueillant davantage de données de formation, augmenter / diminuer la complexité des paramètres du modèle et passer à déterminer la mauvaise performance de notre modèle peut nous aider à améliorer la position du modèle.

    Enfin, penchons-nous sur l'ensemble de test global de perte sur le modèle et la précision.

    Nous espérons que la précision sur l'ensemble de validation / pertes similaires. Sinon, nous devrons peut-être un meilleur ensemble de validation, qui a un ensemble similaire de données de test et de la distribution (généralement à partir des données du monde réel).

    modèle Sauvegarde et chargement

    Étant donné que nous avons beaucoup de temps pour former le modèle et obtenir une précision raisonnable, économisant ainsi des matrices de poids et de biais sur le disque est une bonne idée, pour que nous puissions modèle plus tard réutilisation à partir de zéro et éviter le recyclage. Voici comment enregistrer le modèle.

    Procédé de .state_dict renvoie un OrderedDict, dans lequel le modèle contient un mappage vers la droite sur les propriétés de tous les poids et la matrice de polarisation.

    Pour charger le poids du modèle, nous pouvons instancier une nouvelle classe d'objets MnistModel et utiliser .load_state_dict méthode.

    En tant que contrôle d'intégrité, comme, laissez-nous vérifier que ce modèle a le même qu'avant et la perte de précision sur l'ensemble de test.

    D'accord. Il est fait. Il est allé à engager notre part. Si vous avez oublié comment faire fonctionner:

    Les liens de référence:

  • https://medium.com/jovian-io/pytorch-basics-tensors-and-gradients-eb2f6e8a6eee
  • https://medium.com/jovian-io/linear-regression-with-pytorch-3dde91d60b50
  • https://medium.com/jovian-io/image-classification-using-logistic-regression-in-pytorch-ebb96cc9eb79
  • [2019 Ji-won nouveau compte à rebours au sommet de la technologie AI 16 jours]

    201927 Mars le nouveau-won Ji et le Département de pouvoir AI, AI tenue à Beijing Pacific festival --2019 nouveau hôtel a ouvert en Ji-won Summit AI Technology. Sommet des " noyau nuage intelligente du monde « Le thème, mise au point et de développer la puce AI nuage intelligent, remodeler l'avenir de la situation mondiale AI.

    En même temps, un certain nombre de nouveaux Zhi Yuan sera publié à l'autorité du site du sommet Livre blanc AI l'innovation mise au point de la chaîne industrielle active les commentaires influents chercheurs chinois AI, AI aider la Chine à atteindre au-delà de la compétition de classe mondiale dans.

    Acheter code à deux dimensions

    Billets de ligne active lien: 2019 nouveau Sommet AI Zhiyuan Technology - noyau nuage intelligente du monde _ la vie urbaine excitante, tous dans la ligne active! !

    Jingdezhen libération municipale | conditions météorologiques anormales, le bâton d'habitude!
    Précédent
    Bancaires à la retraite? Ping An Bank 1,5 yuans prix de fin d'année apparaissent
    Prochain
    65 balles perdues tir est dangereux pour « tir est mort », critiqué par Degea tragiquement, la position ou hors de la principale
    Ai RAJ GX est venu, Imperial GL peut continuer la domination elle?
    Sur le principe de 5G, cette image dire clairement toute
    BAT géants dans le vainqueur final dans le sac « licorne » valeur totale de plus de 290 milliards $
    En direct tous les mois qui attirent 150 millions de yuans de médias étrangers qui rira le dernier bagarre?
    Cadillac XT4: marché des SUV compacts de luxe ne changera pas à cause de cela?
    Nanjing Yangtze River Bridge est ce construite?
    pièce d'ancrage de télévision en circuit fermé est main populaire à nouveau diffusé la Coupe du Monde, des fans: veulent l'entendre expliquer la Coupe du Monde
    Alibaba beaucoup! Le Comité international olympique pour devenir les premiers sponsors les plus jeunes
    recrue AI se précipiter pour monter les constructeurs de trains express, Baidu briser le talent recrue de l'école « pénurie »
    Thrilling arrêt de sept minutes, le groupe deux mains, récrire presque Ta Leimi ensemble du script
    8 équipe de la Coupe du monde pour déterminer les tours de batte de dépenses, la défaite glorieuse Iran, l'Espagne et le Portugal unissent leurs forces palpitante qualification