[PYTHON] Lernen Sie mit Chainer elliptische Bahnen

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.

Probleme und Ansätze

[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.

Datenerstellung und Variableneinstellung

Trainingsdaten und Testdaten

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]

Variable

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

Struktur des Lernmodells durch Chainer

Verbindung vorbereiten (Link)

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.

Vorwärtsberechnung

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

Verlustfunktion

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)

Optimierung

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)

Ausbildung

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()

Prüfung

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)

Testergebnisse

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

Vollständiger Code

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

Lernen Sie mit Chainer elliptische Bahnen
Lernen Sie mit Chainer, monochrome Bilder einzufärben
Seq2Seq (1) mit Chainer
Lerne Python mit ChemTHEATER
Lerne Zundokokiyoshi mit LSTM
Pandas lernen mit Chemoinfomatik
Verwenden Sie Tensorboard mit Chainer
Scikit-Lernen mit Chemoinfomatik
Lernen Sie mit Chemo Informatics Matplotlib
Lernen Sie mit Chemo Informatics NumPy
DCGAN mit TF Learn
Lernen Sie Pendulum-v0 mit DDPG
Ich habe versucht, die Sündenfunktion mit Chainer zu trainieren
Versuchen Sie, RBM mit Chainer zu implementieren.
Lernen Sie neue Daten mit PaintsChainer
Seq2Seq (3) ~ CopyNet Edition ~ mit Chainer
Verwendung von Chainer mit Jetson TK1
Neuronales Netz beginnend mit Chainer
Bedingte GAN mit Chainer implementiert
Bildunterschriftengenerierung mit Chainer
SmoothGrad mit Chainer v2 implementiert
Deep Embedded Clustering mit Chainer 2.0
Ein bisschen im Kettenschiff stecken
Lernen Sie mit Causal ML Package Meta-Learner
Mehrschichtiges Perzeptron mit Kette: Funktionsanpassung
Lernen Sie mit PyTorch Graph Convolutional Networks
[TensorFlow 2] Lernen Sie RNN mit CTC-Verlust
Lass uns mit Selene Deep SEA lernen
Versuchen Sie, Pferderennen mit Chainer vorherzusagen
[Chainer] Lernen von XOR mit mehrschichtigem Perzeptron
Lernen Sie die Kategorisierung von Dokumenten mit spaCy CLI
Erste Anime-Gesichtserkennung mit Chainer
Führen Sie eine Inferenz mit dem Chainer 2.0 MNIST-Beispiel durch
Verwenden von Chainer mit CentOS7 [Umgebungskonstruktion]
Versuchen Sie Common Representation Learning mit Chainer
Seq2Seq (2) ~ Achtung Model Edition ~ mit Chainer
Ich habe versucht, den Winkel von Sin und Cos mit Chainer zu lernen