[PYTHON] Ich habe versucht, die Sündenfunktion mit Chainer zu approximieren

Nachdem ich mit einem der Deep Learning Frameworks chainer studiert hatte, versuchte ich, die Sündenfunktion zu approximieren, aber es funktionierte nicht. Code, der im Chainer-Beispiel nur eine Neufassung von mnist ist. Ich weiß nicht, ob der Datensatz schlecht ist oder ob es einen Fehler im Lernprozess gibt. Ich würde mich sehr freuen, wenn Sie darauf hinweisen könnten.

Erstellen Sie zunächst einen Datensatz

make_dataset.py


def make_dateset():
	x_train = np.arange(0,3.14*50.0,0.05)
	y_train = np.sin(x_train).astype(np.float32)
	x_test  = np.arange(3.14*50.0,3.14 * 60.0,0.05)
	y_test = np.sin(x_test).astype(np.float32)
	return x_train.astype(np.float32),y_train.astype(np.float32),x_test.astype(np.float32),y_test.astype(np.float32)

x_train enthält Zahlen von 0 bis 3,14 * 50 in Schritten von 0,05 in np.array ex) [0.0,0.05,0.10,......,157.0]

y_train enthält den Wert von x_train, der der sin-Funktion zugewiesen ist. ex) [0.0,0.47942553860420301,0.09983341......,]

x_test und y_test sind ähnlich. Nur die Reichweite ist unterschiedlich

sin_test.py


import numpy as np
import six
import chainer
from chainer import computational_graph as c
from chainer import cuda
import chainer.functions as F
from chainer import optimizers
import matplotlib.pyplot as plt
import csv

def make_dateset():
	x_train = np.arange(0,3.14*50.0,0.05)
	y_train = np.sin(x_train).astype(np.float32)
	x_test  = np.arange(3.14*50.0,3.14 * 60.0,0.05)
	y_test = np.sin(x_test).astype(np.float32)
	return x_train.astype(np.float32),y_train.astype(np.float32),x_test.astype(np.float32),y_test.astype(np.float32)


	
def forward(x_data,y_data,train = True):
	x,t = chainer.Variable(x_data),chainer.Variable(y_data)
	h1 = F.dropout(F.relu(model.l1(x)),  train=train)
	h2 = F.dropout(F.relu(model.l2(h1)),  train=train)
        h3 = F.dropout(F.relu(model.l3(h1)),  train=train)
	y = model.l4(h3)
	return F.mean_squared_error(y,t),y


if __name__ == "__main__":
	
	x_train,y_train,x_test,y_test = make_dateset()
	x_train,y_train = x_train.reshape(len(x_train),1),y_train.reshape(len(y_train),1)
	x_test,y_test = x_test.reshape(len(x_test),1),y_test.reshape(len(y_test),1)
	y_t,y_p,ll = [],[],[]
	
	xp = np

	batchsize = 10
	N = len(x_train)
	N_test = len(x_test)
	n_epoch = 100
	n_units = 20
	pred_y = []

	model = chainer.FunctionSet(l1=F.Linear(1, n_units),
								l2=F.Linear(n_units, n_units),
								l3=F.Linear(n_units, u_units)),
                                                                l4=F.Linear(n_units, 1))
	optimizer = optimizers.Adam()
	optimizer.setup(model.collect_parameters())



	x_t,y_t,y_p = [],[],[]

	for epoch in six.moves.range(1, n_epoch + 1):
		print('epoch', epoch)

		perm = np.random.permutation(N)
		sum_loss = 0

		for i in six.moves.range(0, N, batchsize):
			x_batch = xp.asarray(x_train[perm[i:i + batchsize]])
			y_batch = xp.asarray(y_train[perm[i:i + batchsize]])

			optimizer.zero_grads()
			loss,y = forward(x_batch, y_batch)
			loss.backward()
			optimizer.update()
			sum_loss += float(cuda.to_cpu(loss.data)) * len(y_batch)
		print "train mean loss = ",sum_loss/N 
		
		sum_loss = 0
		for i in six.moves.range(0, N_test, batchsize):
			x_batch = xp.asarray(x_test[i:i + batchsize])
			y_batch = xp.asarray(y_test[i:i + batchsize])
			loss, y = forward(x_batch, y_batch, train=False)
                        #Für Devac
			#y_t.append(y_batch[0])
			#y_p.append(y.data[0])
			#x_t.append(x_batch[0])
			sum_loss += float(cuda.to_cpu(loss.data)) * len(y_batch)
		print "test mean loss is ",sum_loss/N_test
    #Für Devac
	#f = open('sin_pre.csv','ab')
	#csvWriter = csv.writer(f)
	#csvWriter.writerow(y_p)
	#f.close()

	#f = open('sin_ans.csv','ab')
	#csvWriter = csv.writer(f)
	#csvWriter.writerow(y_t)
	#f.close()

Die ersten x_train, y_train, x_test, y_test werden in eine N * 1-Matrix konvertiert. (Um an Variable of chainer übergeben zu können) Der Rest ist fast der gleiche wie die Mnist-Stichprobe. Der Unterschied ist das Regressionsproblem, daher verwendet die Forward () -Funktion mean_squared_error (mittlere quadratische Fehlerfunktion), um den Verlust zu ermitteln. Danach ist die Netzwerkkonfiguration 1-20-20-1.

Ausführungsergebnis(Bis zur Epoche 10)


