In diesem Artikel "Erstellen Sie ein neuronales Netzwerk mit Python ohne Verwendung einer Bibliothek --Qiita" Ein Artikel (Aufbau eines neuronalen Netzes mit Chainer - Qiita), den ein Senior des Unternehmens mit Chainer ausprobiert hat Ich habe es auch mit Keras versucht (Material für LT in der Firma)
Die Quelle und das Ausführungsergebnis sind in der folgenden Übersicht aufgeführt. Aufbau eines neuronalen Netzwerks mit Keras
Erstellen Sie Eingabedaten. Dies ist genau die gleiche Implementierung.
Erstellung von Eingabedaten (Cum-Teacher-Daten)
import numpy as np
import sklearn.datasets
import matplotlib
import matplotlib.pyplot as plt
np.random.seed(0)
X,y=sklearn.datasets.make_moons(200,noise=0.20)
plt.scatter(X[:,0], X[:,1], s=40, c=y, cmap=plt.cm.Spectral)
Erstellen Sie ein Modell mit Keras.
Modellieren
import keras
from keras.models import Sequential
from keras.layers import Dense, Activation
model = Sequential()
model.add(Dense(output_dim=6, input_dim=2))
model.add(Activation('tanh'))
model.add(Dense(output_dim=2))
model.compile(optimizer='Adam', loss='mse')
Es ist ungefähr das gleiche, weil ich Chainer's portiert habe.
(Es scheint jedoch, dass die Verlustfunktion in Classifier
in Chainer versteckt ist, aber was wird verwendet?)
=> [Addition] Im folgenden Artikel wurde gesagt, dass "softmax_cross_entropy" in Chainers Klassifikator verwendet wird.
Hinweise zu Änderungen in Chainer 1.5 --studylog / Northern Clouds
Art | Wert einstellen |
---|---|
Eingabeebene | 2 |
Versteckte Ebene | 6 |
Aktivierungsfunktion | tanh |
Ausgabeschicht | 2 |
Optimierer (Optimierungsalgorithmus) | Adam |
Zielfunktion (Verlustfunktion) | Durchschnittlicher quadratischer Fehler(Mean Squared Error) |
Sequential Model Guide-Keras-Dokumentation Aktivierungsfunktion - Keras-Dokumentation Optimization-Keras-Dokumentation Zielfunktion - Keras-Dokumentation
(Epoche war 20000 in Chainer, aber es wurde zum Zeitpunkt der Transplantation fälschlicherweise auf 2000 geändert, und es war ein schlechtes Ergebnis, wenn die verborgene Schicht 3 war, was mit Chainer identisch ist. Als die verborgene Schicht jedoch auf 6 gesetzt wurde, war es 2000. Ich habe ein gutes Ergebnis erzielt
Trainiere mit model.fit ()
.
In Bezug auf y_train wird es in ein zweidimensionales Array (Vektor) mit einer Wahrscheinlichkeit von 0 und einer Wahrscheinlichkeit von 1 umgewandelt. (Chainer scheint es ohne Erlaubnis zu konvertieren)
x_train = X
y_train = keras.utils.np_utils.to_categorical(y, nb_classes=2)
model.fit(x=x_train, y=y_train, nb_epoch=2000)
Numpy Utility - Keras-Dokumentation
Ergebnisausgabe
# https://gist.github.com/dennybritz/ff8e7c2954dd47a4ce5f
def plot_decision_boundary(pred_func):
# Set min and max values and give it some padding
x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
h = 0.01
# Generate a grid of points with distance h between them
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
# Predict the function value for the whole gid
Z = pred_func(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
# Plot the contour and training examples
plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Spectral)
def predict(model, x_data):
y = model.predict(x_data)
return np.argmax(y.data, axis=1) #Holen Sie sich den Index, der der Maximalwert ist
plot_decision_boundary(lambda x: predict(model, x))
Ich denke, dies ergibt fast das gleiche Ergebnis wie der Originalartikel.
Recommended Posts