[PYTHON] Versuchen Sie, das Fizzbuzz-Problem mit Keras zu lösen

Lösen Sie das Fizzbuzz-Problem mit Keras

Kennen Sie das Fizzbuzz-Problem? Dies ist ein Programmierproblem für Anfänger, und Sie schreiben den folgenden Code.

Ein Beispiel für die in Python geschriebene Antwort lautet wie folgt.

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)

Es gibt unzählige Möglichkeiten, Code zu schreiben, aber im Grunde ist es einfach zu schreiben, indem man den Fall in for und if unterteilt.

Jedoch! Es ist die menschliche Natur, die uns dazu bringt, diese Probleme durch tiefes Lernen zu lösen. Darüber hinaus gibt es einige Vorfahren, die es sogar mit Tensorflow gelöst haben (obwohl es nicht gelöst wurde (.ŏ﹏ŏ)). http://joelgrus.com/2016/05/23/fizz-buzz-in-tensorflow/

Schreiben wir also den obigen Tensorflow-Fizzbuzz mit Keras neu. Hauptsächlich wurde nur der Modellteil nach Keras migriert, und der größte Teil des anderen Codes basiert auf der aktuellen Tensorflow-Version.

Ziel

Durch überwachtes Lernen wird ein neuronales Netzwerkmodell erstellt, und die korrekte Antwortrate des Modells wird unter Verwendung einer Ganzzahl von 1 bis 100 als Testdaten bewertet.

Schreiben Sie in Keras

Lass es uns jetzt schreiben.

Importieren Sie zunächst die erforderlichen Bibliotheken.

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

Lehrerdaten sind erforderlich. Diesmal sind die Lehrerdaten eine Ganzzahl von 101 bis 1024, aber die Lehrerdaten sind im Binärformat. Das heißt, die Matrix bei (923, 10) sind die Lehrerdaten.

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)])

Jetzt brauchen wir auch den Fizzbuzz-Wert der Lehrerdaten. Dies erfolgt ebenfalls im Binärformat.

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)])

Dies vervollständigt die Lehrerdaten 101-1024 Ganzzahlen (Binärformat) und deren Fizzbuzz (Binärformat). Die Vorbereitungen sind abgeschlossen. Nun schreiben wir ein Modell.

Generieren Sie Modelle nacheinander.

model = Sequential()

Fügen Sie eine Ebene hinzu. Dieses Mal werden wir ein dreischichtiges (vollständig kombiniertes) Netzwerk verwenden.

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

Die endgültige Ausgabe ist eine Ganzzahl, Fizz, Buzz oder Fizzbuzz, sodass die letzte Ebene eine Ausgabe von 4 hat.

Der Optimierungsalgorithmus sollte adagrad sein. Die Tensorflow-Version war SGD, aber sie konvergierte nicht viel, als ich es mit Keras tat. Lassen Sie uns das Modell kompilieren und trainieren.

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

2017-02-06_fizzbuzz.PNG

Es ist eine faire Konvergenzrate. (Etwas überpasst?)

Modellbewertung

Lassen Sie uns dieses Modell bewerten. Wenden wir das Modell auf Ganzzahlen von 1 bis 100 an.

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)

kam heraus.

2017-02-06_fizzbuzz2.PNG

Die richtige Antwort lautet übrigens wie folgt.

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

Sehen wir uns die Genauigkeitsrate des Modells an.

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

2017-02-06_fizzbuzz4.PNG

97%!! Ist es so gut

Sie können eine bessere Genauigkeitsrate erzielen, indem Sie die Anzahl der Ebenen und Einheiten erhöhen, aber das ist in Ordnung.

Der gesamte Code ist unten.

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


#Generierung von Lehrerdaten
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)])


#Lehrerdaten fizzbuzz
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)])


#Modell-
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)


#Binäre Fizzbuzz-Konvertierung
def fizz_buzz(i, prediction):
    return [str(i), "fizz", "buzz", "fizzbuzz"][prediction]


#Versuchen Sie, das Modell auf Ganzzahlen von 1 bis 100 anzuwenden
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)


#Richtige Antwort
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)


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

Recommended Posts

