Problem, mit dem ich mit dem TensorFlow MNIST Zahlenerkennung versuche
Posted: 19 Aug 2025, 17:02
In meinem OpenCV -Projekt möchte ich eine Sudoku -Tabelle lesen, sie in einzelne Zellen teilen und die Zahlen erkennen. Der Rest ist hauptsächlich Sudoku -Lösung. Ich habe mich entschlossen, den MNIST -Datensatz zu verwenden, um das Modell zu trainieren. Aus einem Grund, warum ich nicht herausfinden konnte, erkennt das Programm immer die Ziffer falsch. Ich werde meinen Code unten weiter erklären.
Dies ist mein Bild vor der Verarbeitung und nach der Verarbeitung. 28x28:
Das Modell sagt mein Bild als 3 ständig vor. Ich kenne den Grund dafür nicht. />
size = 300
(ds_train, ds_test), ds_info = tfds.load(
'mnist',
split=['train', 'test'],
shuffle_files=True,
as_supervised=True,
with_info=True,
)
def resize_img(image, label):
return tf.image.resize(image, (size, size)), label
ds_train = ds_train.map(resize_img, num_parallel_calls=tf.data.AUTOTUNE)
ds_test = ds_test.map(resize_img, num_parallel_calls=tf.data.AUTOTUNE)
def normalize_img(image, label):
"""Normalizes images: `uint8` -> `float32`."""
return tf.cast(image, tf.float32) / 255., label
ds_train = ds_train.map(normalize_img, num_parallel_calls=tf.data.AUTOTUNE)
ds_train = ds_train.cache()
ds_train = ds_train.shuffle(ds_info.splits['train'].num_examples)
ds_train = ds_train.batch(128)
ds_train = ds_train.prefetch(tf.data.AUTOTUNE)
ds_test = ds_test.map(normalize_img, num_parallel_calls=tf.data.AUTOTUNE)
ds_test = ds_test.batch(128)
ds_test = ds_test.cache()
ds_test = ds_test.prefetch(tf.data.AUTOTUNE)
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(size, size, 1)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10)
])
model.compile(
optimizer=tf.keras.optimizers.legacy.Adam(0.001),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=[tf.keras.metrics.SparseCategoricalAccuracy()],
)
model.fit(
ds_train,
epochs=6,
validation_data=ds_test,
)
sample = cv.cvtColor(sample, cv.COLOR_BGR2GRAY)
sample = cv.resize(sample, (size, size))
view_image(sample)
sample = np.invert(np.array([sample]))
prediction = model.predict(sample)
print(np.argmax(prediction))
for class_index, prob in enumerate(prediction[0]):
print(f'Class {class_index}: Probability {prob}')
sample = np.invert(np.array([sample])).reshape((size, size, 1))
cv.imshow("test", sample)
cv.waitKey(0)
< /code>
Dies ist der Code, den ich geschrieben habe, um alle Bilder im 300x300 -Format zu verarbeiten. Natürlich ist es langsamer als der 28x28, aber ich dachte, dass es die Genauigkeit erhöhen würde. Leider hat es nichts geändert.
Code: Select all
(ds_train, ds_test), ds_info = tfds.load(
'mnist',
split=['train', 'test'],
shuffle_files=True,
as_supervised=True,
with_info=True,
)
def normalize_img(image, label):
"""Normalizes images: `uint8` -> `float32`."""
return tf.cast(image, tf.float32) / 255., label
ds_train = ds_train.map(normalize_img, num_parallel_calls=tf.data.AUTOTUNE)
ds_train = ds_train.cache()
ds_train = ds_train.shuffle(ds_info.splits['train'].num_examples)
ds_train = ds_train.batch(128)
ds_train = ds_train.prefetch(tf.data.AUTOTUNE)
ds_test = ds_test.map(normalize_img, num_parallel_calls=tf.data.AUTOTUNE)
ds_test = ds_test.batch(128)
ds_test = ds_test.cache()
ds_test = ds_test.prefetch(tf.data.AUTOTUNE)
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28, 1)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10)
])
model.compile(
optimizer=tf.keras.optimizers.legacy.Adam(0.001),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=[tf.keras.metrics.SparseCategoricalAccuracy()],
)
model.fit(
ds_train,
epochs=6,
validation_data=ds_test,
)
sample = cv.cvtColor(sample, cv.COLOR_BGR2GRAY)
sample = cv.resize(sample, (28, 28))
view_image(sample)
sample = np.invert(np.array([sample]))
prediction = model.predict(sample)
print(np.argmax(prediction))
sample = np.invert(np.array([sample])).reshape((28, 28, 1))
cv.imshow("test", sample)
cv.waitKey(0)
Das Modell sagt mein Bild als 3 ständig vor. Ich kenne den Grund dafür nicht. />
size = 300
(ds_train, ds_test), ds_info = tfds.load(
'mnist',
split=['train', 'test'],
shuffle_files=True,
as_supervised=True,
with_info=True,
)
def resize_img(image, label):
return tf.image.resize(image, (size, size)), label
ds_train = ds_train.map(resize_img, num_parallel_calls=tf.data.AUTOTUNE)
ds_test = ds_test.map(resize_img, num_parallel_calls=tf.data.AUTOTUNE)
def normalize_img(image, label):
"""Normalizes images: `uint8` -> `float32`."""
return tf.cast(image, tf.float32) / 255., label
ds_train = ds_train.map(normalize_img, num_parallel_calls=tf.data.AUTOTUNE)
ds_train = ds_train.cache()
ds_train = ds_train.shuffle(ds_info.splits['train'].num_examples)
ds_train = ds_train.batch(128)
ds_train = ds_train.prefetch(tf.data.AUTOTUNE)
ds_test = ds_test.map(normalize_img, num_parallel_calls=tf.data.AUTOTUNE)
ds_test = ds_test.batch(128)
ds_test = ds_test.cache()
ds_test = ds_test.prefetch(tf.data.AUTOTUNE)
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(size, size, 1)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10)
])
model.compile(
optimizer=tf.keras.optimizers.legacy.Adam(0.001),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=[tf.keras.metrics.SparseCategoricalAccuracy()],
)
model.fit(
ds_train,
epochs=6,
validation_data=ds_test,
)
sample = cv.cvtColor(sample, cv.COLOR_BGR2GRAY)
sample = cv.resize(sample, (size, size))
view_image(sample)
sample = np.invert(np.array([sample]))
prediction = model.predict(sample)
print(np.argmax(prediction))
for class_index, prob in enumerate(prediction[0]):
print(f'Class {class_index}: Probability {prob}')
sample = np.invert(np.array([sample])).reshape((size, size, 1))
cv.imshow("test", sample)
cv.waitKey(0)
< /code>
Dies ist der Code, den ich geschrieben habe, um alle Bilder im 300x300 -Format zu verarbeiten. Natürlich ist es langsamer als der 28x28, aber ich dachte, dass es die Genauigkeit erhöhen würde. Leider hat es nichts geändert.