Bonjour tous le monde
Il y a quelque temps Essayez de créer un réseau neuronal avec PHP, j'ai essayé de vérifier ce que je faisais. Cependant, il est lent et le système n'est pas très bon car il n'existe actuellement aucune méthode de calcul sophistiquée qui ait été vérifiée et mise en pratique dans divers endroits. Donc, cette fois, je vais essayer le mécanisme d'apprentissage automatique d'Imadoki en utilisant un framework appelé Keras.
Keras
Keras est une bibliothèque de réseaux neuronaux qui s'exécute sur TensorFlow et est écrite en Python. Du sentiment de l'utiliser, j'ai pensé que je pourrais écrire un réseau en le laissant à mon intuition. Lorsque j'ai écrit TensorFlow raw, il était difficile de définir divers paramètres, mais Ce domaine est également devenu plus facile à faire.
Keras on Docker
Oh, il y a, après tout, l'image avec Keras https://hub.docker.com/r/gw000/keras/
Vous pouvez maintenant essayer Keras sans polluer votre environnement.
Le paramètre de problème est le problème de classification de type de beignet que j'ai fait auparavant.
{f(x, y) = \left\{
\begin{array}{1}
1, (1 < x^2 + y^2 < 4)\\
0, ( \rm{otherwise} )
\end{array}
\right.
}
Maintenant que vous avez décidé ce que vous voulez faire, commençons à mettre en œuvre
Tout d'abord, faites-le à partir du mécanisme d'apprentissage.
learn.py
from keras.models import Sequential
from keras.layers import Dense, Activation
import numpy as np
import random
import math
def double_circle():
x = random.uniform(-2, 2)
y = random.uniform(-2, 2)
sample = (x,y)
norm = math.sqrt(x * x + y * y)
if norm > 1 and norm < 2:
label = 1
else:
label = 0
return (sample, label)
# Model Definition
model = Sequential()
model.add(Dense(32, input_dim=2))
model.add(Dense(64, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])
data = []
labels = []
for num in range(1024):
(sample, label) = double_circle()
data.append(sample)
labels.append(label)
model.fit(np.array(data), np.array(labels), nb_epoch=100, batch_size=32)
model.save('/srv/model/double_circle')
Utilisez la fonction double_circle
pour choisir des coordonnées aléatoires et renvoyer une étiquette qui détermine si le point est à l'intérieur d'une figure en anneau.
Ensuite, mettez l'ensemble de coordonnées et l'étiquette dans la liste.
Ensuite, nous allons créer un modèle, et Keras formera un modèle avec l'image de l'empilement de chaque couche du réseau neuronal.
model.add(Dense(32, input_dim=2))
model.add(Dense(64, activation='relu'))
Par exemple, nous définissons ici les première et deuxième couches.
La première couche ne connaît pas la dimension d'entrée, elle est donc clairement indiquée. Puisque le point de coordonnées est l'entrée cette fois, entrez ʻinput_dim = 2. Étant donné que le premier argument de la première couche est la dimension de sortie, la deuxième couche n'a pas besoin d'une dimension d'entrée. De plus, ʻactivation = 'relu'
est défini dans la fonction d'activation de la deuxième couche (s'il n'y a pas de paramètre, il est affiché tel quel).
Vous pouvez empiler les calques comme vous le souhaitez.
$ docker run --rm -v `pwd`:/srv/ gw000/keras python learn.py
Exécutons le conteneur Docker de Keras et laissons-le apprendre. Cela a pris environ 5 secondes sur mon Mac. Un fichier modèle a été créé dans le répertoire modèle.
Voyons comment fonctionne le modèle généré.
use.py
from keras.models import load_model
import numpy as np
model = load_model('/srv/ai/model/double_circle')
def check(x):
data = np.array([x])
pred = model.predict(np.array([x]))
#print pred
if pred > 0.5:
return 1
else:
return 0
for y in range(20):
labels = []
for x in range(20):
data = [(x-10.0)/5, (10.0-y)/5]
labels.append(check(data))
print labels
Keras charge simplement le modèle et recrée le réseau que vous avez appris avec learn. Ce script utilise le modèle chargé pour déterminer si la plage $ -2 <x <2 $, $ -2 <y <2 $ se trouve dans la zone spécifiée par incréments de 0,1. Lorsque vous exécutez celui-ci, il ressemble à ceci.
$ docker run --rm -v `pwd`:/srv/ gw000/keras python use.py
[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0]
[0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0]
[0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0]
[0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0]
[0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1]
[0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]
[0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0]
[0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0]
[0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0]
[0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0]
[0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
La forme ronde a émergé, donc je ne pense pas que ça se passe bien.
Prenons un peu plus de détails. Prenons maintenant les points de données par incréments de 0,02. Cette fois, je vais essayer de cracher les points de coordonnées jugés inclus dans la zone au format CSV
to_csv.py
from keras.models import load_model
import numpy as np
model = load_model('/srv/model/double_circle')
def check(x):
data = np.array([x])
pred = model.predict(np.array([x]))
#print pred
if pred > 0.5:
return 1
else:
return 0
for y in range(100):
for x in range(100):
data = [(x-50.0)/20, (50.0-y)/20]
if check(data) == 1:
print "%f,%f" % (data[0],data[1])
Donc, comme d'habitude, il sera traité par docker.
docker run --rm -v `pwd`:/srv/ gw000/keras python to_csv.py > result.csv
Tracons le résultat.csv qui est sorti. Eh bien, ça pourrait être quelque chose comme ça
Pour le moment, afin de démarrer avec Keras, j'ai essayé de réaliser celui que j'avais fait avec PHP auparavant. Il est plus facile à comprendre que TensorFlow lors de la création de réseaux et de couches.
Cette fois, c'est comme ça.