[PYTHON] J'ai essayé d'entraîner la fonction péché avec chainer

introduction

Un débutant en apprentissage profond a essayé d'apprendre la fonction de péché avec un chainer. En tant que niveau débutant, je me suis senti un peu compris après avoir lu l'apprentissage profond, mais lorsque j'ai décidé d'écrire cet article, je me suis senti désespéré face à mon faible niveau de compréhension. L'apprentissage de la fonction sin a été fait par yuukiclass et bien d'autres, mais ce n'est pas mal.

environnement

contenu de l'étude

Apprendre le sin (thêta) à partir d'angles (thêta) de 0 à 2π

[training data]

la mise en oeuvre

Mini apprentissage par lots

C'est la partie implémentation de l'apprentissage par mini-lots. Ce code est familier des exemples MNIST (certains changements tels que la plage). Cet apprentissage par mini-lots semble être populaire.

Extrait de l'apprentissage mini-batch


perm = np.random.permutation(N)
sum_loss = 0
for i in range(0, N, batchsize):
    x_batch = x_train[perm[i:i + batchsize]]
    y_batch = y_train[perm[i:i + batchsize]]

    model.zerograds()
    loss = model(x_batch,y_batch)
    sum_loss += loss.data * batchsize
    loss.backward()
    optimizer.update()

Données de formation et test

Le nombre de données est modifié de sorte que l'angle utilisé pendant le test soit différent de celui pendant l'entraînement. L'angle est modifié en divisant 0 à 2π en 1000 pendant l'apprentissage et en divisant 0 à 2π en 900 pendant le test.

Données d'entraînement&Extrait de la confirmation des résultats


#Données d'entraînement
N = 1000
x_train, y_train = get_dataset(N)

#données de test
N_test = 900
x_test, y_test = get_dataset(N_test)

'''
réduction
'''
    # test
    loss = model(x_test,y_test)
    test_losses.append(loss.data)

Paramètres d'apprentissage

Tous les paramètres sont appropriés.

Code entier

L'ensemble


# -*- coding: utf-8 -*-

#Importer depuis une extrémité pour le moment
import numpy as np
import chainer
from chainer import cuda, Function, gradient_check, Variable, optimizers, serializers, utils
from chainer import Link, Chain, ChainList
import chainer.functions as F
import chainer.links as L
import time
from matplotlib import pyplot as plt

#Les données
def get_dataset(N):
    x = np.linspace(0, 2 * np.pi, N)
    y = np.sin(x)
    return x, y

#réseau neuronal
class MyChain(Chain):
    def __init__(self, n_units=10):
        super(MyChain, self).__init__(
             l1=L.Linear(1, n_units),
             l2=L.Linear(n_units, n_units),
             l3=L.Linear(n_units, 1))

    def __call__(self, x_data, y_data):
        x = Variable(x_data.astype(np.float32).reshape(len(x_data),1)) #Convertir en objet variable
        y = Variable(y_data.astype(np.float32).reshape(len(y_data),1)) #Convertir en objet variable
        return F.mean_squared_error(self.predict(x), y)

    def  predict(self, x):
        h1 = F.relu(self.l1(x))
        h2 = F.relu(self.l2(h1))
        h3 = self.l3(h2)
        return h3

    def get_predata(self, x):
        return self.predict(Variable(x.astype(np.float32).reshape(len(x),1))).data

# main
if __name__ == "__main__":

    #Données d'entraînement
    N = 1000
    x_train, y_train = get_dataset(N)

    #données de test
    N_test = 900
    x_test, y_test = get_dataset(N_test)

    #Paramètres d'apprentissage
    batchsize = 10
    n_epoch = 500
    n_units = 100

    #La modélisation
    model = MyChain(n_units)
    optimizer = optimizers.Adam()
    optimizer.setup(model)

    #Boucle d'apprentissage
    train_losses =[]
    test_losses =[]
    print "start..."
    start_time = time.time()
    for epoch in range(1, n_epoch + 1):

        # training
        perm = np.random.permutation(N)
        sum_loss = 0
        for i in range(0, N, batchsize):
            x_batch = x_train[perm[i:i + batchsize]]
            y_batch = y_train[perm[i:i + batchsize]]

            model.zerograds()
            loss = model(x_batch,y_batch)
            sum_loss += loss.data * batchsize
            loss.backward()
            optimizer.update()

        average_loss = sum_loss / N
        train_losses.append(average_loss)

        # test
        loss = model(x_test,y_test)
        test_losses.append(loss.data)

        #Processus d'apprentissage des extrants
        if epoch % 10 == 0:
            print "epoch: {}/{} train loss: {} test loss: {}".format(epoch, n_epoch, average_loss, loss.data)

        #Créer un graphique des résultats d'apprentissage
        if epoch in [10, 500]:
            theta = np.linspace(0, 2 * np.pi, N_test)
            sin = np.sin(theta)
            test = model.get_predata(theta)
            plt.plot(theta, sin, label = "sin")
            plt.plot(theta, test, label = "test")
            plt.legend()
            plt.grid(True)
            plt.xlim(0, 2 * np.pi)
            plt.ylim(-1.2, 1.2)
            plt.title("sin")
            plt.xlabel("theta")
            plt.ylabel("amp")
            plt.savefig("fig/fig_sin_epoch{}.png ".format(epoch)) #En supposant que le dossier fig existe
            plt.clf()

    print "end"

    interval = int(time.time() - start_time)
    print "Temps d'exécution: {}sec".format(interval)


    #Graphique d'erreur
    plt.plot(train_losses, label = "train_loss")
    plt.plot(test_losses, label = "test_loss")
    plt.yscale('log')
    plt.legend()
    plt.grid(True)
    plt.title("loss")
    plt.xlabel("epoch")
    plt.ylabel("loss")
    plt.savefig("fig/fig_loss.png ") #En supposant que le dossier fig existe
    plt.clf()

