[PYTHON] Essayez de résoudre le problème du fizzbuzz avec Keras

Résolvez le problème du fizzbuzz avec Keras

Connaissez-vous le problème Fizzbuzz? Il s'agit d'un problème de programmation débutant et vous écrivez le code suivant.

Un exemple de réponse écrite en Python est le suivant.

import numpy as np
num = np.arange(1,101,1)
for i in num:
    if i % 15 == 0: print ("fizzbuzz")
    elif i % 5 == 0: print ("buzz")
    elif i % 3 == 0: print ("fizz")
    else: print (i)

Il existe d'innombrables façons d'écrire du code, mais fondamentalement, il est facile d'écrire en divisant la casse en pour et si.

Pourtant! C'est la nature humaine qui nous donne envie de résoudre ces problèmes avec un apprentissage en profondeur. De plus, certains ancêtres l'ont résolu même avec Tensorflow (bien qu'il n'ait pas été résolu (.ŏ﹏ŏ)). http://joelgrus.com/2016/05/23/fizz-buzz-in-tensorflow/

Alors, réécrivons le fizzbuzz Tensorflow ci-dessus avec Keras. Principalement, seule la partie modèle a été migrée vers Keras, et la plupart des autres codes sont basés sur la version de Tensorflow telle quelle.

Cible

Un modèle de réseau neuronal est créé par apprentissage supervisé et le taux de réponse correct du modèle est évalué en utilisant un entier de 1 à 100 comme données de test.

Ecrire en Keras

Écrivons-le maintenant.

Tout d'abord, importez les bibliothèques requises.

import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.utils import np_utils
from keras.layers import Dense
from keras.models import Model

Les données de l'enseignant sont requises. Cette fois, les données de l'enseignant sont un nombre entier de 101 à 1024, mais les données de l'enseignant sont au format binaire. Autrement dit, la matrice en (923, 10) est les données de l'enseignant.

def binary_encode(i, num_digits):
    return np.array([i >> d & 1 for d in range(num_digits)])

NUM_DIGITS = 10
trX = np.array([binary_encode(i, NUM_DIGITS) for i in range(101, 2 ** NUM_DIGITS)])

Maintenant, nous avons également besoin de la valeur fizzbuzz des données de l'enseignant. Ceci est également réalisé au format binaire.

def fizz_buzz_encode(i):
    if   i % 15 == 0: return np.array([0, 0, 0, 1])
    elif i % 5  == 0: return np.array([0, 0, 1, 0])
    elif i % 3  == 0: return np.array([0, 1, 0, 0])
    else:             return np.array([1, 0, 0, 0])

trY = np.array([fizz_buzz_encode(i) for i in range(101, 2 ** NUM_DIGITS)])

Ceci complète les données de l'enseignant 101-1024 entiers (format binaire) et leur fizzbuzz (format binaire). Les préparatifs sont terminés. Maintenant écrivons un modèle.

Générez des modèles de manière séquentielle.

model = Sequential()

Ajoutez un calque. Cette fois, nous utiliserons un réseau à 3 couches (entièrement combiné).

model.add(Dense(1000, input_dim=10, activation="relu"))
model.add(Dense(1000, activation="relu"))
model.add(Dense(4, activation="softmax"))

La sortie finale est un entier, un fizz, un buzz ou un fizzbuzz, donc la couche finale aura une sortie de 4.

L'algorithme d'optimisation doit être adagrad. La version Tensorflow était SGD, mais elle n'a pas beaucoup convergé lorsque je l'ai fait avec Keras. Compilons le modèle et formons-le.

model.compile(loss='categorical_crossentropy', optimizer='adagrad', metrics=["accuracy"])
model.fit(trX, trY, nb_epoch=100, batch_size=128)

2017-02-06_fizzbuzz.PNG

C'est un taux de convergence équitable. (Légèrement overfit?)

Évaluation du modèle

Évaluons ce modèle. Appliquons le modèle aux entiers de 1 à 100.

def fizz_buzz(i, prediction):
    return [str(i), "fizz", "buzz", "fizzbuzz"][prediction]
numbers = np.arange(1, 101)
teX = np.transpose(binary_encode(numbers, NUM_DIGITS))
teY = model.predict_classes(teX)
output = np.vectorize(fizz_buzz)(numbers, teY)
print (output)

sortit de.

2017-02-06_fizzbuzz2.PNG

À propos, la bonne réponse est la suivante.

answer = np.array([])
for i in numbers:
    if i % 15 == 0: answer = np.append(answer, "fizzbuzz")
    elif i % 5 == 0: answer = np.append(answer, "buzz")
    elif i % 3 == 0: answer = np.append(answer, "fizz")
    else: answer = np.append(answer, str(i))
print (answer)

2017-02-06_fizzbuzz3.PNG

Voyons le taux de précision du modèle.

evaluate = np.array(answer == output)
print (np.count_nonzero(evaluate == True) / 100)

2017-02-06_fizzbuzz4.PNG

97%!! Est-ce si bon?

Vous pouvez obtenir un meilleur taux de précision en augmentant le nombre de couches et d'unités, mais ce n'est pas grave.

Le code entier est ci-dessous.

import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.utils import np_utils
from keras.layers import Dense
from keras.models import Model


#Génération des données des enseignants
def binary_encode(i, num_digits):
    return np.array([i >> d & 1 for d in range(num_digits)])

NUM_DIGITS = 10
trX = np.array([binary_encode(i, NUM_DIGITS) for i in range(101, 2 ** NUM_DIGITS)])


#Fizzbuzz des données des enseignants
def fizz_buzz_encode(i):
    if   i % 15 == 0: return np.array([0, 0, 0, 1])
    elif i % 5  == 0: return np.array([0, 0, 1, 0])
    elif i % 3  == 0: return np.array([0, 1, 0, 0])
    else:             return np.array([1, 0, 0, 0])

