[PYTHON] Erstellen Sie eine Web-App, die Zahlen mit einem neuronalen Netzwerk erkennt

TL;DR Sie können es auf dieser Seite versuchen. http://handwritten-classifier.app.ginrou.com/ Der Quellcode ist hier. https://github.com/ginrou/handwritten_classifier

スクリーンショット 2014-12-01 23.18.43.png Es ist so.

Gesamtzusammensetzung

Es ist eine Anwendung, die das Eingabebild auf ein neuronales Netzwerk anwendet und ausgibt, welche Nummer eingegeben wurde. Der Quellcode basiert darauf. handgeschriebener_Klassifizierer

Dies kann hilfreich sein für diejenigen, die den Quellcode des neuronalen Netzwerks anzeigen und ihn schnell über eine Webanwendung verwenden möchten.

Implementierung eines neuronalen Netzwerks

Es ist ein allgemeines 3-Schicht-Perzeptron, das aus einer Eingangsschicht-verborgenen Schicht-Ausgangsschicht besteht. Wir beschäftigen uns nicht mit tiefem Lernen. Die Sigmoidfunktion wird als Aktivierungsfunktion verwendet.

Das Folgende ist hilfreich für Details des Algorithmus.

Der Umriss ist wie folgt. neuralnetwork.png

Von (0,0) bis (W, H) des Bildes wird ein eindimensionaler Vektor gebildet, und ein konstanter Term wird hinzugefügt, um das Eingangssignal $ {\ bf x} $ zu erzeugen.

Multiplizieren Sie $ {\ bf x} $ mit dem Gewicht $ w ^ 1_ {i, j} $, um die Eingabe $ z_ {in, i} $ in der verborgenen Ebene zu erhalten. Die Ausgabe der verborgenen Schicht wird erhalten, indem diese mit der Sigmoidfunktion multipliziert wird.

z_{in,i} = \sum_{j=0}^{N} w^1_{i,j} x_j \\
z_{out,i} = sigmoid(z_{in,i})

Darüber hinaus wird die Ausgabe $ z_ {out, i} $ der verborgenen Schicht multipliziert mit dem Gewicht $ w ^ 2_ {i, j} $ zur Eingabe $ y_ {in, i} $ in die Ausgabeebene, und die Sigmoidfunktion wird angewendet. Die endgültige Ausgabe ist $ y_ {out, i} $.

y_{in,i} = \sum_{j=0}^{N} w^2_{i,j} z_{out,j} \\
y_{out,i} = sigmoid(y_{in,i})

Die Ausgabe {\ bf y} ist ein 10-dimensionaler Vektor. Der mit dem größten Ausgabewert ist das Schätzergebnis.

Neuronale Netzwerkvariablen haben Gewichte $ {\ bf w ^ 1}, {\ bf w ^ 2} $. Lerne seinen Wert. Es ist wie folgt zusammengefasst. Das Schreiben / Lesen der gelernten Parameter wird ebenfalls hinzugefügt.

https://github.com/ginrou/handwritten_classifier/blob/master/NeuralNetwork.py

NeuralNetwork.py




#!/usr/bin/env python

from math import exp
import numpy

def sigmoid(x):
    return 1.0 / (1.0 + exp(-x))

def sigmoid_a(array):
    return numpy.vectorize(sigmoid)(array)

class NeuralNetwork:
    def __init__(self, in_size, hidden_size, out_size):
        self.hidden_weight = 0.1 * (numpy.random.random_sample((hidden_size, in_size+1)) - 0.5)
        self.output_weight = 0.1 * (numpy.random.random_sample((out_size, hidden_size+1)) - 0.5)

    def fit(self, x, t, update_ratio = 0.1):
        z, y = self.fire(x)
        dy = ( y - t ) *y * ( 1 - y )
        dz = (self.output_weight.T.dot(dy))[1:] * z * ( 1- z )

        output_input = numpy.r_[ numpy.array([1]), z ]
        self.output_weight -= update_ratio * dy.reshape(-1,1) * output_input

        hidden_input = numpy.r_[ numpy.array([1]), x ]
        self.hidden_weight -= update_ratio * dz.reshape(-1,1) * hidden_input

    def fire(self, x):
        z = sigmoid_a(self.hidden_weight.dot(numpy.r_[ numpy.array([1]), x ]))
        y = sigmoid_a(self.output_weight.dot(numpy.r_[ numpy.array([1]), z ]))
        return (z, y)

    def predicate(self, x):
        z, y = self.fire(x)
        return numpy.array(y).argmax()

    def save(self, filepath):
        numpy.savez(filepath, hidden = self.hidden_weight, output = self.output_weight)

    def load(self, filepath):
        npzfiles = numpy.load(filepath)
        self.hidden_weight = npzfiles['hidden']
        self.output_weight = npzfiles['output']

