tf-Model mit Beispiel füttern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Pedossi
User
Beiträge: 11
Registriert: Donnerstag 15. März 2018, 20:54

Guten Tag zusammen!

Ich habe abermals eine Frage. Aber hier erstmal der Code:

Code: Alles auswählen

import cv2
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import os

CATEGORIES = ["null", "eins","zwei","drei","vier","fuenf","sechs","sieben","acht","neun"]



def prepare(filepath):
    IMG_SIZE = 100
    if os.path.isfile(filepath):
        print(filepath)
        img_array = cv2.imread(filepath, cv2.IMREAD_GRAYSCALE)
        new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE))

        return new_array.reshape(-1, IMG_SIZE, IMG_SIZE, 1)
    else:
        print("no")


model = tf.keras.models.load_model("OwnNumbers.model")
prediction = model.predict([prepare("Zwei.png")])
print(CATEGORIES[int(prediction[0][0])])
Darauf folgt diese Fehlermeldung:

Code: Alles auswählen

  File "C:/Users/Passi/PycharmProjects/Deep/Deep.py", line 23, in <module>
    prediction = model.predict([prepare("Zwei.png")])
  File "C:\Users\Passi\PycharmProjects\Deep\venv\lib\site-packages\tensorflow\python\keras\engine\training.py", line 1096, in predict
    x, check_steps=True, steps_name='steps', steps=steps)
  File "C:\Users\Passi\PycharmProjects\Deep\venv\lib\site-packages\tensorflow\python\keras\engine\training.py", line 2289, in _standardize_user_data
    self._set_inputs(cast_inputs)
  File "C:\Users\Passi\PycharmProjects\Deep\venv\lib\site-packages\tensorflow\python\training\checkpointable\base.py", line 442, in _method_wrapper
    method(self, *args, **kwargs)
  File "C:\Users\Passi\PycharmProjects\Deep\venv\lib\site-packages\tensorflow\python\keras\engine\training.py", line 2503, in _set_inputs
    input_shape = (None,) + tuple(inputs.shape[1:])
AttributeError: 'list' object has no attribute 'shape'
Das Model wurde von meinen eigenen Bildern von Zahlen gefüttert, wobei beim Einlesen auch alles funktioniert hat. Jedoch bekomme ich immer diese Fehlermeldung. Gerade die letzte Zeile verwirrt mich, dass ein "list" Objekt kein Attribut "shape" haben kann, da ich eigentlich mit einem array arbeite. Ich habe es auch schon mit new_array = np.array(new_array) probiert, das funktioniert aber, wie erwartet, genau so wenig. Erst dachte ich, dass der Path falsch ist, da bei input_shape "None" steht, jedoch hab ich dieses mit os kontrolliert und daran liegt es nicht.
Hätte jemand eine andere Idee und/oder eine Webseite, wo ich Infos dazu finde? Habe schon verzweifelt gesucht. Vielen Dank schon mal im Vorraus :-)

Mfg Pedossi
__deets__
User
Beiträge: 14530
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was ist

[prepare("Zwei.png")]

für ein Objekt deiner Meinung nach?
Pedossi
User
Beiträge: 11
Registriert: Donnerstag 15. März 2018, 20:54

__deets__ hat geschrieben: Sonntag 7. April 2019, 20:28 Was ist

[prepare("Zwei.png")]

für ein Objekt deiner Meinung nach?
[prepare("Zwei.png")] führt zu einem png Bild von einer Handgeschriebenen 2. Und das model soll jetzt erkennen, dass dies auch eine zwei ist.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Ja, aber warum denkst Du, dass Du das in eine Liste packen mußt?
Pedossi
User
Beiträge: 11
Registriert: Donnerstag 15. März 2018, 20:54

Sirius3 hat geschrieben: Montag 8. April 2019, 18:54 Ja, aber warum denkst Du, dass Du das in eine Liste packen mußt?
Ich dachte, dardurch wird die "Prediction" genauer, deswegen wandelt man das Foto auch in Graustufen um, da das Ergebnis dann noch genauer ist. Sehe ich da was falsch? Übrigens beim Trainieren des models habe ich dies ebenfalls gemacht, also Bilder in Graustufen umgewandelt und diese dann zu Zahlen.
Benutzeravatar
__blackjack__
User
Beiträge: 13087
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pedossi: Darum geht es doch gar nicht. Das machst Du ja in `prepare()`. Die frage ist warum Du das Ergebnis von `prepare()`, also das Array, noch mal als einziges Element in eine zusätzliche Liste verpackst.

Das `prepare()` im Falle das die Datei nicht existiert 'no' aus- und `None` zurück gibt, ist auch ungünstig. Dann muss der Aufrufer ja immer testen ob er `None` oder ein Array zurück bekommt. Da das bei Dir nicht gemacht wird, also sowieso in einen Folgefehler mit Ausnahme laufen wird, ist diese ganze Fehlerbehandlung in `prepare()` für die Katz und macht es bloss schwieriger den Grund für den Folgefehler zu erkennen. `cv2.imread()` wird sich schon beschweren wenn das kein Pfad zu einer sinnvollen Datei war.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Was mir gerade noch so auffällt:

Code: Alles auswählen

def prepare(filepath):
    IMG_SIZE = 100
Das ist die row*column Größe auf die du dein eigenes Bild verkleinerst/vergrößerst.
Möchtest du denn dieses Bild in dem MNIST Modell prüfen oder hast du noch ein anderes Model welches du mit eigenen Bildern trainiert hast?
Wenn ersteres dann muss dein Bild auch die ursprüngliche Dimension 28*28 haben, ansonsten gibt es da einen Fehler.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Antworten