|
import numpy as np
|
|
import tensorflow as tf
|
|
from tensorflow import keras
|
|
from keras import layers
|
|
|
|
|
|
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
|
|
|
|
|
|
x_train = x_train.astype("float32") / 255.0
|
|
x_test = x_test.astype("float32") / 255.0
|
|
|
|
|
|
x_train = np.expand_dims(x_train, -1)
|
|
x_test = np.expand_dims(x_test, -1)
|
|
|
|
|
|
num_classes = 10
|
|
y_train = keras.utils.to_categorical(y_train, num_classes)
|
|
y_test = keras.utils.to_categorical(y_test, num_classes)
|
|
|
|
model = keras.Sequential([
|
|
keras.Input(shape=(28, 28, 1)),
|
|
layers.Conv2D(32, kernel_size=(3, 3), activation="relu"),
|
|
layers.MaxPooling2D(pool_size=(2, 2)),
|
|
layers.Conv2D(64, kernel_size=(3, 3), activation="relu"),
|
|
layers.MaxPooling2D(pool_size=(2, 2)),
|
|
layers.Flatten(),
|
|
layers.Dropout(0.5),
|
|
layers.Dense(num_classes, activation="softmax")
|
|
])
|
|
|
|
model.compile(
|
|
|
|
loss="categorical_crossentropy",
|
|
|
|
optimizer="adam",
|
|
|
|
metrics=["accuracy"]
|
|
)
|
|
|
|
batch_size = 128
|
|
epochs = 15
|
|
|
|
|
|
history = model.fit(
|
|
x_train, y_train,
|
|
batch_size=batch_size,
|
|
epochs=epochs,
|
|
validation_data=(x_test, y_test)
|
|
)
|
|
|
|
|
|
score = model.evaluate(x_test, y_test, verbose=0)
|
|
print(f"\nTest loss: {score[0]:.4f}")
|
|
print(f"Test accuracy: {score[1]:.4f}")
|
|
|
|
|
|
model.save("my_keras_model.keras")
|
|
print("\nModel saved to my_keras_model.keras") |