[PYTHON] Einführung in Deep Learning (2) - Versuchen Sie Ihre eigene nichtlineare Regression mit Chainer-

Einführung

Im vorherigen Abschnitt "Einführung in Deep Learning (1) - Verstehen und Verwenden von Chainer-" haben wir die Verwendung von Chainer zusammengefasst. .. Wenn Sie der Referenz folgen, erfahren Sie, wie Sie sie verwenden. Wenn ich maschinelles Lernen studiere, gehe ich von einem einfachen Regressionsproblem aus und entscheide selbst, dass ich es verstehen und verwenden kann, wenn ich ein Vorhersagemodell dafür erstellen kann.

Daher werden wir dieses Mal speziell Daten für eine nichtlineare Sinusfunktion generieren und eine nichtlineare Regression unter Verwendung eines mit Chainer konstruierten Modells durchführen. Wenn Sie alle Schritte bis zu diesem Punkt abgeschlossen haben, können Sie möglicherweise auch dann verstehen, wenn Sie mit der erweiterten Version fortfahren, z. B. Bildunterscheidung.

Entwicklungsumgebung

・ Betriebssystem: Mac OS X EL Capitan (10.11.5) · Python 2.7.12: Anaconda 4.1.1 (x86_64) ・ Chainer 1.12.0

Dieses Ziel

Erstellen Sie, wie in der folgenden Abbildung gezeigt, ein nichtlineares Regressionsmodell, mit dem die Sündenfunktion perfekt erfasst werden kann.

ゴール.png

Erstellen Sie ein nichtlineares Regressionsmodell

Übersicht über das Programm

MyChain.py


# -*- coding: utf-8 -*-
from chainer import Chain
import chainer.links as L
import chainer.functions as F

class MyChain(Chain):

    def __init__(self):
        super(MyChain, self).__init__(
            l1 = L.Linear(1, 100),
            l2 = L.Linear(100, 30),
            l3 = L.Linear(30, 1)
        )

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

example.py


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

#Numerische Berechnung bezogen
import math
import random
import numpy as np
import matplotlib.pyplot as plt
# chainer
from chainer import Chain, Variable
import chainer.functions as F
import chainer.links as L
from chainer import optimizers
from MyChain import MyChain

#Zufälliger Startwert behoben
random.seed(1)

#Generierung von Beispieldaten
#Die Sünde funktioniert als wahre Funktion
x, y = [], []
for i in np.linspace(-3,3,100):
    x.append([i])
    y.append([math.sin(i)])  #Wahre Funktion
#Wieder als Kettenvariable deklarieren
x = Variable(np.array(x, dtype=np.float32))
y = Variable(np.array(y, dtype=np.float32))

#NN-Modell deklarieren
model = MyChain()

#Berechnung der Verlustfunktion
#Selbstquadratischer Fehler in der Verlustfunktion(MSE)verwenden
def forward(x, y, model):
    t = model.predict(x)
    loss = F.mean_squared_error(t, y)
    return loss

#Kettenoptimierer
#Adam wird für den Optimierungsalgorithmus verwendet
optimizer = optimizers.Adam()
#Übergeben Sie die Modellparameter an den Optimierer
optimizer.setup(model)

#Wiederholen Sie das Lernen der Parameter
for i in range(0,1000):
    loss = forward(x, y, model)
    print(loss.data)  #Aktuelle MSE anzeigen
    optimizer.update(forward, x, y, model)

#Handlung
t = model.predict(x)
plt.plot(x.data, y.data)
plt.scatter(x.data, t.data)
plt.grid(which='major',color='gray',linestyle='-')
plt.ylim(-1.5, 1.5)
plt.xlim(-4, 4)
plt.show()

Generierung von Beispieldaten

Generieren Sie Lehrerdaten, um dieses nichtlineare Regressionsmodell zu erstellen. Dieses Mal verwenden wir die sin-Funktion mit 1 Eingang und 1 Ausgang.

#Generierung von Beispieldaten
#Die Sünde funktioniert als wahre Funktion
x, y = [], []
for i in np.linspace(-3,3,100):
    x.append([i])
    y.append([math.sin(i)])  #Wahre Funktion
#Wieder als Kettenvariable deklarieren
x = Variable(np.array(x, dtype=np.float32))
y = Variable(np.array(y, dtype=np.float32))

Modelldefinition

Erstellen Sie mit Chainer ein Modell für Deep Learning. Dieses Mal haben wir eine vierschichtige Struktur, die aus einer Eingabeebene, einer verborgenen Schicht 1, einer verborgenen Schicht 2 und einer Ausgangsschicht besteht. Ich habe die Anzahl der Knoten entsprechend festgelegt (ich habe auch vorherige hier geschrieben, aber es ist eine Erfahrung und Intuition). Wenn Sie interessiert sind, können Sie den Wert hier bearbeiten. Der Grund, warum es zwei versteckte Ebenen gibt, ist, dass die Eigenschaften bei der Rückkehr zu einer Ebene nicht gut erfasst wurden, sodass ich sie noch weiter vergrößert habe.

MyChain.py


