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.
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.
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)
Es ist eine faire Konvergenzrate. (Etwas überpasst?)
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.
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)
Sehen wir uns die Genauigkeitsrate des Modells an.
evaluate = np.array(answer == output)
print (np.count_nonzero(evaluate == True) / 100)
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)