[PYTHON] [Keras] J'ai essayé de résoudre le problème de classification des zones de type beignet par apprentissage automatique [Étude]

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.

Problème de réglage

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

double_circle.png

la mise en oeuvre

Maintenant que vous avez décidé ce que vous voulez faire, commençons à mettre en œuvre

Mécanisme d'apprentissage

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.

Utilisation du modèle de génération

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. result.png Eh bien, ça pourrait être quelque chose comme ça

Résumé

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.

référence

Site officiel

Recommended Posts

[Keras] J'ai essayé de résoudre le problème de classification des zones de type beignet par apprentissage automatique [Étude]
J'ai essayé de résoudre le problème d'optimisation des combinaisons avec Qiskit
J'ai essayé de vérifier la classification yin et yang des membres hololive par apprentissage automatique
J'ai essayé de résoudre le problème de planification des équipes par diverses méthodes
Vous voulez résoudre un problème de classification simple?
J'ai installé Python 3.5.1 pour étudier l'apprentissage automatique
J'étais frustré par Kaggle, alors j'ai essayé de trouver une bonne propriété locative en grattant et en apprentissage automatique
Je souhaite créer un service d'apprentissage automatique sans programmation!
J'ai essayé de prédire la présence ou l'absence de neige par apprentissage automatique.
J'ai essayé de prédire l'évolution de la quantité de neige pendant 2 ans par apprentissage automatique
J'ai essayé de déplacer l'apprentissage automatique (détection d'objet) avec TouchDesigner
J'ai essayé de résoudre le problème avec Python Vol.1
J'ai essayé de compresser l'image en utilisant l'apprentissage automatique
J'ai essayé de faire une simulation de séparation de source sonore en temps réel avec l'apprentissage automatique Python
J'ai essayé de résoudre le problème d'optimisation du placement de la machine virtuelle (version simple) avec blueqat
Oncle SE avec un cerveau endurci a essayé d'étudier l'apprentissage automatique
J'ai essayé d'implémenter la détection d'anomalies par apprentissage de structure clairsemée
J'ai essayé d'utiliser Tensorboard, un outil de visualisation pour l'apprentissage automatique
J'ai essayé l'apprentissage automatique pour convertir des phrases en style XX
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
J'ai essayé d'écrire dans un modèle de langage profondément appris
J'ai essayé de comparer la précision des modèles d'apprentissage automatique en utilisant kaggle comme thème.
Application correspondante, j'ai essayé de prendre des statistiques de personnes fortes et j'ai essayé de créer un modèle d'apprentissage automatique
J'ai essayé de créer un pointage de crédit simple avec régression logistique.
J'ai essayé de rendre le deep learning évolutif avec Spark × Keras × Docker
J'ai essayé l'apprentissage automatique avec liblinear
J'ai essayé HR Tech pour développer un moteur de recherche expert par apprentissage automatique des informations de réunion en interne
J'ai essayé d'implémenter la classification des phrases par Self Attention avec PyTorch
Je voulais résoudre le problème ABC164 A ~ D avec Python
Je souhaite créer un service d'apprentissage automatique sans programmation! API Web
[Apprentissage automatique] J'ai essayé de faire quelque chose comme passer des images
J'ai essayé "Implémentation d'un algorithme génétique (GA) en python pour résoudre le problème du voyageur de commerce (TSP)"
(Apprentissage automatique) J'ai essayé de comprendre attentivement l'algorithme EM dans la distribution gaussienne mixte avec l'implémentation.
J'ai changé de travail pour devenir ingénieur en apprentissage automatique chez AtCoder Jobs
J'ai essayé de communiquer avec un serveur distant par communication Socket avec Python.
Mayungo's Python Learning Episode 6: J'ai essayé de convertir une chaîne de caractères en nombre
J'ai essayé de classer les accords de guitare en temps réel en utilisant l'apprentissage automatique
(Apprentissage automatique) J'ai essayé de comprendre attentivement la régression linéaire bayésienne avec l'implémentation
J'ai essayé de classer les nombres de mnist par apprentissage non supervisé [PCA, t-SNE, k-means]
J'ai essayé de visualiser le modèle avec la bibliothèque d'apprentissage automatique low-code "PyCaret"
J'ai essayé de classer Oba Hanana et Otani Emiri par apprentissage profond
J'ai essayé de vérifier le résultat du test A / B avec le test du chi carré
J'ai essayé de créer un linebot (implémentation)
J'ai essayé de créer un linebot (préparation)
J'ai essayé de laisser optuna résoudre le nombre
J'ai créé une API Web
J'ai essayé de résoudre TSP avec QAOA
Mémo d'étude Python & Machine Learning ④: Machine Learning par rétro-propagation
J'ai essayé de comprendre attentivement la fonction d'apprentissage dans le réseau de neurones sans utiliser la bibliothèque d'apprentissage automatique (première moitié)
J'ai essayé d'organiser les index d'évaluation utilisés en machine learning (modèle de régression)
Essayez de dessiner un "front de type carte météorologique" par apprentissage automatique basé sur des données météorologiques (5)
Essayez de dessiner un "front de type carte météo" par apprentissage automatique basé sur les données météorologiques (3)
[Python] Deep Learning: J'ai essayé d'implémenter Deep Learning (DBN, SDA) sans utiliser de bibliothèque.
Un débutant en apprentissage automatique a essayé de créer un modèle de prédiction de courses de chevaux avec python
Essayez de dessiner un "front de type carte météo" par apprentissage automatique basé sur des données météorologiques (1)
Essayez de dessiner un "front de type carte météo" par apprentissage automatique basé sur des données météorologiques (4)
[Azure] J'ai essayé de créer une machine virtuelle Linux avec Azure de Microsoft Learn
J'ai essayé d'extraire le dessin au trait de l'image avec Deep Learning