import tensorflow as tf
from tensorflow import keras
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
Classification of Numbers(0-9)
= keras.datasets.mnist.load_data() (X_train, y_train) , (X_test, y_test)
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
11490434/11490434 ━━━━━━━━━━━━━━━━━━━━ 0s 0us/step
X_train.shape, y_train.shape
((60000, 28, 28), (60000,))
X_test.shape, y_test.shape
((10000, 28, 28), (10000,))
5])
plt.imshow(X_train[5] y_train[
2
= X_train / 255 # In order to normalize the data
X_train = X_test / 255 X_test
= X_train.reshape(len(X_train), 28*28)
X_train_flat = X_test.reshape(len(X_test), 28*28) X_test_flat
X_train_flat.shape, X_test_flat.shape
((60000, 784), (10000, 784))
= keras.Sequential([
model 10, input_shape=(784,), activation='sigmoid')
keras.layers.Dense(
])
compile(optimizer='adam',
model.='sparse_categorical_crossentropy',
loss=['accuracy'])
metrics
=5) model.fit(X_train_flat, y_train, epochs
/usr/local/lib/python3.10/dist-packages/keras/src/layers/core/dense.py:87: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
super().__init__(activity_regularizer=activity_regularizer, **kwargs)
Epoch 1/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.8194 - loss: 0.7002
Epoch 2/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9164 - loss: 0.3028
Epoch 3/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9198 - loss: 0.2839
Epoch 4/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 5s 1ms/step - accuracy: 0.9235 - loss: 0.2728
Epoch 5/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.9255 - loss: 0.2593
<keras.src.callbacks.history.History at 0x7f40f2dd82b0>
Given the input dataset, the accuracy is around 93% with a very simple neural network model. The model complex is less yet achieved good accuracy.
model.summary()
Model: "sequential"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓ ┃ Layer (type) ┃ Output Shape ┃ Param # ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩ │ dense (Dense) │ (None, 10) │ 7,850 │ └──────────────────────────────────────┴─────────────────────────────┴─────────────────┘
Total params: 23,552 (92.00 KB)
Trainable params: 7,850 (30.66 KB)
Non-trainable params: 0 (0.00 B)
Optimizer params: 15,702 (61.34 KB)
model.evaluate(X_test_flat, y_test)
313/313 ━━━━━━━━━━━━━━━━━━━━ 2s 4ms/step - accuracy: 0.9144 - loss: 0.3048
[0.27070537209510803, 0.9248999953269958]
= model.predict(X_test_flat)
y_predict 0] y_predict[
313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step
array([4.6898533e-02, 2.9230904e-07, 6.8001457e-02, 9.5464110e-01,
2.4680649e-03, 1.2394587e-01, 1.4552444e-06, 9.9982125e-01,
8.0362149e-02, 5.2514255e-01], dtype=float32)
99]) plt.imshow(X_test[
99]) np.argmax(y_predict[
9
#Let's make our mode more complex by adding a hidden layer
= keras.Sequential([
model 100, input_shape=(784,), activation='relu'),
keras.layers.Dense(10, activation='sigmoid')
keras.layers.Dense(
])
compile(optimizer='adam',
model.='sparse_categorical_crossentropy',
loss=['accuracy'])
metrics
=5) model.fit(X_train_flat, y_train, epochs
Epoch 1/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 6s 2ms/step - accuracy: 0.8660 - loss: 0.4641
Epoch 2/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 9s 2ms/step - accuracy: 0.9597 - loss: 0.1381
Epoch 3/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9740 - loss: 0.0886
Epoch 4/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.9794 - loss: 0.0687
Epoch 5/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.9842 - loss: 0.0515
<keras.src.callbacks.history.History at 0x7f40f2d75e10>
model.summary()
Model: "sequential_1"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓ ┃ Layer (type) ┃ Output Shape ┃ Param # ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩ │ dense_1 (Dense) │ (None, 100) │ 78,500 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ dense_2 (Dense) │ (None, 10) │ 1,010 │ └──────────────────────────────────────┴─────────────────────────────┴─────────────────┘
Total params: 238,532 (931.77 KB)
Trainable params: 79,510 (310.59 KB)
Non-trainable params: 0 (0.00 B)
Optimizer params: 159,022 (621.18 KB)
Well there is a lot of improvement after adding a layer. This is a good model.
model.evaluate(X_test_flat,y_test)
313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 3ms/step - accuracy: 0.9711 - loss: 0.0966
[0.08135204017162323, 0.9746999740600586]
# Let's look at some results.
9])
plt.imshow(X_test[9]) np.argmax(y_predict[
9
15])
plt.imshow(X_test[15]) np.argmax(y_predict[
5
987])
plt.imshow(X_test[987]) np.argmax(y_predict[
7