[PYTHON] Remarques sur l'optimisation à l'aide de Pytorch

Comme tensorflow2, basé sur des fonctions, est difficile à utiliser, nous migrons vers Pytorch. Cet article s'adresse aux nostalgiques qui souhaitent créer des fonctions de perte et des méthodes d'optimisation par eux-mêmes, pas aux enfants modernes qui utilisent les packages tels quels. Les fossiles qui disent que "le gradient est calculé à la main" ne sont pas la cible.

Génération de données

Correctement généré

import numpy as np
import matplotlib.pyplot as plt
import torch
from torch.autograd import Variable
import torch.optim as optim

N = 100
a_data =  - 1
b_data = 1
sigma_data = 0.1
x_data = 2 * np.random.rand(N)
y_data = a_data * x_data + b_data + sigma_data * np.random.randn(N)

sample.png

Lors de l'utilisation d'un package optimisé

Pour les personnes tordues qui veulent créer leur propre fonction Loss.

#Définition variable
a = Variable(torch.randn(1), requires_grad=True)
b = Variable(torch.randn(1), requires_grad=True)

#Conversion de données
x_train = torch.tensor(x_data)
y_train = torch.tensor(y_data)

#Optimisation des paramètres de fonction
optimizer = optim.Adam([a, b])

#Nombre de répétitions
epoch = 4000

loss_epoch = np.zeros(epoch)

for i in range(epoch):
    #Initialisation du dégradé utilisée dans l'optimiseur
    optimizer.zero_grad()
    #Modèle linéaire
    y_hat = a * x_train + b
    #Calcul de la fonction de perte
    loss = (y_train - y_hat).norm()
    loss_epoch[i] = loss.item()
    #Réglage du dégradé
    loss.backward()
    #Effectuer l'optimisation
    optimizer.step()

Adam_loss.png Adam.png

Lors de l'utilisation uniquement du dégradé

Pour ceux qui ne veulent pas utiliser Optimizer et qui ont plus de rebondissements. Optimisé à l'aide de la méthode du gradient.

#Préparation des paramètres
a = torch.randn(1,requires_grad=True)
b = torch.randn(1,requires_grad=True)

#Conversion de données
x_train = torch.tensor(x_data)
y_train = torch.tensor(y_data)

#Taux d'apprentissage
eta = 0.001

#Nombre de répétitions
epoch = 4000
loss_epoch = np.zeros(epoch)
for i in range(epoch):
    #Commencer l'enregistrement du dégradé
    a.requires_grad_(True)
    b.requires_grad_(True)
    #Prédiction et calcul de la fonction de perte
    y_hat = a * x_train + b
    loss = (y_train - y_hat).norm()
    loss_epoch[i] = loss.item()
    #Réglage du dégradé
    loss.backward()
    #Arrêter d'enregistrer le dégradé
    a.requires_grad_(False)
    b.requires_grad_(False)

    #Mettre à jour avec dégradé
    a = a - eta * a.grad
    b = b - eta * b.grad

original_loss.png original.png

Résumé

Il semble facile à utiliser une fois que vous vous êtes habitué à l'enregistrement de la pente et à l'arrêt des parties.

Détails du code

https://github.com/yuji0001/2020Introduction_of_Pytorch

Reference Tutoriels Pytorch (ici).

Author Yuji Okamoto [email protected]

Recommended Posts

Remarques sur l'optimisation à l'aide de Pytorch
Remarques sur l'utilisation d'Alembic
[Django] Remarques sur l'utilisation de django-debug-toolbar
Remarques sur l'utilisation de MeCab depuis Python
Remarques sur l'utilisation de la post-réception et de la post-fusion
Remarques sur l'installation de Python à l'aide de PyEnv
Notes sur l'utilisation de rstrip avec python.
Remarques sur l'utilisation de matplotlib sur le serveur
(Débutant) Remarques sur l'utilisation de pyenv sur Mac
Remarques sur l'utilisation d'OpenCV avec Windows10 Python 3.8.3.
Notes sur Flask
Remarques sur la mise en œuvre des tests APN à l'aide de Pytest
Notes sur Pytorch
Remarques sur l'utilisation de dict avec python [Competition Pro]
Remarques sur l'utilisation de TensorFlow sur Bash sur Ubuntu sous Windows
[Python] Remarques sur l'accélération des algorithmes génétiques à l'aide du multitraitement
Remarques sur les réseaux de neurones
Notes de céleri sur Django
Remarques sur l'installation de PycURL
Notes sur l'utilisation de sous-processus Python
Remarques sur les fonctions de la famille SciPy.linalg
Notes minimales lors de l'utilisation de Python sur Mac (édition Homebrew)
Remarques sur tf.function et traçage
Remarques sur l'installation de dlib sur Mac
Notes sur le module sqlite3 de python
Essayez l'optimisation des fonctions à l'aide d'Hyperopt
Remarques sur les * args et ** kargs
Remarques sur la définition des slots PySide (2)
Essayez d'utiliser OpenCV sur Windows
Notes sur pyenv et Atom
Précautions lors de la définition des emplacements pour PySide
[Python] Notes sur l'analyse des données
Remarques sur l'installation de Python sur votre Mac
Comment connaître le nombre de GPU de python ~ Remarques sur l'utilisation du multitraitement avec pytorch ~
Traiter sur GPU en utilisant chainer.cuda.elementwise
Remarques sur l'installation de pipenv sur votre Mac
Diffusion sur LINE en utilisant python
Remarques sur l'installation d'Anaconda 3 sur Windows
Remarques sur imshow () d'OpenCV
Remarques sur l'installation de Python sur CentOS
Résolvez des problèmes d'optimisation multivariée à l'aide de sagemath
Notes sur Python et les types de dictionnaire
Remarques sur la gestion des packages avec conda
Essayez d'utiliser Pillow sur iPython (partie 1)
pyTorch optim SGD explication approfondie
Remarques sur l'utilisation de pywinauto
Installez Pytorch sur Blender 2.90 python sous Windows
Remarques sur l'utilisation des featuretools
Essayez d'utiliser ArUco avec Raspberry Pi
Trouvez les attentes du golf grâce à l'optimisation dynamique
Étude sur Tokyo Rent en utilisant Python (3-2)
Essayez d'utiliser Pillow sur iPython (partie 3)
Utilisation d'une console série sur Ubuntu 20.04
Remarques sur l'accès à dashDB à partir de python