|
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") |
|
|
|
|
|
|
|
|
|
import matplotlib.pyplot as plt |
|
data = x_test[2] |
|
plt.imshow(data) |
|
logits = model.predict(np.expand_dims(data,0)) |
|
result = np.argmax(logits) |
|
print(result) |