trY = np.array([fizz_buzz_encode(i) for i in range(101, 2 ** NUM_DIGITS)])


#modèle
model = Sequential()
model.add(Dense(1000, input_dim=10, activation="relu"))
model.add(Dense(1000, activation="relu"))
model.add(Dense(4, activation="softmax"))
model.compile(loss='categorical_crossentropy', optimizer='adagrad', metrics=["accuracy"])
model.fit(trX, trY, nb_epoch=100, batch_size=128)


#Conversion fizzbuzz binaire
def fizz_buzz(i, prediction):
    return [str(i), "fizz", "buzz", "fizzbuzz"][prediction]


#Essayez d'appliquer le modèle à des entiers de 1 à 100
numbers = np.arange(1, 101)
teX = np.transpose(binary_encode(numbers, NUM_DIGITS))
teY = model.predict_classes(teX)
output = np.vectorize(fizz_buzz)(numbers, teY)
print (output)


#Bonne réponse
answer = np.array([])
for i in numbers:
    if i % 15 == 0: answer = np.append(answer, "fizzbuzz")
    elif i % 5 == 0: answer = np.append(answer, "buzz")
    elif i % 3 == 0: answer = np.append(answer, "fizz")
    else: answer = np.append(answer, str(i))
print (answer)


#Taux de réponse correct
evaluate = np.array(answer == output)
print (np.count_nonzero(evaluate == True) / 100)

Recommended Posts

Essayez de résoudre le problème du fizzbuzz avec Keras
Essayez de résoudre le problème d'affectation du médecin de formation avec Python
Essayez de résoudre le problème N Queen avec SA de PyQUBO
Essayez de résoudre le problème de l'héritage de classe Python
Essayez de résoudre le diagramme homme-machine avec Python
Essayez de résoudre le problème du voyageur de commerce avec un algorithme génétique (théorie)
Essayez de résoudre le livre des défis de programmation avec python3
[Python] Essayez de lire la bonne réponse au problème FizzBuzz
J'ai essayé de résoudre le problème avec Python Vol.1
Essayez de résoudre le problème du voyageur de commerce avec un algorithme génétique (code Python)
Essayez de résoudre le problème du voyageur de commerce avec un algorithme génétique (résultat de l'exécution)
Comment résoudre le problème d'emballage du bac
Résolvez le problème du voyageur de commerce avec OR-Tools
Je voulais résoudre le problème ABC164 A ~ D avec Python
Essayez de résoudre l'itinéraire le plus court avec les données sociales Python + NetworkX +
Essayez de résoudre le problème de minimisation des fonctions en utilisant l'optimisation des groupes de particules
Le 16ème comment écrire un problème de référence en temps réel hors ligne à résoudre avec Python
Comment essayer l'algorithme des amis d'amis avec pyfof
Le 19ème comment écrire un problème de référence en temps réel hors ligne à résoudre avec Python
Essayez de résoudre un problème défini de mathématiques au lycée avec Python
Essayez de créer un problème FizzBuzz avec un programme shell
Essayez de résoudre les problèmes / problèmes du "programmeur matriciel" (Chapitre 1)
Visualisons la pièce avec tarte aux râpes, partie 1
J'ai essayé de résoudre Soma Cube avec python
Essayez d'obtenir le contenu de Word avec Golang
[Neo4J] ④ Essayez de gérer la structure du graphe avec Cypher
Essayez de défier le sol par récursif
Résolvez le problème de Monty Hall
J'ai essayé de résoudre le problème d'optimisation du placement de la machine virtuelle (version simple) avec blueqat
Le 15e temps réel hors ligne, j'ai essayé de résoudre le problème de l'écriture avec python
CNN avec keras Essayez avec l'image que vous avez prise
Essayez de jouer avec l'uprobe qui prend directement en charge Systemtap
Je voulais résoudre le concours de programmation Panasonic 2020 avec Python
Trouver une solution au problème N-Queen avec un algorithme génétique (2)
J'ai essayé de résoudre le problème d'optimisation des combinaisons avec Qiskit
Essayez de résoudre les problèmes / problèmes du "programmeur matriciel" (fonction du chapitre 0)
Essayez d'automatiser le fonctionnement des périphériques réseau avec Python
Une histoire sur la façon de traiter le problème CORS
Le problème devient plus facile à résoudre en fonction de la méthode de formulation
Essayez de déchiffrer les caractères déformés dans le nom du fichier joint avec Python
Trouver une solution au problème N-Queen avec un algorithme génétique (1)
Essayez d'extraire les caractéristiques des données de capteur avec CNN
J'ai essayé de résoudre le problème de F02 comment écrire en temps réel hors ligne avec Python
Essayez d'exploiter Facebook avec Python
Essayez de profiler avec ONNX Runtime
Essayez d'introduire le thème sur Pelican
Débutant RNN (LSTM) | Essayer avec Keras
Essayez Cython dans les plus brefs délais
Essayez de brouiller l'image avec opencv2
Essayez de produire de l'audio avec M5 STACK
Le moyen le plus rapide d'essayer EfficientNet
La façon la plus simple d'essayer PyQtGraph
J'ai essayé de résoudre l'édition du débutant du livre des fourmis avec python
Résolution du problème de la valeur initiale des équations différentielles ordinaires avec JModelica
Résolvez le problème du sac à dos Python avec la méthode de branche et liée
J'ai essayé de résoudre le problème de planification des équipes par diverses méthodes
Du «dessin» à «l'écriture» du diagramme de configuration: essayez de dessiner le diagramme de configuration AWS avec des diagrammes
Résolvez les problèmes de somme partielle avec une recherche complète en Python