# -*- coding: utf-8 -*-
from chainer import Chain
import chainer.links as L
import chainer.functions as F

class MyChain(Chain):

    def __init__(self):
        super(MyChain, self).__init__(
            l1 = L.Linear(1, 100),
            l2 = L.Linear(100, 30),
            l3 = L.Linear(30, 1)
        )

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

Der Punkt ist, dass Sie relu für die Aktivierungsfunktion verwenden. Vor nicht allzu langer Zeit war es Standard, die Sigmoid-Funktion für diese Aktivierungsfunktion zu verwenden, aber in letzter Zeit, wenn Trainingsparameter durch die Fehlerrückausbreitungsmethode trainiert werden, tritt das Problem auf, dass die Lernrate abnimmt, wenn sie nach hinten geht. Es scheint, dass Relu oft verwendet wird, um zu vermeiden. Ich kenne diesen Bereich nur durch Fühlen, deshalb muss ich etwas mehr lernen. Es gibt verschiedene andere Kommentarartikel zur Aktivierungsfunktion. Schauen Sie sich diese also bitte an. Referenz: [Maschinelles Lernen] Ich werde es erklären, während ich das Deep Learning Framework Chainer ausprobiere.

Bestätigen Sie in einer verlernten Situation

Ich habe versucht zu sehen, was in einer Situation passiert ist, in der ich überhaupt nicht gelernt habe. Ich denke, dass Sie das Gesamtgefühl erfassen können, indem Sie nicht nur das Endergebnis, sondern auch den Fortschritt betrachten.

##NN-Modell deklarieren
model = MyChain()

#Handlung
t = model.predict(x)
plt.plot(x.data, y.data)
plt.scatter(x.data, t.data)
plt.grid(which='major',color='gray',linestyle='-')
plt.ylim(-1.5, 1.5)
plt.xlim(-4, 4)
plt.show()
スクリーンショット 2016-08-08 15.49.58.png

In der verlernten Situation können Sie sehen, dass die Eigenschaften der wahren Funktion überhaupt nicht erfasst werden.

Zugparameter

Um die Parameter zu trainieren, definieren Sie zuerst die Verlustfunktion. Dieses Mal verwenden wir den Mean Squared Error (MSE) als Verlustfunktion.

{\rm MSE} = \dfrac{1}{N} \sum_{n=1}^{N} \left( \hat{y}_{n} - y_{n} \right)^{2}
#Berechnung der Verlustfunktion
#Selbstquadratischer Fehler in der Verlustfunktion(MSE)verwenden
def forward(x, y, model):
    t = model.predict(x)
    loss = F.mean_squared_error(t, y)
    return loss

Durch die Definition dieser Verlustfunktion kann Chainer automatisch den Gradienten des Optimierers berechnen.

#Kettenoptimierer
#Adam wird für den Optimierungsalgorithmus verwendet
optimizer = optimizers.Adam()
#Übergeben Sie die Modellparameter an den Optimierer
optimizer.setup(model)
#Verlaufsaktualisierung
optimizer.update(forward, x, y, model)

Dies ist das Ende des Grundflusses.

Wiederholen Sie das Lernen

Durch mehrmaliges Wiederholen von `optimizer.update ()` konvergiert es zu einem guten Parameter. Dieses Mal werden die Lehrerdaten viele Male mit derselben Sache trainiert, aber ursprünglich werden einige als Batchdaten aus der Stichprobenpopulation entnommen, sie werden als Lehrerdaten trainiert und eine weitere Stichprobe wird im nächsten Zyklus gestapelt Der Ablauf besteht darin, ihn als Daten zu verwenden.

#Wiederholen Sie das Lernen der Parameter
for i in range(0,1000):
    loss = forward(x, y, model)
    print(loss.data)  #Aktuelle MSE anzeigen
    optimizer.update(forward, x, y, model)

スクリーンショット 2016-08-08 16.16.36.png

Sie können sehen, dass der Selbstquadratfehler kleiner wird, wenn das Lernen wiederholt wird. Nach Abschluss des Trainings konnte ich die Funktion sehr reibungslos approximieren.

ゴール.png

Referenz

    1. Offizielle Chainer-Referenz Es wurden verschiedene Dinge auf Japanisch geschrieben, aber ich bin oft auf Teile gestoßen, die aufgrund von Versionsänderungen usw. nicht behandelt werden konnten, so dass dies die stabilste auf Englisch war.
  1. Einführung in Deep Learning (1) - Chainer verstehen und verwenden-

Bonus

Wir warten darauf, dass Sie uns folgen! Qiita: Karat Yoshizaki twitter:@carat_yoshizaki Hatena-Blog: Carat COO-Blog Homepage: Karat

Heimlehrerservice "Kikagaku", bei dem Sie maschinelles Lernen einzeln lernen können Bitte zögern Sie nicht, uns zu kontaktieren, wenn Sie an "Kikagaku" interessiert sind, wo Sie sofort "Mathematik → Programmierung → Webanwendung" lernen können.

Recommended Posts