Lernen

Wir werden dieses neuronale Netzwerk trainieren.

Für den Datensatz habe ich MNIST-Datensatz verwendet. Einige der http://deeplearning.net/tutorial/gettingstarted.html sind im Pickle-Format, da das Parsen des Rohdatensatzes mühsam ist. Also habe ich das benutzt.

Da die Größe des Eingabebilds dieses Datensatzes 28 x 28 beträgt, beträgt die Größe der Eingabeebene 784 Dimensionen, die Ausgabeebene erkennt Zahlen von 0 bis 9, also 10 Dimensionen, und die Zwischenebene ist entsprechend auf 300 Dimensionen eingestellt.

Führen Sie es mit handwritten_classifier.py aus, das in Repository enthalten ist. Ich kann es schaffen

Es dauerte ungefähr 2-3 Minuten, um 50.000 Punkte des MNIST-Datensatzes zu trainieren, und die Genauigkeit betrug 92,52%.

Verwendung aus einer Web-App

Verwenden Sie das Nummernerkennungssystem mit diesem neuronalen Netzwerk aus dem Browser. Die Idee ist

Es ist ein Mechanismus. handwritten_classifier verwendet Flask, um ein Web-Frontend zu erstellen.

So können Sie mit JS den Helligkeitswert des Bildes von der Leinwand abrufen und senden.

var estimate = function(context) {
   var img_buf = getImageBuffer(context, 28, 28);
    $.ajax({
        type:"post",
        url:"/estimate",
        data: JSON.stringify({"input": img_buf}),
        contentType: 'application/json',
        success: function(result) {
            $("#estimated").text("Estimated = " + result.estimated);
        }
    });
};

var getImageBuffer = function(context, width, height) {
    var tmpCanvas = $('<canvas>').get(0);
    tmpCanvas.width = width;
    tmpCanvas.height = height;
    var tmpContext = tmpCanvas.getContext('2d');
    tmpContext.drawImage(context.canvas, 0, 0, width, height);
    var image = tmpContext.getImageData(0,0,width,height);
    var buffer = []
    for( var i = 0; i < image.data.length; i += 4 ) {
        var sum = image.data[i+0] + image.data[i+1] + image.data[i+2] + image.data[i+3];
        buffer.push(Math.min(sum,255));
    }
    return buffer;
};

Wenn die Größe der Leinwand 28 x 28 beträgt, ist sie zu klein. Zeichnen Sie daher im Browser und auf eine große Leinwand Dann schrumpfen.

Der gesendete JSON ist

{"input":[0,0,255,255,,,,255]}

So was.

Das bekommen Sie bei Flask

@app.route("/estimate", methods = ["POST"])
def estimate():
    try:
        x = numpy.array(request.json["input"]) / 255.0
        y = int(nn.predicate(x))
        return jsonify({"estimated":y})
    except Exception as e:
        print(e)
        return jsonify({"error":e})

Im vorherigen Repository

$ python app.py

Sie können es unter http: // localhost: 5000 versuchen.

Docker Weil es Docker mit Kleber unterstützt https://registry.hub.docker.com/u/ginrou/handwritten-classifier/ Kann mit verwendet werden. Wenn Sie es schnell ausprobieren möchten, können Sie es für Heroku bereitstellen.

Verschiedene Gefühle

Das Schreiben in Python macht es so kurz! Webanwendung, unerwartet schlechte Erkennungsgenauigkeit

Recommended Posts

