Neuronales Netzwerk nutzen?
Ich habe mithilfe eines Tutorials ein Neuronales Netzwerk in Python gecodet. Dies läuft jedoch mit dem mnist Dataset von Keras. Wie kann ich wenn jetzt eigene Bilder von Handgeschriebenen Zahlen verarbeiten lassen? Also wie kann ich machen das ich ein Bild in denn Code Einfüge oder so und das davor Trainierte Neuronale Netzwerk versucht zu entziffern was ich für eine Zahl geschrieben habe?
3 Antworten
Du musst das Bild laden und in das Format bringen, welches dein Netz akzeptiert.
Das Format findest du heraus, indem du dir das Format der Inputdaten, die du dem Netz in .fit übergibst, ausgeben lässt. Das geht mit Hilfe von print(train_data_name.shape).
(Dabei gehe ich davon aus, dass deine Trainingsdaten ein numpy Array ist -> print(type(train_data_name)))
Dann suchst du dir eine beliebige Bibliothek aus, mit der man Bilder importieren kann.
Unter dem Link von Mathemaninoff wird gezeigt wie das direkt mit Keras geht.
Soweit ich weiß verwendet das mnist dataset grayscalebilder der Größe 28x28. Entsprechend möchtest du dein Bild auch als grayscale importieren und auf 28x28 skalieren.
Evtl musst du noch das Bild flatten also von 28x28 zu 1x784 konvertieren. Das siehst du an der shape die du oben ausgegeben hast.
Abändern kannst du die Form mit numpy.reshape. Wenn das nötig ist, wurde das aber bestimmt auch irgendwo im Tutorial gemacht.
Alles was du mit den Inputdaten gemacht hast, musst du glaube ich auch mit deinem Bild machen.
Am Ende verwendest du model_name.predict(image_array_name) um das Bild in dein Netz zu stecken.
Es kann sein, dass du eine Dimension zu deinem Bild hinzufügen musst, da predict einen Batch erwartet (einen, wie auch deine trainingsdaten einer sind).
zB. Wenn die Trainingsdaten vom shape, (60000, 28, 28) sind, dann müsstest du dein Bild von (28, 28) zu (1, 28, 28) umformen.
Am besten suchst du nach einem Tutorial, bei dem das inputshape gleich ist wie bei deinem Netz und folgst diesem.
Also das mit print(train_data_name.shape) funktioniert nicht
Hast du denn train_data_name auch durch den Namen deiner trainingsdaten ausgetauscht?
Ah hab den 2. Kommentar erst jetzt gesehen
Ich hab nun alles hinbekommen bekomme aber als Ergebnis:
[[9.54981427e-10 1.95079060e-13 2.04970092e-06 3.45072913e-05
8.88602427e-24 2.74788924e-02 9.61747289e-01 1.07275974e-02
9.66412790e-06 1.08546784e-13]
[3.99271033e-11 2.64864272e-14 2.11172075e-08 1.25412726e-07
1.19556493e-20 1.17681680e-04 9.99849439e-01 3.27392590e-05
5.35891900e-08 5.54030222e-16]
[1.82907964e-12 2.18770228e-12 2.80786888e-04 2.26105332e-01
6.51112859e-29 2.83274442e-01 4.29806551e-06 4.90331739e-01
3.44643968e-06 1.51119846e-11]]
Da ich aber ja eine von Hand geschrieben Nummer erkennen will würde ich gerne Wissen wie ich aus dem eine Zahl bekomme. Kannst du mir da helfen?
Also das Ergebnis, das ich erwartet hätte, wären 10 Werte, die für die Ziffern 0-9 angeben, wie sehr das Netz glaubt, dass es die jeweilige Ziffer ist. (Ich vermute, dass die Werte zwischen 0 und 1 liegen, das wäre üblich).
Erhalten hast du 3x10. Dazu komme ich gleich.
Der höchste Wert gibt sozusagen die Entscheidung vom Netz an.
Aus den ersten 10 Werten der erste Wert steht vermutlich für die Sicherheit für Ziffer 0. (Für was es tatsächlich steht hängt davon ab, wie die Bilder im dataset labels zugeordnet wurden.
Bei Mnist ist das wohl einfach die entsprechende Zahl zwischen 0 und 9. Ich vermute, dass Keras dann z.B. eine 3 interpretiert als alle Neuronen haben eine 0, außer die 4. Neurone. Das ist aber eine Vermutung. Ich müsste das nachlesen.
Das e steht für mal 10 hoch.
Also wäre dein erster Wert ungefähr 9.5 * 10^-10, das ist praktisch 0. Also ist dein Netz sich sehr sicher, dass es keine 0 ist. (Weil der Wert, der die Sicherheit für die 0 angibt sehr klein ist).
Der größte Wert ist der für die Ziffer 6.
-----
Allerdings hast du 3 mal 10 Werte erhalten.
Das spricht dafür, dass predict einen batch aus 3 Bildern erhalten hat. Hast du denn 3 Bilder importiert?
Ansonsten wäre ein typischer Fehler, dass du das Bild als rgb Bild statt als gray scale Bild importiert hast (weil ein rgb Bild das gleich shape hat wie ein Array von 3 Greyscalebildern.
Ich kann ohne weitere Informationen schwer beurteilen was das Problem ist.
Welches shape hat "image_array_name" wenn du es predict übergibst?
Ich muss nochmals schauen aber ich glaube ich habe dem predict ein 3, 28, 28 übergeben. Wie kann ich das auf 1, 28, 28 machen? Einfach image_array_name.reshape(28, 28)?
Aber wenn du sagst diese werte stehen für eine 6 funktioniert das Netz wenigstens schon.
Resp image_array_name.reshape(1, 28, 28)?
Von der Form (3, 28, 28) zu (1, 28, 28) kommt man nicht durch ein einfaches reshape (ohne Informationen zu verlieren)
Das eine Array hat ja 3*28^2 Felder, das ander nur 1*28^2 Felder.
Nochmal die Frage - hast du das Bild als grayscale oder als rgb Bild importiert?
Am einfachsten für mich wäre es vermutlich den Code zu sehen
Nunja. Ich habe das Bild in Paint.net gemacht und mit img_load() importiert. Ich könnte es glaube auch einfach im Paubt.net umwandeln und dann dieses Bild einfügen.
Schau ich mal. Kann gerade nicht an den Code
Okay. Im Zweifelsfall ginge es bei Keras so:
img = load_img('bondi_beach.jpg', grayscale=True)
img_array = img_to_array(img)
Ich habe selber noch nicht mit Keras gearbeitet.
Vielleicht hilft diese Seite:
https://machinelearningmastery.com/how-to-load-convert-and-save-images-with-the-keras-api/
Eventuell muss noch in einen Tensor umgewandelt werden und eine Dimension hinzugefügt werden, denn die Daten sind in der Regel in Batches und ein einzelnes Bild ist ein Batch der Größe 1.
Da die Trainingsdaten normalisiert sind, wird das Netzt auf nicht normalisierten Daten schlechter sein.
Naja, wie hast du dein neurales Netzwerk denn trainiert? Vermutlich mit Bildern die irgendwo in einem Ordner lagen.
Genauso machst du das jetzt auch: Bild im Programm laden, durch das neurale Netzwerk laufen lassen und das Ergebnis der Auswertung dann anzeigen lassen.
wenn ich .shape von dem array vom Bild mache bekomme ich (28, 28, 3). Aber ich benötige (none, 28, 28), Wie Bekomme ich das hin?