| | 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) |