Create MNIST_Digit_Recognizer.ipynb
Browse filesCode Walkthrough
1. Dataset Loading:
python
Copy code
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train and X_test: Images of handwritten digits.
y_train and y_test: Corresponding digit labels.
2. Data Preprocessing:
python
Copy code
X_train = X_train.reshape(60000, 28, 28, 1)
X_test = X_test.reshape(10000, 28, 28, 1)
y_train_one_hot = to_categorical(y_train)
y_test_one_hot = to_categorical(y_test)
Reshaping: Adds a "channel" dimension to images (required by CNNs).
Normalization: Automatically done by to_categorical.
One-Hot Encoding: Converts labels into vectors.
3. Building the CNN Model:
python
Copy code
model = Sequential()
model.add(Conv2D(64, kernel_size=3, activation='relu', input_shape=(28,28,1)))
model.add(Conv2D(32, kernel_size=3, activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(10, activation='softmax'))
Conv2D: Applies filters (kernels) to extract image features.
First layer: 64 filters, each 3x3.
Second layer: 32 filters, each 3x3.
MaxPool2D: Downsamples feature maps to reduce size and computation.
Flatten: Converts 2D feature maps into a 1D vector.
Dense Layer: Fully connected layer with 10 outputs (one for each digit).
4. Compiling the Model:
python
Copy code
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
Adam Optimizer: Combines advantages of Momentum and RMSProp for faster convergence.
Categorical Cross-Entropy: Measures the difference between predicted and actual probabilities.
5. Training the Model:
python
Copy code
hist = model.fit(X_train, y_train_one_hot, validation_data=(X_test, y_test_one_hot), epochs=10)
Epochs: The number of times the model sees the entire dataset.
Validation Data: Used to check how well the model generalizes.
Architecture Overview
Input Layer:
Shape: (28, 28, 1) (grayscale images).
Convolutional Layers:
Extract features like edges, curves, and shapes.
Pooling Layer:
Reduces spatial dimensions to make computation efficient.
Fully Connected Layer:
Combines features to make final predictions.
Output Layer:
Softmax Activation gives probabilities for each digit (0-9).
Tools and Libraries
TensorFlow/Keras:
TensorFlow is the backend, and Keras is the high-level API.
Matplotlib:
For visualizing sample images.
Numpy:
For data manipulation.
- MNIST_Digit_Recognizer.ipynb +71 -0
@@ -0,0 +1,71 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Description: This program use Convolutional Neural Networks(CNN)
|
2 |
+
# classify handwritten digits as number 0-9
|
3 |
+
|
4 |
+
#importing the libraries
|
5 |
+
from keras.models import Sequential
|
6 |
+
from keras.layers import Dense, Conv2D, Flatten, MaxPool2D
|
7 |
+
from keras.datasets import mnist
|
8 |
+
from keras.utils import to_categorical
|
9 |
+
import numpy as np
|
10 |
+
import matplotlib.pyplot as plt
|
11 |
+
|
12 |
+
#Load the data and split it into train and test
|
13 |
+
(X_train, y_train), (X_test, y_test) = mnist.load_data()
|
14 |
+
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
|
15 |
+
11490434/11490434 ββββββββββββββββββββ 0s 0us/step
|
16 |
+
|
17 |
+
#Get the image shape
|
18 |
+
print(X_train.shape)
|
19 |
+
print(X_test.shape)
|
20 |
+
(60000, 28, 28)
|
21 |
+
(10000, 28, 28)
|
22 |
+
|
23 |
+
plt.imshow(X_train[2])
|
24 |
+
<matplotlib.image.AxesImage at 0x7d583f968610>
|
25 |
+
|
26 |
+
# Reshaping the data to fit the model
|
27 |
+
X_train = X_train.reshape(60000, 28, 28, 1)
|
28 |
+
X_test = X_test.reshape(10000, 28, 28, 1)
|
29 |
+
|
30 |
+
# One-Hot Encoding:
|
31 |
+
y_train_one_hot = to_categorical(y_train)
|
32 |
+
y_test_one_hot = to_categorical(y_test)
|
33 |
+
|
34 |
+
# Print the new label
|
35 |
+
print(y_train_one_hot[0])
|
36 |
+
[0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
|
37 |
+
|
38 |
+
# Build the CNN model
|
39 |
+
model = Sequential()
|
40 |
+
# Add model layers
|
41 |
+
model.add(Conv2D(64, kernel_size=3, activation = 'relu', input_shape=(28,28,1)))
|
42 |
+
model.add(Conv2D(32, kernel_size=3, activation='relu'))
|
43 |
+
model.add(MaxPool2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None))
|
44 |
+
model.add(Flatten())
|
45 |
+
model.add(Dense(10,activation='softmax'))
|
46 |
+
|
47 |
+
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
|
48 |
+
|
49 |
+
#Train the model
|
50 |
+
hist = model.fit(X_train,y_train_one_hot, validation_data=(X_test,y_test_one_hot), epochs=10)
|
51 |
+
Epoch 1/10
|
52 |
+
1875/1875 ββββββββββββββββββββ 152s 80ms/step - accuracy: 0.8982 - loss: 0.8538 - val_accuracy: 0.9752 - val_loss: 0.0818
|
53 |
+
Epoch 2/10
|
54 |
+
1875/1875 ββββββββββββββββββββ 201s 80ms/step - accuracy: 0.9762 - loss: 0.0775 - val_accuracy: 0.9778 - val_loss: 0.0704
|
55 |
+
Epoch 3/10
|
56 |
+
1875/1875 ββββββββββββββββββββ 150s 80ms/step - accuracy: 0.9816 - loss: 0.0580 - val_accuracy: 0.9795 - val_loss: 0.0697
|
57 |
+
Epoch 4/10
|
58 |
+
1875/1875 ββββββββββββββββββββ 202s 80ms/step - accuracy: 0.9855 - loss: 0.0438 - val_accuracy: 0.9820 - val_loss: 0.0593
|
59 |
+
Epoch 5/10
|
60 |
+
1875/1875 ββββββββββββββββββββ 202s 80ms/step - accuracy: 0.9897 - loss: 0.0305 - val_accuracy: 0.9815 - val_loss: 0.0725
|
61 |
+
Epoch 6/10
|
62 |
+
1875/1875 ββββββββββββββββββββ 202s 80ms/step - accuracy: 0.9909 - loss: 0.0287 - val_accuracy: 0.9796 - val_loss: 0.0779
|
63 |
+
Epoch 7/10
|
64 |
+
1875/1875 ββββββββββββββββββββ 150s 80ms/step - accuracy: 0.9933 - loss: 0.0220 - val_accuracy: 0.9836 - val_loss: 0.0803
|
65 |
+
Epoch 8/10
|
66 |
+
1875/1875 ββββββββββββββββββββ 202s 80ms/step - accuracy: 0.9941 - loss: 0.0174 - val_accuracy: 0.9820 - val_loss: 0.0896
|
67 |
+
Epoch 9/10
|
68 |
+
1875/1875 ββββββββββββββββββββ 201s 80ms/step - accuracy: 0.9936 - loss: 0.0190 - val_accuracy: 0.9798 - val_loss: 0.0926
|
69 |
+
Epoch 10/10
|
70 |
+
1875/1875 ββββββββββββββββββββ 203s 81ms/step - accuracy: 0.9953 - loss: 0.0148 - val_accuracy: 0.9827 - val_loss: 0.1042
|
71 |
+
|