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.
・ Betriebssystem: Mac OS X EL Capitan (10.11.5) · Python 2.7.12: Anaconda 4.1.1 (x86_64) ・ Chainer 1.12.0
Erstellen Sie, wie in der folgenden Abbildung gezeigt, ein nichtlineares Regressionsmodell, mit dem die Sündenfunktion perfekt erfasst werden kann.
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()
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))
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.
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()
In der verlernten Situation können Sie sehen, dass die Eigenschaften der wahren Funktion überhaupt nicht erfasst werden.
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.
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)
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.
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