('epoch', 1)
train mean loss =  2553.66754833
test mean loss is  127.272548827
('epoch', 2)
train mean loss =  401.413729346
test mean loss is  5.86524515122
('epoch', 3)
train mean loss =  138.270190761
test mean loss is  4.34996299998
('epoch', 4)
train mean loss =  68.4881465446
test mean loss is  0.659433874475
('epoch', 5)
train mean loss =  38.2469408746
test mean loss is  0.640729590383
('epoch', 6)
train mean loss =  24.6955423482
test mean loss is  0.529370371471
('epoch', 7)
train mean loss =  16.3685227446
test mean loss is  0.505678843091
('epoch', 8)
train mean loss =  11.0349840385
test mean loss is  0.542997811425
('epoch', 9)
train mean loss =  7.98288726631
test mean loss is  0.509733980175
('epoch', 10)
train mean loss =  5.89249175341
test mean loss is  0.502585373718

Es scheint, dass ich lerne, aber der mittlere Verlust des Tests wandert von etwa Epoche über 20 um 0,5 herum, und es gibt kein Anzeichen dafür, dass er weiter sinken wird. Ich weiß nicht, ob ich in eine lokale Lösung geraten bin, ob die Parameter nicht aktualisiert wurden oder ob der Code einfach einen Fehler enthält.

Referenz chainer

Recommended Posts

Ich habe versucht, die Sündenfunktion mit Chainer zu approximieren
Ich habe versucht, die Sündenfunktion mit Chainer zu approximieren (Re-Challenge)
Ich habe versucht, die Sündenfunktion mit Chainer zu trainieren
Ich habe versucht, den Index der Liste mithilfe der Aufzählungsfunktion abzurufen
Ich habe versucht, den Winkel von Sin und Cos mit Chainer zu lernen
Ich habe versucht, die Sprache mit CNN + Melspectogram zu identifizieren
Ich habe versucht, das Wissensdiagramm mit OpenKE zu ergänzen
Ich habe versucht, das Bild mithilfe von maschinellem Lernen zu komprimieren
Ich habe versucht, den Ball zu bewegen
Ich habe versucht, die checkio-API zu verwenden
Ich habe versucht, den Abschnitt zu schätzen.
Ich habe versucht, die Anzeigenoptimierung mithilfe des Banditenalgorithmus zu simulieren
Ich habe versucht, die Mail-Sendefunktion in Python zu implementieren
[TF] Ich habe versucht, das Lernergebnis mit Tensorboard zu visualisieren
Ich habe versucht, das lokale Minimum der Goldstein-Preis-Funktion zu bekämpfen
Ich habe versucht, das Zugriffsprotokoll mit Node.js auf dem Server auszugeben
Ich habe versucht, Azure Speech to Text zu verwenden.
Ich habe versucht, den Befehl umask zusammenzufassen
Ich versuchte das Weckwort zu erkennen
Ich habe versucht, Text mit TensorFlow zu klassifizieren
Ich habe versucht, die grafische Modellierung zusammenzufassen.
Ich habe versucht, den auf Papier gestempelten Stempel mit OpenCV zu digitalisieren
Ich habe versucht, das Umfangsverhältnis π probabilistisch abzuschätzen
Ich habe versucht, die COTOHA-API zu berühren
Ich habe versucht, die BigQuery-Speicher-API zu verwenden
Ich habe versucht, das Gesichtsbild mit sparse_image_warp von TensorFlow Addons zu transformieren
Ich habe versucht, die Trefferergebnisse von Hachinai mithilfe der Bildverarbeitung zu erhalten
Ich habe versucht, die Ähnlichkeit der Frageabsicht mit Doc2Vec von gensim abzuschätzen
765 Ich habe versucht, die drei Berufsfamilien durch CNN zu identifizieren (mit Chainer 2.0.0).
Ich habe versucht, mehrere Servomotoren MG996R mit dem Servotreiber PCA9685 zu steuern.
Ich habe versucht, verschiedene Sätze mit der automatischen Zusammenfassungs-API "summpy" zusammenzufassen.
Ich habe versucht, die Phase der Geschichte mit COTOHA zu extrahieren und zu veranschaulichen
Ich habe die übliche Geschichte ausprobiert, Deep Learning zu verwenden, um den Nikkei-Durchschnitt vorherzusagen
Mit COTOHA habe ich versucht, den emotionalen Verlauf des Laufens von Meros zu verfolgen.
Ich habe versucht, die Neujahrskarte selbst mit Python zu analysieren
Ich habe Web Scraping versucht, um die Texte zu analysieren.
Ich habe die Pivot-Table-Funktion von Pandas ausprobiert
[Python] Ich habe versucht, den Funktionsnamen durch den Funktionsnamen zu ersetzen
Ich habe versucht, beim Trocknen der Wäsche zu optimieren
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich habe versucht, WAV-Dateien mit Pydub zu synthetisieren.
Ich habe versucht, PyCaret mit der schnellsten Geschwindigkeit zu verwenden
Ich habe versucht, die Google Cloud Vision-API zu verwenden
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Ich habe versucht, das Datetime-Modul von Python zu verwenden
Qiita Job Ich habe versucht, den Job zu analysieren
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
LeetCode Ich habe versucht, die einfachen zusammenzufassen
Ich habe versucht, die funktionale Programmierbibliothek toolz zu verwenden
Ich möchte die Aktivierungsfunktion Mish verwenden
Ich habe versucht, das Problem des Handlungsreisenden umzusetzen
Ich habe ein ○ ✕ Spiel mit TensorFlow gemacht
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Ich habe versucht, parametrisiert zu verwenden
Ich habe versucht, Argparse zu verwenden
Ich habe versucht, Mimesis zu verwenden
Ich habe versucht, anytree zu verwenden