Neuronales Netzwerk nutzen?

3 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

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.


SpeedyGo55 
Beitragsersteller
 09.04.2022, 16:37

Also das mit print(train_data_name.shape) funktioniert nicht

0
R4c1ngCube  09.04.2022, 16:47
@SpeedyGo55

Hast du denn train_data_name auch durch den Namen deiner trainingsdaten ausgetauscht?

Ah hab den 2. Kommentar erst jetzt gesehen

1
SpeedyGo55 
Beitragsersteller
 09.04.2022, 20:17
@R4c1ngCube

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?

0
R4c1ngCube  09.04.2022, 23:38
@SpeedyGo55

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?

0
SpeedyGo55 
Beitragsersteller
 10.04.2022, 10:15
@R4c1ngCube

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

0
SpeedyGo55 
Beitragsersteller
 10.04.2022, 10:17
@SpeedyGo55

Aber wenn du sagst diese werte stehen für eine 6 funktioniert das Netz wenigstens schon.

0
R4c1ngCube  10.04.2022, 16:41
@SpeedyGo55

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

0
SpeedyGo55 
Beitragsersteller
 10.04.2022, 17:07
@R4c1ngCube

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.

0
R4c1ngCube  10.04.2022, 17:19
@SpeedyGo55

Okay. Im Zweifelsfall ginge es bei Keras so:

img = load_img('bondi_beach.jpg', grayscale=True)
img_array = img_to_array(img)
1
SpeedyGo55 
Beitragsersteller
 09.04.2022, 17:47

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?

0

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.


SpeedyGo55 
Beitragsersteller
 09.04.2022, 16:20

Kannst du mir helfen wie ich das ganze visualisiere?

0