Tensorflow/Keras Zahlen trainieren

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 hatte mir vorgenommen, mich mit Tensorflow zu beschäftigen und bin nach kurzer Zeit auf ein Thema für Einsteiger gestoßen.

Code: Alles auswählen

mnist = tf.keras.datasets.mnist
(x_train,y_train),(x_test,y_test) = mnist.load_data()
x_train = tf.keras.utils.normalize(x_train,axis=1)
x_test = tf.keras.utils.normalize(x_test,axis=1)

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(10, activation=tf.nn.softmax))

model.compile(optimizer="adam",loss="sparse_categorical_crossentropy",metrics=["accuracy"])

model.fit(x_train,y_train,epochs=5)
model.save("Numbers.model")
Dieses Programm ist nicht mein eigenes. Es nimmt Daten von der mnist und analysiert diese um später an Bildern zu erkennen welche Zahl das ist. Nun wollte ich probieren, dass dieses Programm Bilder von meinen Zahlen analysiert und später auch welche erkennen zu können. Also sozusagen diese Zeile mit eigenen Daten ersetzen:

Code: Alles auswählen

(x_train,y_train),(x_test,y_test) = mnist.load_data()
Bis jetzt habe ich das hier:

Code: Alles auswählen

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
image_dir = os.path.join(BASE_DIR, "Zahlen")

y_train =[]
x_train = []
for root, dirs, files in os.walk(image_dir):
    for file in files:
        if file.endswith("png") or file.endswith("jpg"):
            path = os.path.join(root,file)
            label = os.path.basename(root)
            pil_image = Image.open(path).convert("L")
            image_array = np.array(pil_image,"uint8")
            x_train.append(image_array)
            y_train.append(label)
            x_train = tf.keras.utils.normalize(x_train, axis=1)
Dies funktioniert allerdings nicht wegen dem "append". Außerdem scheitert es an dem "Normalize" Schritt, da ein Dimensionsfehler auftritt.
Ich bin momentan schon am verzweifeln, da ich nichts bei Google dazu gefunden habe und auch in keinem Forum etwas stand, vll habe ich auch einfach nur falsch gesucht.

Wenn jemand von euch mir Tipps geben könnte, wie ich dies verbessern kann bzw. zum laufen bringen kann wäre ich euch sehr dankbar. Wenn ihr vielleicht auch Links dazu habt, wo so etwas erklärt hat würde ich mich auch über diese freuen.

Mfg Pedossi
Benutzeravatar
ThomasL
User
Beiträge: 1378
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Moin Pedossi,

der MNIST Datensatz besteht aus 60000 Trainings- und 10000 Testbildern im Format 28x28 Byte (uint8) als 2D numpy.ndarray
sowie die Labels als 1D Arrays mit den Werten von 0 bis 9.

Code: Alles auswählen

mnist = tf.keras.datasets.mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()
print(X_train.shape, y_train.shape)
print(X_test.shape, y_test.shape)
print(type(X_train), X_train.dtype)
'''(60000, 28, 28) (60000,)
(10000, 28, 28) (10000,)
<class 'numpy.ndarray'> uint8'''
Wenn du also selber eigene Bilder verwenden willst, musst du die nach dem Einlesen alle auf ein und das selbe Format bringen,
an deine Liste anhängen und dann diese Liste in ein numpy.ndarray umwandeln. ( X_train = np.array(X_train) )
Um aber dann trainieren zu können, benötigst du für jedes Bild auch ein korrespondierendes Label, d.h. die Liste y_train
Last but not least dann einen Testdatensatz, um dein Modell zu überprüfen.

Eventuell ist dieses Tutorial hilfreich: https://www.youtube.com/watch?v=j-3vuBynnOE
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
Pedossi
User
Beiträge: 11
Registriert: Donnerstag 15. März 2018, 20:54

ThomasL hat geschrieben: Sonntag 7. April 2019, 08:47 Moin Pedossi,

der MNIST Datensatz besteht aus 60000 Trainings- und 10000 Testbildern im Format 28x28 Byte (uint8) als 2D numpy.ndarray
sowie die Labels als 1D Arrays mit den Werten von 0 bis 9.

Code: Alles auswählen

mnist = tf.keras.datasets.mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()
print(X_train.shape, y_train.shape)
print(X_test.shape, y_test.shape)
print(type(X_train), X_train.dtype)
'''(60000, 28, 28) (60000,)
(10000, 28, 28) (10000,)
<class 'numpy.ndarray'> uint8'''
Wenn du also selber eigene Bilder verwenden willst, musst du die nach dem Einlesen alle auf ein und das selbe Format bringen,
an deine Liste anhängen und dann diese Liste in ein numpy.ndarray umwandeln. ( X_train = np.array(X_train) )
Um aber dann trainieren zu können, benötigst du für jedes Bild auch ein korrespondierendes Label, d.h. die Liste y_train
Last but not least dann einen Testdatensatz, um dein Modell zu überprüfen.

Eventuell ist dieses Tutorial hilfreich: https://www.youtube.com/watch?v=j-3vuBynnOE
Hallo Thomas!

Vielen Dank für deine schnelle und hilfreiche Antwort. Es hat dadurch alles super geklappt und der Link hat mir zusätzlich super weitergeholfen. Danke sehr!

Mfg Pedossi
Antworten