Einführung in Deep Learning (2) - Versuchen Sie Ihre eigene nichtlineare Regression mit Chainer-
[Einführung in Style GAN] Einzigartiges Lernen von Animation mit Ihrer eigenen Maschine ♬
Versuchen Sie, Ihr eigenes AWS-SDK mit bash zu erstellen
Versuchen Sie es mit TensorFlow
Versuchen Sie Deep Learning mit FPGA
Tiefe Stärkung des Lernens 1 Einführung in die Stärkung des Lernens
Einführung in Deep Learning ~ Backpropagation ~
Versuchen Sie, ein Deep Learning / Neuronales Netzwerk mit Scratch aufzubauen
[Evangelion] Versuchen Sie, mit Deep Learning automatisch Asuka-ähnliche Linien zu erzeugen
Probieren Sie Deep Learning mit FPGA-Select-Gurken aus
Einführung in das tiefe Lernen ~ Funktionsnäherung ~
Versuchen Sie es mit TensorFlow Part 2
Einführung in Deep Learning ~ Codierungsvorbereitung ~
Versuchen Sie Common Representation Learning mit Chainer
Einführung in Deep Learning ~ Dropout Edition ~
Einführung in Deep Learning ~ Forward Propagation ~
Einführung in Deep Learning ~ CNN Experiment ~
[Stärkung des Lernens] DQN mit Ihrer eigenen Bibliothek
Klassifizieren Sie Anime-Gesichter mit tiefem Lernen mit Chainer
Einführung in Deep Learning ~ Falten und Pooling ~
Probieren Sie die Bitcoin-Preisprognose mit Deep Learning aus
Machen Sie Ihren eigenen PC für tiefes Lernen
Versuchen Sie mit Kipoi tiefes Erlernen der Genomik
So importieren Sie Ihr eigenes Modul mit jupyter
[Einführung in das maschinelle Lernen] Bis Sie den Beispielcode mit Chainer ausführen
Fügen Sie Ihre eigenen Bilddaten in Deep Learning ein und spielen Sie damit
[Python] Einfache Einführung in das maschinelle Lernen mit Python (SVM)
[Einführung in StyleGAN2] Unabhängiges Lernen mit 10 Anime-Gesichtern ♬
Erweitern und erweitern Sie Ihren eigenen Deep Learning-Datensatz
Einführung in Deep Learning ~ Lokalisierungs- und Verlustfunktion ~
Schritte zum Installieren Ihrer eigenen Bibliothek mit pip
Einführung in Deep Learning (1) --Chainer wird Anfängern leicht verständlich erklärt.
Python-Lernnotiz für maschinelles Lernen von Chainer Kapitel 11 und 12 Einführung in Pandas Matplotlib
Memo zum Erstellen einer eigenen Box mit Peppers Python
Versuchen Sie, Ihr eigenes Intro-Quiz mit Python zu verbessern
Versuchen Sie, den Wechselkurs (FX) mit nicht tiefem maschinellem Lernen vorherzusagen
Versuchen Sie, die LED in Ihren eigenen PC einzubauen (leicht)
Einführung in Private Chainer
Versuchen Sie eine Regression mit TensorFlow
Einführung in das maschinelle Lernen
Versuchen wir nun die Gesichtserkennung mit Chainer (Lernphase)
Einführung in Deep Learning zum ersten Mal (Chainer) Erkennung japanischer Zeichen Kapitel 1 [Umgebungskonstruktion]
Ich habe versucht, Othello AI zu machen, dass ich 7,2 Millionen Hände durch tiefes Lernen mit Chainer gelernt habe
Versuchen Sie, eine Blackjack-Strategie zu entwickeln, indem Sie das Lernen stärken (③ Stärkung des Lernens in Ihrer eigenen OpenAI Gym-Umgebung).
Versuchen Sie, die Leistung des Modells für maschinelles Lernen / Regression zu bewerten
Einführung in das maschinelle Lernen mit scikit-learn-Von der Datenerfassung bis zur Parameteroptimierung
Versuchen Sie, Ihre eigenen Objekte mit Prioritätswarteschlangen in Python zu sortieren
Erkennen Sie Ihren Chef mit Deep Learning und verbergen Sie den Bildschirm
Ich habe versucht, ListNet of Rank Learning mit Chainer zu implementieren
Maschinelles Lernen mit Nogisaka 46 und Keyakizaka 46 Teil 1 Einführung
Ich habe das Toho-Projekt mit Deep Learning aufgenommen ... ich wollte.
[Einführung in die Stärkung des Lernens] Stärkung des Lernens, um sich vorerst zu bewegen
Versuchen Sie Q-Lernen in einem Kampf im Drakue-Stil [Einführung in die Stärkung des Lernens]
Reinforcement Learning 23 Erstellen und verwenden Sie Ihr eigenes Modul mit Colaboratory
Ich habe versucht, in einem tief erlernten Sprachmodell zu schreiben
Versuchen Sie, eine lineare Regression mit Pytorch mit Google Colaboratory zu implementieren
Versuchen Sie, den Boden durch Rekursion herauszufordern
[Lernmemorandum] Einführung in vim
Eine Einführung in das maschinelle Lernen