Versuchen Sie, das Fizzbuzz-Problem mit Keras zu lösen
Versuchen Sie, das Problem der Zuweisung von Schulungsärzten mit Python zu lösen
Versuchen Sie, das N Queen-Problem mit SA von PyQUBO zu lösen
Versuchen Sie, das Problem der Python-Klassenvererbung zu lösen
Versuchen Sie, das Mensch-Maschine-Diagramm mit Python zu lösen
Versuchen Sie, das Problem des Handlungsreisenden mit einem genetischen Algorithmus zu lösen (Theorie)
Versuchen Sie, das Programmier-Herausforderungsbuch mit Python3 zu lösen
[Python] Versuchen Sie, die coole Antwort auf das FizzBuzz-Problem zu lesen
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Versuchen Sie, das Problem des Handlungsreisenden mit einem genetischen Algorithmus (Python-Code) zu lösen.
Versuchen Sie, das Problem des Handlungsreisenden mit einem genetischen Algorithmus zu lösen (Ausführungsergebnis)
So lösen Sie das Problem beim Verpacken des Behälters
Lösen Sie das Problem des Handlungsreisenden mit OR-Tools
Ich wollte das ABC164 A ~ D-Problem mit Python lösen
Versuchen Sie, den kürzesten Weg mit Python + NetworkX + Social Data zu lösen
Versuchen Sie, das Problem der Funktionsminimierung mithilfe der Partikelgruppenoptimierung zu lösen
Das 16. Offline-Echtzeit-Schreiben eines Referenzproblems zur Lösung mit Python
So testen Sie den Friends-of-Friends-Algorithmus mit pyfof
Das 19. Offline-Echtzeit-Schreiben eines Referenzproblems zur Lösung mit Python
Versuchen Sie, ein festgelegtes Problem der High-School-Mathematik mit Python zu lösen
Versuchen Sie, ein FizzBuzz-Problem mit einem Shell-Programm zu erstellen
Versuchen Sie, die Probleme des "Matrix-Programmierers" zu lösen (Kapitel 1).
Stellen wir uns den Raum mit Raspeltorte vor, Teil 1
Ich habe versucht, Soma Cube mit Python zu lösen
Versuchen Sie, den Inhalt von Word mit Golang zu erhalten
[Neo4J] ④ Versuchen Sie, die Diagrammstruktur mit Cypher zu handhaben
Versuchen Sie, den Boden durch Rekursion herauszufordern
Lösen Sie das Monty Hall-Problem
Ich habe versucht, das Problem der Optimierung der Platzierung virtueller Maschinen (einfache Version) mit blueqat zu lösen
Beim 15. Offline-Echtzeitversuch habe ich versucht, das Problem des Schreibens mit Python zu lösen
CNN mit Keras Versuchen Sie es mit dem Bild, das Sie aufgenommen haben
Versuchen Sie, mit dem Uprobe zu spielen, der Systemtap direkt unterstützt
Ich wollte den Panasonic Programming Contest 2020 mit Python lösen
Suche nach einer Lösung für das N-Queen-Problem mit einem genetischen Algorithmus (2)
Ich habe versucht, das Problem der Kombinationsoptimierung mit Qiskit zu lösen
Versuchen Sie, die Probleme / Probleme des "Matrix-Programmierers" zu lösen (Kapitel 0-Funktion)
Versuchen Sie, den Betrieb von Netzwerkgeräten mit Python zu automatisieren
Eine Geschichte über den Umgang mit dem CORS-Problem
Das Problem wird je nach Formulierungsmethode leichter zu lösen
Versuchen Sie, die verstümmelten Zeichen im angehängten Dateinamen mit Python zu entschlüsseln
Suche nach einer Lösung für das N-Queen-Problem mit einem genetischen Algorithmus (1)
Versuchen Sie, Merkmale von Sensordaten mit CNN zu extrahieren
Ich habe versucht, das Problem von F02 zu lösen, wie man mit Python offline in Echtzeit schreibt
Versuchen Sie, Facebook mit Python zu betreiben
Versuchen Sie, sich mit ONNX Runtime zu profilieren
Versuchen Sie, das Thema Pelican vorzustellen
Anfänger RNN (LSTM) | Versuchen Sie es mit Keras
Probieren Sie Cython in kürzester Zeit aus
Versuchen Sie, das Bild mit opencv2 zu verwischen
Versuchen Sie, Audio mit M5 STACK auszugeben
Der schnellste Weg, EfficientNet auszuprobieren
Der einfachste Weg, PyQtGraph auszuprobieren
Ich habe versucht, die Anfängerausgabe des Ameisenbuchs mit Python zu lösen
Lösung des Anfangswertproblems gewöhnlicher Differentialgleichungen mit JModelica
Lösen Sie das Python-Rucksackproblem mit der Branch-and-Bound-Methode
Ich habe versucht, das Schichtplanungsproblem mit verschiedenen Methoden zu lösen
Vom "Zeichnen" zum "Schreiben" des Konfigurationsdiagramms: Zeichnen Sie das AWS-Konfigurationsdiagramm mit Diagrammen
Lösen Sie Teilsummenprobleme mit der vollständigen Suche in Python