Seite 1 von 1

Tensorflow/Keras Zahlen trainieren

Verfasst: Samstag 6. April 2019, 17:03
von Pedossi
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

Re: Tensorflow/Keras Zahlen trainieren

Verfasst: Sonntag 7. April 2019, 08:47
von ThomasL
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

Re: Tensorflow/Keras Zahlen trainieren

Verfasst: Sonntag 7. April 2019, 12:46
von Pedossi
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