Erstellen Sie eine Web-App, die Zahlen mit einem neuronalen Netzwerk erkennt
Erstellen Sie eine Webanwendung mit Django
Tornado - Erstellen wir eine Web-API, die JSON problemlos mit JSON zurückgibt
Erstellen Sie eine Web-API, die Bilder mit Django liefern kann
Komponieren Sie mit einem neuronalen Netzwerk! Führen Sie Magenta aus
[Python] Eine schnelle Webanwendung mit Bottle!
Erstellen Sie eine einfache Web-App mit Flasche
Führen Sie eine Python-Webanwendung mit Docker aus
Erstellen Sie einen Webdienst mit Docker + Flask
Ich habe eine WEB-Bewerbung bei Django gemacht
Erstellen Sie eine Web-App, die mit Plotly Dash einfach visualisiert werden kann
Experimentieren Sie mit verschiedenen Optimierungsalgorithmen im neuronalen Netz
Erstellen Sie eine Seite, die unbegrenzt mit Python geladen wird
Erstellen Sie mit Django ein Dashboard für Netzwerkgeräte!
Erstellen Sie mit Django eine Hallo-Welt-Anwendung mit nur einer Datei
Erstellen Sie einfach eine Python-Konsolenanwendung mit Click
[kotlin] Erstellen Sie eine App, die Fotos erkennt, die mit einer Kamera auf Android aufgenommen wurden
Die Geschichte der Erstellung einer Webanwendung, die umfangreiche Lesungen mit Django aufzeichnet
Ich möchte eine WEB-Anwendung mit den Daten von League of Legends ① erstellen
Erstellen Sie eine App, die Bilder erkennt, indem Sie auf Android (PyTorch Mobile) Zahlen auf den Bildschirm schreiben [CNN-Netzwerkerstellung]
(Hinweis) Eine Webanwendung, die TensorFlow verwendet, um empfohlene Songnamen abzuleiten. [Erstellen Sie eine Ausführungsumgebung mit Docker-Compose.]
Trainieren Sie MNIST-Daten mit PyTorch mithilfe eines neuronalen Netzwerks
Code-Server-Online-Umgebung (2) Erstellen Sie mit Boto3 ein virtuelles Netzwerk
Erstellen Sie einen Chatbot, der die kostenlose Eingabe mit Word2Vec unterstützt
Starten Sie mit Docker eine Python-Webanwendung auf Nginx + Gunicorn
Erstellt eine Web-App, die IT-Ereignisinformationen mit Vue und Flask abbildet
Implementieren Sie ein dreischichtiges neuronales Netzwerk
Erstellen Sie eine PythonBox, die nach der PEPPER-Eingabe mit Random ausgegeben wird
Versuchen Sie, ein Deep Learning / Neuronales Netzwerk mit Scratch aufzubauen
Erstellen Sie eine WEB-Überwachungskamera mit Raspberry Pi und OpenCV
Neuronales Netzwerk mit Python (Scikit-Learn)
3. Normalverteilung mit neuronalem Netz!
Erstellen wir ein Skript, das sich bei Ideone.com in Python registriert.
Erstellen Sie ein Lebensspiel, das manuell mit tkinter aktualisiert wird
Entwicklung von Webanwendungen mit Flask
Erstellen Sie eine Homepage mit Django
Erstellen Sie eine Webanwendung mit Django
Neuronales Netz beginnend mit Chainer
4. Kreisparameter mit einem neuronalen Netzwerk!
Webanwendung mit Python + Flask ② ③
Erstellen Sie ein Verzeichnis mit Python
Aufbau eines neuronalen Netzwerks, das XOR durch Z3 reproduziert
[Golang] Ein Programm, das die Runde mit Zufallszahlen bestimmt
Ich habe einen neuronalen Netzwerkgenerator erstellt, der auf FPGA läuft
Webanwendung mit Python + Flask ④
Eine Geschichte, bei der es mir schwer gefallen ist, mit der ersten Webanwendung eine "App zu erstellen, die Bilder wie Gemälde konvertiert"
Beachten Sie, dass ich süchtig danach war, mit Pythons mysql.connector über eine Webanwendung auf die Datenbank zuzugreifen
Erstellen Sie mit pyenv unter Ubuntu 12.04 schnell eine Ausführungsumgebung für Python3.4 + Nginx + uWSGI + Flask-Webanwendungen
Erstellen Sie mit Selenium ein Programm, mit dem Sie Ihr Lieblingsbild erstellen können
Lassen Sie uns eine WEB-Anwendung für das Telefonbuch mit Flasche Teil 1 erstellen
Erstellen Sie mit Chalice eine flaschen- / flaschenähnliche Webanwendung auf AWS Lambda
[Python / Django] Erstellen Sie eine Web-API, die im JSON-Format antwortet
Entwicklungspraxis für Webanwendungen: Erstellen Sie mit Django eine Seite zum Erstellen von Schichten! (Schichterstellungsseite)
Lassen Sie uns eine WEB-Anwendung für das Telefonbuch mit Flasche Teil 2 erstellen
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
[LINE Messaging API] Erstellen Sie einen BOT, der eine Verbindung zu jemandem mit Python herstellt
Lassen Sie uns eine WEB-Anwendung für das Telefonbuch mit Flasche Teil 3 erstellen
Lassen Sie uns eine WEB-Anwendung für das Telefonbuch mit Flasche Teil 4 erstellen