Dans cet article, "Créer un réseau de neurones avec Python sans utiliser de bibliothèque --Qiita" Un article (Construction de réseau neuronal avec chainer --Qiita) qu'un senior de l'entreprise a essayé avec Chainer Je l'ai aussi essayé avec Keras (matériel pour LT dans l'entreprise)
La source et le résultat de l'exécution sont répertoriés dans la liste suivante. Création d'un réseau neuronal avec Keras
Créez des données d'entrée. C'est exactement la même implémentation.
Création de données d'entrée (données cum-enseignant)
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)
Créez un modèle avec Keras.
La modélisation
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')
C'est à peu près la même parce que j'ai porté Chainer's.
(Cependant, il semble que la fonction de perte soit cachée dans Classifier
dans Chainer, mais qu'est-ce qui est utilisé?)
=> [Addition] Dans l'article suivant, il a été dit que softmax_cross_entropy
est utilisé dans le classificateur de Chainer.
Notes sur les changements dans Chainer 1.5 --studylog / Northern Clouds
Type | Définir la valeur |
---|---|
Couche d'entrée | 2 |
Couche cachée | 6 |
Fonction d'activation | tanh |
Couche de sortie | 2 |
Optimiseur (algorithme d'optimisation) | Adam |
Fonction objective (fonction de perte) | Erreur quadratique moyenne(Mean Squared Error) |
Guide du modèle séquentiel - Documentation Keras Fonction d'activation - Documentation Keras Documentation Optimisation-Keras Fonction Objectif - Documentation Keras
(L'époque était de 20000 dans Chainer, mais elle a été changée par erreur à 2000 au moment de la transplantation, et ce n'était pas un bon résultat si la couche cachée était de 3, ce qui est identique à Chainer. Lorsque la couche cachée était réglée sur 6, c'était 2000. J'ai eu un bon résultat)
Entraînez-vous avec model.fit ()
.
Concernant y_train, il est converti en un tableau bidimensionnel (vecteur) avec une probabilité de 0 et une probabilité de 1. (Chainer semble le convertir sans autorisation)
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)
Utilitaire Numpy - Documentation Keras
Sortie de résultat
# 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) #Obtenez l'index qui est la valeur maximale
plot_decision_boundary(lambda x: predict(model, x))
Je pense que cela donne presque le même résultat que l'article original.