{"id":1768,"date":"2018-02-04T14:56:25","date_gmt":"2018-02-04T13:56:25","guid":{"rendered":"http:\/\/dressler-hassloch.de\/?p=1768"},"modified":"2018-02-04T14:56:25","modified_gmt":"2018-02-04T13:56:25","slug":"mein-erstes-neurales-netzwerk-in-python","status":"publish","type":"post","link":"https:\/\/dressler-hassloch.de\/?p=1768","title":{"rendered":"Mein erstes neurales Netzwerk in Python"},"content":{"rendered":"<p>Das Themengebiet \u201eK\u00fcnstliche Intelligenz\u201c (KI) war f\u00fcr mich ein total unbekanntes Gebiet, aber die Neugier l\u00e4sst einen nicht ruhen. Und dann kam noch das Stichwort \u201eNeuronales Netz\u201c hinzu\u2026<\/p>\n<p>Das Suchen im Internet erbrachte viel (f\u00fcr mich recht unverst\u00e4ndliche) Theorie, aber auch einen Hinweis auf das Buch \u201eNeuronale Netze selbst programmieren\u201c von Tariq Rashid. Das Buch baut sich um ein sch\u00f6nes und verst\u00e4ndliches Beispiel auf. Handgeschriebene Ziffern sollen \u201etrainiert\u201c und anschlie\u00dfend richtig erkannt werden. Die Ziffern liegen als S\/W-Bilder im Format 28*28 Pixel mit Grauwerten vor. Und es gibt eine \u00f6ffentlich zug\u00e4ngliche Datenbank mit 60.000 dieser Bilder zum Trainieren und 10.000 Bilder zum Testen.<\/p>\n<p><strong>Der Hinweis auf Python und auf den Raspberry gaben dann den Ausschlag: Das probiere ich aus!<\/strong><\/p>\n<p>Die Theorie war einfach: Neuronen sind kleine programmierbare Rechner, die ihre analogen Eingangssignale mit einfachen Regeln wie Eingangsgewichtung, Summierung, Ausgabe-Begrenzung (z.Bsp. mit der Sigmoid-Funktion) in ein analoges Ausgangssignal \u00fcbertragen. Die Gewichtungsregeln werden in Matrizen gespeichert. Dann kann man die Neuronen recht bequem mit den Mitteln der Matrizenmultiplikation zum Arbeiten bringen.<\/p>\n<p>Die Anzahl der analogen Eingangssignale ist meist vorgegeben, die Anzahl der Ausgangssignale ergibt sich meist aus der erhofften Antwort. Die optimale Anzahl der Neuronen in der verdeckten (hidden) Mittelschicht probiert man aus. Jedes Neuron der mittleren Schicht ist mit jedem Eingangssignal verbunden, die Gewichtung der Signale ist der Schl\u00fcssel zu einem guten Gesamtergebnis. Es gibt sicherlich ausgefeiltere Algorithmen zur Signalbearbeitung, aber der im Buch vorgestellte Algorithmus ist leicht umsetzbar und zeigt auch Wirkung.<\/p>\n<p>Die Gewichtungs-Matrizen der \u201eMittelschicht\u201c und der Ausgabeschicht f\u00fcllt man zu Beginn mit Zufallswerten, am besten Werte zwischen Null und Eins. Die Testdaten erzeugen dann \u00fcber die Zwischenschicht Signale auf den Ausg\u00e4ngen, diese vergleicht man mit den bekannten Werten der Lerndaten und ver\u00e4ndert je nach Fehler r\u00fcckwirkend (Backpropagation) die Gewichtungsmatrix der Ausgabeschicht und die Gewichtungsmatrix der (unbekannten) Mittelschicht.<\/p>\n<p>Das Python-Programm fand sich in GITHUB und konnte recht einfach in meinen Raspberry und dessen Python 3 \u00fcbertragen werden. Der im Buch vorgeschlagene Algorithmus arbeitet. Das Programm liegt bei mir im Sourcecode (weniger als 200 Zeilen) auf dem Raspberry und auch auf dem Windows-PC und ich kann an einigen Stellschrauben drehen. Mehr wollte ich eigentlich nicht.<\/p>\n<p>Interessant: Die eingesetzten Parameter sagen eigentlich nichts \u00fcber das Problem aus und dennoch gibt es eine Erkennungsrate von \u00fcber 97% bei Ausnutzung des vollen Datensatzes. Allerdings ist dann mein Raspberry fast 2 Stunden besch\u00e4ftigt.<\/p>\n<p>Dann habe ich das Beispiel umge\u00e4ndert auf 3*3 kleine unterschiedlich graue Quadrate, in denen das Programm Muster erkennen soll. Der Algorithmus f\u00fcr das neuronale Netz aus dem Beispiel &#8220;Ziffernerkennung&#8221; wurde nicht abge\u00e4ndert, nur an den vorhandenen Parametern wurde gedreht.<\/p>\n<p>Jetzt kann ich auch den Input gezielt ver\u00e4ndern. Nat\u00fcrlich verrate ich dem Lernalgorithmus nicht das von mir \u201eberechnete\u201c Muster. Meine Kontrolle ist einfach: Steigt die Erkennungsrate deutlich \u00fcber die zuf\u00e4llige Erkennungsrate (die ohne Lernen), so hat sich ein Lerneffekt eingestellt und das neuronale Lernen hat funktioniert. Eine ypische Frage: Wo ist das hellste Pl\u00e4ttchen? Aber diese genaue Frage kennt ja das Programm nicht. Es hatte nur viele, viele Beispiele zum Trainieren.<\/p>\n<p>&nbsp;<\/p>\n<p>Eine gute Darstellung dieser Techniken findet man unter \u201eK\u00fcnstliches neuronales Netz\u201c in Wikipedia. YouTube bietet Lernvideos zu den Stichworten \u201eneural networks\u201c an.<\/p>\n<p>Buch \u201eNeuronale Netze selbst programmieren\u201c von Tariq Rashid, O\u2019Reilly, 2017<\/p>\n<p>Python-Code (mit Daten): https:\/\/github.com\/makeyourownneuralnetwork\/<\/p>\n<p>Testdaten: https:\/\/www.kaggle.com<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Das Themengebiet \u201eK\u00fcnstliche Intelligenz\u201c (KI) war f\u00fcr mich ein total unbekanntes Gebiet, aber die Neugier l\u00e4sst einen nicht ruhen. Und dann kam noch das Stichwort \u201eNeuronales Netz\u201c hinzu\u2026 Das Suchen im Internet erbrachte viel (f\u00fcr mich recht unverst\u00e4ndliche) Theorie, aber auch einen Hinweis auf das Buch \u201eNeuronale Netze selbst programmieren\u201c von Tariq Rashid. Das Buch [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[11],"tags":[],"_links":{"self":[{"href":"https:\/\/dressler-hassloch.de\/index.php?rest_route=\/wp\/v2\/posts\/1768"}],"collection":[{"href":"https:\/\/dressler-hassloch.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dressler-hassloch.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dressler-hassloch.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dressler-hassloch.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1768"}],"version-history":[{"count":3,"href":"https:\/\/dressler-hassloch.de\/index.php?rest_route=\/wp\/v2\/posts\/1768\/revisions"}],"predecessor-version":[{"id":1771,"href":"https:\/\/dressler-hassloch.de\/index.php?rest_route=\/wp\/v2\/posts\/1768\/revisions\/1771"}],"wp:attachment":[{"href":"https:\/\/dressler-hassloch.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1768"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dressler-hassloch.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1768"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dressler-hassloch.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1768"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}