Lernen Sie elliptische Bahnen mit Feedforward Neural Network mithilfe von Chainer. Der Test wird in einer offenen Schleife durchgeführt.
Ich werde dieses Problem lösen und erklären, wie man Chainer benutzt.
[Problem] Lernen Sie die elliptischen Bahnen von x = 0,8 cos (θ) und y = 0,8 sin (θ).
[Ansatz] x(θn)=(0.8cos(θn),0.8sin(θn)), (0<=θn<=2π) Entwerfen Sie eine FNN, die x (θn + 1) aus x (θn) vorhersagt. Verwenden Sie dann diese FNN, um anhand von Trainingsdaten zu lernen und die Ergebnisse anhand von Testdaten zu testen und zu bestätigen.
Geben Sie einen beliebigen Punkt auf der Ellipse an.
[Trainingsdaten] xtrain (θn) = (0,8 cos (θn), 0,8sin (θn)), θn = 2πn / 20 (0 <= n <= 20, n ist eine natürliche Zahl) Wird besorgt. Schreiben Sie wie folgt.
a=np.linspace(0,20,sample_no).reshape(sample_no,1)
xtrain=np.zeros(input_no*sample_no).reshape(sample_no,input_no).astype(np.float32)
xtrain[:,0]=[0.8*np.cos(2.0*np.pi*i/20) for i in a]
xtrain[:,1]=[0.8*np.sin(2.0*np.pi*i/20) for i in a]
[Testdaten] xtest (θn) = (0,8cos (θn), 0,8sin (θn)), θn = 2πn / 27 (0 <= n <= 27, n ist eine natürliche Zahl) Wird besorgt. Schreiben Sie in ähnlicher Weise wie folgt.
a=np.linspace(0,27,sample_no).reshape(sample_no,1)
xtest=np.zeros(input_no*sample_no).reshape(sample_no,input_no).astype(np.float32)
xtest[:,0]=[0.8*np.cos(2.0*np.pi*i/27) for i in a]
xtest[:,1]=[0.8*np.sin(2.0*np.pi*i/27) for i in a]
Stellen Sie wie folgt ein. Anzahl der Lehrerdaten: sample_no Anzahl des Lernens: Epoche Anzahl der Schichten: Eingabeebene: input_no = 2 (fest) Mittlere Ebene: hidden_no Ausgabeschicht: output_no = 2 (fest) Chargengröße: bs
Registrieren Sie einen Link namens Linear mit den Namen l1 und l2.
class FNN(Chain):
def __init__(self): #Bereiten Sie eine Verbindung vor
super(FNN,self).__init__(
l1=L.Linear(input_no,hidden_no),
l2=L.Linear(hidden_no,output_no),
Darüber hinaus sollte beachtet werden l1=L.Linear(input_no,hidden_no), l2=L.Linear(hidden_no,output_no), Ist self.add_link("l1",F.Linear(input_no,hidden_no)), self.add_link("l2",F.Linear(hidden_no,output_no)), Ist das gleiche wie schreiben.
Der registrierte Link wird als Funktion aufgerufen. Das Argument scheint im Prinzip eine variable Klasse zu sein.
#class FNN
def fwd(self,x):
h1=F.tanh(self.l1(x))
h2=F.tanh(self.l2(h1))
return h2
def get_predata(self,x):
return self.fwd(Variable(x.astype(np.float32).reshape(sample_no,input_no))).data
Wird von chainer.functions aufgerufen. Dieses Mal verwenden wir den durchschnittlichen quadratischen Fehler.
#class FNN
def __call__(self,x,y): #Verlustfunktion
return F.mean_squared_error(self.fwd(x),y)
Erstellen Sie einen Optimierer und legen Sie ihn mit dem FNN-Modell fest. Es gibt verschiedene Typen wie SGD, Adam und RMS Drop.
model=FNN()
optimizer=optimizers.SGD()
optimizer.setup(model)
Trainieren Sie den vorherigen Datensatz (Xtrain_n + 1) als die richtige Antwort für den aktuellen Datensatz (Xtrain_n). Gradienteninitialisierung, Backpropagation und Aktualisierung optimizer.zero_grads() loss.backward() optimizer.update() Wiederholen.
for i in range(epoch):
for j in range(sample_no): #Setzen Sie einen voraus
if (j+1<sample_no):
ytrain[j]=np.array(xtrain[j+1])
else:
ytrain[j]=np.array(xtrain[0])
model.zerograds()
loss=model(xtrain,ytrain)
loss.backward()
optimizer.update()
Da dies in einer offenen Schleife erfolgt, liest es jedes Mal die Testdaten und sagt den nächsten Punkt voraus. Die Testdaten werden von FeedForward berechnet und an Sie ausgegeben. Schreiben Sie also einfach wie folgt.
yout=model.get_predata(xtest)
Die Lehrerdaten (Zielellipse) sind blau und die Testergebnisse rot dargestellt.
100 Lernzeiten: immer noch nicht synchron
5000 Lektionen: Es kommt einer Ellipse näher
Anzahl der 5000000-maligen Lernvorgänge: Fast richtige Antwort
ellipse.py
#-*- coding:utf-8 -*-
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
from sklearn import datasets
import matplotlib.pyplot as plt
#Anzahl der Lehrerdaten
sample_no=100
#Anzahl des Lernens
epoch=500000
#Anzahl der Schichten
input_no=2
hidden_no=2
output_no=2
#Erstellung von Lehrerdaten
a=np.linspace(0,20,sample_no).reshape(sample_no,1)
xtrain=np.zeros(input_no*sample_no).reshape(sample_no,input_no).astype(np.float32)
xtrain[:,0]=[0.8*np.cos(2.0*np.pi*i/20) for i in a]
xtrain[:,1]=[0.8*np.sin(2.0*np.pi*i/20) for i in a]
#Ein Modell bauen
class FNN(Chain):
def __init__(self): #Bereiten Sie eine Verbindung vor
super(FNN,self).__init__(
l1=L.Linear(input_no,hidden_no),
l2=L.Linear(hidden_no,output_no),
)
def __call__(self,x,y): #Verlustfunktion
return F.mean_squared_error(self.fwd(x),y)
def fwd(self,x):
h1=F.tanh(self.l1(x))
h2=F.tanh(self.l2(h1))
return h2
def get_predata(self,x):
return self.fwd(Variable(x.astype(np.float32).reshape(sample_no,input_no))).data
#Optimierungsmethode
model=FNN()
optimizer=optimizers.SGD()
optimizer.setup(model)
#Speichert den richtigen Antwortwert für das Training
ytrain=np.zeros(input_no*sample_no).reshape(sample_no,input_no).astype(np.float32)
#Chargengröße
bs=25
#Ausbildung
for i in range(epoch):
for j in range(sample_no): #Setzen Sie einen voraus
if (j+1<sample_no):
ytrain[j]=np.array(xtrain[j+1])
else:
ytrain[j]=np.array(xtrain[0])
model.zerograds()
loss=model(xtrain,ytrain)
loss.backward()
optimizer.update()
#Prüfung(openloop)
a=np.linspace(0,27,sample_no).reshape(sample_no,1)
xtest=np.zeros(input_no*sample_no).reshape(sample_no,input_no).astype(np.float32)
xtest[:,0]=[0.8*np.cos(2.0*np.pi*i/27) for i in a]
xtest[:,1]=[0.8*np.sin(2.0*np.pi*i/27) for i in a]
yout=model.get_predata(xtest)
print yout
#Zeichnung
plt.plot(yout[:,0],yout[:,1],"r",label="training data") #Zeichnen Sie Lernergebnisse in rot
plt.plot(xtrain[:,0],xtrain[:,1],"b",label="teaching data") #Zeichnen Sie Lehrerdaten in blau
plt.show()
Recommended Posts