Résultat d'exécution

Erreur

L'erreur a tendance à diminuer à mesure que l'époque (nombre d'apprentissage) augmente. Il n'y avait pas de différence significative entre les erreurs d'apprentissage et de test. Je pense que l'erreur lors des tests est légèrement meilleure que celle lors de l'apprentissage car la méthode de calcul de l'erreur est différente.

fig_loss.png

Résultat d'apprentissage

Lorsque l'époque est de 10, il est difficile de dire que c'est une fonction péché, mais lorsque l'apprentissage progresse vers 500, elle est assez proche de la fonction péché.

epoch: 10 fig_sin_epoch10.png

epoch: 500 fig_sin_epoch500.png

Résumé

Pour le moment, j'ai pu entraîner la fonction péché avec chainer.

Cependant, pour une raison quelconque, plus l'angle est grand, plus l'erreur est grande. Je pensais que si l'ordre des angles à apprendre était aléatoire, la variation de l'erreur pour chaque angle pourrait être supprimée, mais elle semble être différente. Ce n'est pas bien compris.

référence

J'ai essayé d'approcher la fonction sin en utilisant chainer (re-challenge)

Chainer et apprentissage en profondeur appris par approximation de fonction

Réseau neuronal de type à propagation directe régressive avec chaînage

Recommended Posts

J'ai essayé d'entraîner la fonction péché avec chainer
J'ai essayé d'approcher la fonction sin en utilisant le chainer
J'ai essayé d'apprendre l'angle du péché et du cos avec le chainer
J'ai essayé d'approcher la fonction sin en utilisant chainer (re-challenge)
J'ai essayé d'apprendre le fonctionnement logique avec TF Learn
J'ai essayé de sauvegarder les données avec discorde
J'ai essayé d'apprendre PredNet
765 J'ai essayé d'identifier les trois familles professionnelles par CNN (avec Chainer 2.0.0)
J'ai essayé d'implémenter et d'apprendre DCGAN avec PyTorch
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé de résoudre le problème avec Python Vol.1
J'ai essayé de déplacer le ballon
J'ai essayé d'estimer la section.
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai essayé d'analyser les émotions de tout le roman "Weather Child" ☔️
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai essayé de notifier les informations de retard de train avec LINE Notify
J'ai essayé d'implémenter ListNet d'apprentissage de rang avec Chainer
J'ai essayé d'implémenter la fonction d'envoi de courrier en Python
J'ai essayé de combattre le minimum local de la fonction Goldstein-Price
J'ai essayé de décrire le trafic en temps réel avec WebSocket
J'ai essayé de résoudre l'édition du débutant du livre des fourmis avec python
J'ai essayé d'implémenter Autoencoder avec TensorFlow
Apprenez à coloriser les images monochromes avec Chainer
J'ai essayé de résumer la commande umask
J'ai essayé d'obtenir l'index de la liste en utilisant la fonction énumérer
J'ai essayé d'automatiser l'arrosage du pot avec Raspberry Pi
J'ai essayé de visualiser AutoEncoder avec TensorFlow
J'ai essayé de reconnaître le mot de réveil
J'ai essayé de commencer avec Hy
J'ai essayé de traiter l'image en "style croquis" avec OpenCV
J'ai essayé de résumer la modélisation graphique.
J'ai essayé de démarrer avec Bitcoin Systre le week-end
J'ai essayé d'estimer le rapport de circonférence π de manière probabiliste
J'ai essayé de toucher l'API COTOHA
J'ai essayé d'implémenter CVAE avec PyTorch
J'ai fait apprendre à RNN la vague de péché et j'ai essayé de prédire
J'ai essayé de traiter l'image dans un "style de dessin au crayon" avec OpenCV
J'ai essayé d'agrandir la taille du volume logique avec LVM
J'ai essayé de jouer avec l'image avec Pillow
J'ai aussi essayé d'imiter la fonction monade et la monade d'état avec le générateur en Python
J'ai essayé de résoudre TSP avec QAOA
J'ai essayé d'exécuter la partie DNN d'OpenPose avec le processeur Chainer
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
J'ai essayé de créer une fonction de similitude d'image avec Python + OpenCV
[Python] J'ai essayé de visualiser la nuit du chemin de fer de la galaxie avec WordCloud!
J'ai essayé d'exprimer de la tristesse et de la joie face au problème du mariage stable.
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
J'ai essayé d'extraire automatiquement les mouvements des joueurs Wiire avec un logiciel
J'ai essayé de créer le téléchargement CSV, le traitement des données, la fonction de téléchargement avec Django
J'ai essayé avec les 100 meilleurs packages PyPI> J'ai essayé de représenter graphiquement les packages installés sur Python
J'ai essayé d'analyser la négativité de Nono Morikubo. [Comparer avec Posipa]
J'ai essayé de rationaliser le rôle standard des nouveaux employés avec Python
J'ai essayé de visualiser le texte du roman "Weather Child" avec Word Cloud
J'ai essayé de visualiser le modèle avec la bibliothèque d'apprentissage automatique low-code "PyCaret"
J'ai essayé d'obtenir les informations sur le film de l'API TMDb avec Python
J'ai essayé de prédire le comportement du nouveau virus corona avec le modèle SEIR.