23BQ1A4272
Import Libraries
import tensorflow as tf
import numpy as np
import [Link] as plt
import seaborn as sns
from [Link] import Sequential
from [Link] import Dense, Dropout
from [Link] import to_categorical
from [Link] import l2
from [Link] import EarlyStopping
from sklearn.model_selection import train_test_split
from [Link] import confusion_matrix, classification_report
Load Dataset
(x_train, y_train), (x_test, y_test) = [Link].load_data()
print("Original Shapes:")
print("x_train:", x_train.shape)
print("y_train:", y_train.shape)
print("x_test :", x_test.shape)
print("y_test :", y_test.shape)
Original Shapes:
x_train: (60000, 28, 28)
y_train: (60000,)
x_test : (10000, 28, 28)
y_test : (10000,)
#Display Sample Images (Before Reshape)
[Link](figsize=(8,8))
for i in range(9):
[Link](3,3,i+1)
[Link](x_train[i], cmap='gray')
[Link]("Label: " + str(y_train[i]))
[Link]("off")
[Link]("Sample MNIST Images")
[Link]()
23BQ1A4272
Data Preprocessing
#Reshape (28,28) → (784,)
x_train = x_train.reshape(-1, 784)
x_test = x_test.reshape(-1, 784)
print("After Reshape:", x_train.shape)
After Reshape: (60000, 784)
#Normalize
x_train = x_train / 255.0
x_test = x_test / 255.0
print("Pixel Range:", x_train.min(), x_train.max())
Pixel Range: 0.0 1.0
#One-hot Encode
y_train_cat = to_categorical(y_train)
y_test_cat = to_categorical(y_test)
print("After One-Hot:", y_train_cat.shape)
After One-Hot: (60000, 10)
#Train–Validation Split
x_train, x_val, y_train_cat, y_val_cat = train_test_split(
x_train, y_train_cat, test_size=0.2, random_state=42
)
print("Training:", x_train.shape)
print("Validation:", x_val.shape)
Training: (48000, 784)
Validation: (12000, 784)
EXPERIMENT 1: Baseline Model
model_baseline = Sequential([
Dense(512, activation='relu', input_shape=(784,)),
Dropout(0.4), 23BQ1A4272
Dense(256, activation='relu'),
Dropout(0.4),
Dense(10, activation='softmax')
])
model_baseline.compile(
optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy']
)
model_baseline.summary()
C:\Users\suris\anaconda3\envs\tf_env\lib\site-packages\keras\src\layers\core\[Link]: UserWarning: Do not pa
ss 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)
Model: "sequential_3"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type) ┃ Output Shape ┃ Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ dense_11 (Dense) │ (None, 512) │ 401,920 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_7 (Dropout) │ (None, 512) │ 0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_12 (Dense) │ (None, 256) │ 131,328 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_8 (Dropout) │ (None, 256) │ 0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_13 (Dense) │ (None, 10) │ 2,570 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
Total params: 535,818 (2.04 MB)
Trainable params: 535,818 (2.04 MB)
Non-trainable params: 0 (0.00 B)
#Train
history_baseline = model_baseline.fit(
x_train, y_train_cat,
epochs=20,
batch_size=128,
validation_data=(x_val, y_val_cat)
)
Epoch 1/20
23BQ1A4272
375/375 ━━━━━━━━━━━━━━━━━━━━ 5s 11ms/step - accuracy: 0.8871 - loss: 0.3670 - val_accuracy: 0.9565 - val_loss: 0
.1462
Epoch 2/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 8ms/step - accuracy: 0.9516 - loss: 0.1591 - val_accuracy: 0.9703 - val_loss: 0.
1048
Epoch 3/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 9ms/step - accuracy: 0.9635 - loss: 0.1204 - val_accuracy: 0.9719 - val_loss: 0.
0895
Epoch 4/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 8ms/step - accuracy: 0.9689 - loss: 0.1004 - val_accuracy: 0.9753 - val_loss: 0.
0808
Epoch 5/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 8ms/step - accuracy: 0.9747 - loss: 0.0836 - val_accuracy: 0.9781 - val_loss: 0.
0788
Epoch 6/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 7ms/step - accuracy: 0.9773 - loss: 0.0716 - val_accuracy: 0.9776 - val_loss: 0.
0758
Epoch 7/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 5s 7ms/step - accuracy: 0.9785 - loss: 0.0671 - val_accuracy: 0.9799 - val_loss: 0.
0702
Epoch 8/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 8ms/step - accuracy: 0.9811 - loss: 0.0584 - val_accuracy: 0.9798 - val_loss: 0.
0715
Epoch 9/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 8ms/step - accuracy: 0.9818 - loss: 0.0538 - val_accuracy: 0.9818 - val_loss: 0.
0683
Epoch 10/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 5s 7ms/step - accuracy: 0.9831 - loss: 0.0515 - val_accuracy: 0.9803 - val_loss: 0.
0720
Epoch 11/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 8ms/step - accuracy: 0.9847 - loss: 0.0462 - val_accuracy: 0.9802 - val_loss: 0.
0716
Epoch 12/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 8ms/step - accuracy: 0.9848 - loss: 0.0457 - val_accuracy: 0.9827 - val_loss: 0.
0636
Epoch 13/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 8ms/step - accuracy: 0.9864 - loss: 0.0420 - val_accuracy: 0.9808 - val_loss: 0.
0789
Epoch 14/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 8ms/step - accuracy: 0.9872 - loss: 0.0382 - val_accuracy: 0.9823 - val_loss: 0.
0700
Epoch 15/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 7ms/step - accuracy: 0.9872 - loss: 0.0384 - val_accuracy: 0.9824 - val_loss: 0.
0738
Epoch 16/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 9ms/step - accuracy: 0.9883 - loss: 0.0356 - val_accuracy: 0.9823 - val_loss: 0.
0741
Epoch 17/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 9ms/step - accuracy: 0.9891 - loss: 0.0334 - val_accuracy: 0.9823 - val_loss: 0.
0753
Epoch 18/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 9ms/step - accuracy: 0.9894 - loss: 0.0319 - val_accuracy: 0.9828 - val_loss: 0.
0750
Epoch 19/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 9ms/step - accuracy: 0.9888 - loss: 0.0332 - val_accuracy: 0.9830 - val_loss: 0.
0753
Epoch 20/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 9ms/step - accuracy: 0.9908 - loss: 0.0307 - val_accuracy: 0.9822 - val_loss: 0.
0766
#Plot Accuracy & Loss Curves
[Link](figsize=(12,5))
[Link](1,2,1)
[Link](history_baseline.history['accuracy'])
[Link](history_baseline.history['val_accuracy'])
[Link]("Accuracy")
[Link](1,2,2)
[Link](history_baseline.history['loss'])
[Link](history_baseline.history['val_loss'])
[Link]("Loss")
[Link]()
23BQ1A4272
#Model Evaluation
test_loss, test_acc = baseline_model.evaluate(x_test, y_test_cat)
print("Test Accuracy:", test_acc)
313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step - accuracy: 0.9817 - loss: 0.0716
Test Accuracy: 0.9817000031471252
#Confusion Matrix
y_pred = model_baseline.predict(x_test)
y_pred_classes = [Link](y_pred, axis=1)
y_true = y_test
cm = confusion_matrix(y_true, y_pred_classes)
[Link](figsize=(8,6))
[Link](cm, annot=True, fmt='d', cmap='Blues')
[Link]("Confusion Matrix - Baseline")
[Link]()
print(classification_report(y_true, y_pred_classes))
313/313 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step
23BQ1A4272
precision recall f1-score support
0 0.99 0.99 0.99 980
1 0.98 0.99 0.99 1135
2 0.98 0.98 0.98 1032
3 0.98 0.98 0.98 1010
4 0.97 0.99 0.98 982
5 0.99 0.97 0.98 892
6 0.98 0.98 0.98 958
7 0.98 0.97 0.98 1028
8 0.98 0.98 0.98 974
9 0.98 0.97 0.97 1009
accuracy 0.98 10000
macro avg 0.98 0.98 0.98 10000
weighted avg 0.98 0.98 0.98 10000
# Choose a test image index
index = 29
# Display the image
[Link](x_test[index].reshape(28,28), cmap='gray')
[Link]("Actual Label: " + str(y_test[index]))
[Link]("off")
[Link]()
# Predict
prediction = model_baseline.predict(x_test[index].reshape(1,784))
print("Prediction Probabilities:")
print(prediction)
print("Predicted Label:", [Link](prediction))
print("Actual Label:", y_test[index])
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
Prediction Probabilities:
[[2.4116760e-13 9.9999940e-01 4.3010229e-10 5.3799285e-09 4.1106040e-07
2.7271028e-12 7.7235267e-11 2.2237598e-08 1.3278641e-07 1.5237895e-09]]
Predicted Label: 1
Actual Label: 1
EXPERIMENT 2: Deep Network (4–5 Hidden Layers)
model_deep = Sequential([
Dense(512, activation='relu', input_shape=(784,)),
Dropout(0.4),
Dense(512, activation='relu'),
Dropout(0.4),
Dense(256, activation='relu'),
Dropout(0.3),
Dense(128, activation='relu'),
Dense(10, activation='softmax')
])
model_deep.compile(
optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'] 23BQ1A4272
)
history_deep = model_deep.fit(
x_train, y_train_cat,
epochs=20,
batch_size=128,
validation_data=(x_val, y_val_cat)
)
loss_deep, acc_deep = model_deep.evaluate(x_test, y_test_cat)
print("Deep Model Accuracy:", acc_deep)
C:\Users\suris\anaconda3\envs\tf_env\lib\site-packages\keras\src\layers\core\[Link]: UserWarning: Do not pa
ss 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/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 6s 12ms/step - accuracy: 0.8750 - loss: 0.4022 - val_accuracy: 0.9581 - val_loss: 0
.1403
Epoch 2/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 4s 10ms/step - accuracy: 0.9478 - loss: 0.1751 - val_accuracy: 0.9639 - val_loss: 0
.1207
Epoch 3/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 4s 11ms/step - accuracy: 0.9605 - loss: 0.1371 - val_accuracy: 0.9728 - val_loss: 0
.0926
Epoch 4/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 4s 11ms/step - accuracy: 0.9657 - loss: 0.1139 - val_accuracy: 0.9703 - val_loss: 0
.0978
Epoch 5/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 5s 14ms/step - accuracy: 0.9704 - loss: 0.1013 - val_accuracy: 0.9769 - val_loss: 0
.0819
Epoch 6/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 5s 14ms/step - accuracy: 0.9726 - loss: 0.0905 - val_accuracy: 0.9747 - val_loss: 0
.0844
Epoch 7/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 5s 14ms/step - accuracy: 0.9761 - loss: 0.0809 - val_accuracy: 0.9760 - val_loss: 0
.0838
Epoch 8/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 5s 13ms/step - accuracy: 0.9770 - loss: 0.0750 - val_accuracy: 0.9797 - val_loss: 0
.0743
Epoch 9/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 5s 13ms/step - accuracy: 0.9793 - loss: 0.0705 - val_accuracy: 0.9792 - val_loss: 0
.0818
Epoch 10/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 5s 14ms/step - accuracy: 0.9803 - loss: 0.0659 - val_accuracy: 0.9797 - val_loss: 0
.0755
Epoch 11/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 5s 14ms/step - accuracy: 0.9811 - loss: 0.0605 - val_accuracy: 0.9820 - val_loss: 0
.0659
Epoch 12/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 5s 14ms/step - accuracy: 0.9822 - loss: 0.0590 - val_accuracy: 0.9795 - val_loss: 0
.0755
Epoch 13/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 5s 14ms/step - accuracy: 0.9832 - loss: 0.0546 - val_accuracy: 0.9831 - val_loss: 0
.0702
Epoch 14/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 5s 13ms/step - accuracy: 0.9845 - loss: 0.0498 - val_accuracy: 0.9808 - val_loss: 0
.0768
Epoch 15/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 5s 14ms/step - accuracy: 0.9856 - loss: 0.0461 - val_accuracy: 0.9809 - val_loss: 0
.0813
Epoch 16/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 5s 13ms/step - accuracy: 0.9855 - loss: 0.0479 - val_accuracy: 0.9810 - val_loss: 0
.0735
Epoch 17/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 5s 13ms/step - accuracy: 0.9855 - loss: 0.0453 - val_accuracy: 0.9816 - val_loss: 0
.0739
Epoch 18/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 5s 13ms/step - accuracy: 0.9869 - loss: 0.0419 - val_accuracy: 0.9817 - val_loss: 0
.0769
Epoch 19/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 5s 13ms/step - accuracy: 0.9871 - loss: 0.0425 - val_accuracy: 0.9828 - val_loss: 0
.0690
Epoch 20/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 5s 13ms/step - accuracy: 0.9885 - loss: 0.0396 - val_accuracy: 0.9833 - val_loss: 0
.0732
313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 3ms/step - accuracy: 0.9822 - loss: 0.0666
Deep Model Accuracy: 0.982200026512146
EXPERIMENT 3: Overfitting Study (Remove Dropout)
model_overfit = Sequential([
Dense(512, activation='relu', input_shape=(784,)), 23BQ1A4272
Dense(256, activation='relu'),
Dense(128, activation='relu'),
Dense(10, activation='softmax')
])
model_overfit.compile(
optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy']
)
history_overfit = model_overfit.fit(
x_train, y_train_cat,
epochs=20,
batch_size=128,
validation_data=(x_val, y_val_cat)
)
Epoch 1/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 4s 8ms/step - accuracy: 0.9261 - loss: 0.2523 - val_accuracy: 0.9621 - val_loss: 0.
1224
Epoch 2/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 8ms/step - accuracy: 0.9722 - loss: 0.0924 - val_accuracy: 0.9712 - val_loss: 0.
0908
Epoch 3/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 9ms/step - accuracy: 0.9816 - loss: 0.0580 - val_accuracy: 0.9700 - val_loss: 0.
0985
Epoch 4/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 4s 11ms/step - accuracy: 0.9861 - loss: 0.0429 - val_accuracy: 0.9761 - val_loss: 0
.0804
Epoch 5/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 4s 11ms/step - accuracy: 0.9904 - loss: 0.0295 - val_accuracy: 0.9797 - val_loss: 0
.0753
Epoch 6/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 4s 10ms/step - accuracy: 0.9912 - loss: 0.0263 - val_accuracy: 0.9780 - val_loss: 0
.0833
Epoch 7/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 4s 11ms/step - accuracy: 0.9929 - loss: 0.0204 - val_accuracy: 0.9791 - val_loss: 0
.0886
Epoch 8/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 4s 10ms/step - accuracy: 0.9927 - loss: 0.0216 - val_accuracy: 0.9758 - val_loss: 0
.0925
Epoch 9/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 4s 10ms/step - accuracy: 0.9945 - loss: 0.0168 - val_accuracy: 0.9793 - val_loss: 0
.0905
Epoch 10/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 4s 11ms/step - accuracy: 0.9953 - loss: 0.0146 - val_accuracy: 0.9782 - val_loss: 0
.0916
Epoch 11/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 4s 11ms/step - accuracy: 0.9953 - loss: 0.0155 - val_accuracy: 0.9804 - val_loss: 0
.0923
Epoch 12/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 4s 10ms/step - accuracy: 0.9957 - loss: 0.0135 - val_accuracy: 0.9785 - val_loss: 0
.1042
Epoch 13/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 4s 10ms/step - accuracy: 0.9964 - loss: 0.0114 - val_accuracy: 0.9805 - val_loss: 0
.0984
Epoch 14/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 4s 11ms/step - accuracy: 0.9968 - loss: 0.0104 - val_accuracy: 0.9792 - val_loss: 0
.1061
Epoch 15/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 4s 11ms/step - accuracy: 0.9957 - loss: 0.0124 - val_accuracy: 0.9789 - val_loss: 0
.1027
Epoch 16/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 4s 10ms/step - accuracy: 0.9965 - loss: 0.0116 - val_accuracy: 0.9774 - val_loss: 0
.1206
Epoch 17/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 9ms/step - accuracy: 0.9982 - loss: 0.0057 - val_accuracy: 0.9784 - val_loss: 0.
1157
Epoch 18/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 5s 8ms/step - accuracy: 0.9968 - loss: 0.0102 - val_accuracy: 0.9796 - val_loss: 0.
1045
Epoch 19/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 5s 13ms/step - accuracy: 0.9960 - loss: 0.0121 - val_accuracy: 0.9804 - val_loss: 0
.0926
Epoch 20/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 4s 11ms/step - accuracy: 0.9967 - loss: 0.0095 - val_accuracy: 0.9820 - val_loss: 0
.0929
EXPERIMENT 4: Regularization Study L2 + Dropout + EarlyStopping
model_reg = Sequential([
Dense(512, activation='relu', kernel_regularizer=l2(0.001), input_shape=(784,)),
Dropout(0.4), 23BQ1A4272
Dense(256, activation='relu', kernel_regularizer=l2(0.001)),
Dropout(0.4),
Dense(10, activation='softmax')
])
model_reg.compile(
optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy']
)
early_stop = EarlyStopping(patience=3, restore_best_weights=True)
history_reg = model_reg.fit(
x_train, y_train_cat,
epochs=30,
batch_size=128,
validation_data=(x_val, y_val_cat),
callbacks=[early_stop]
)
Epoch 1/30
375/375 ━━━━━━━━━━━━━━━━━━━━ 4s 9ms/step - accuracy: 0.8838 - loss: 0.8762 - val_accuracy: 0.9550 - val_loss: 0.
4869
Epoch 2/30
375/375 ━━━━━━━━━━━━━━━━━━━━ 5s 9ms/step - accuracy: 0.9433 - loss: 0.4533 - val_accuracy: 0.9593 - val_loss: 0.
3499
Epoch 3/30
375/375 ━━━━━━━━━━━━━━━━━━━━ 5s 9ms/step - accuracy: 0.9526 - loss: 0.3500 - val_accuracy: 0.9629 - val_loss: 0.
2991
Epoch 4/30
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 8ms/step - accuracy: 0.9575 - loss: 0.3078 - val_accuracy: 0.9676 - val_loss: 0.
2640
Epoch 5/30
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 8ms/step - accuracy: 0.9577 - loss: 0.2946 - val_accuracy: 0.9676 - val_loss: 0.
2590
Epoch 6/30
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 8ms/step - accuracy: 0.9596 - loss: 0.2851 - val_accuracy: 0.9707 - val_loss: 0.
2517
Epoch 7/30
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 9ms/step - accuracy: 0.9600 - loss: 0.2796 - val_accuracy: 0.9694 - val_loss: 0.
2459
Epoch 8/30
375/375 ━━━━━━━━━━━━━━━━━━━━ 4s 10ms/step - accuracy: 0.9612 - loss: 0.2739 - val_accuracy: 0.9718 - val_loss: 0
.2413
Epoch 9/30
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 9ms/step - accuracy: 0.9609 - loss: 0.2742 - val_accuracy: 0.9724 - val_loss: 0.
2374
Epoch 10/30
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 8ms/step - accuracy: 0.9624 - loss: 0.2665 - val_accuracy: 0.9682 - val_loss: 0.
2434
Epoch 11/30
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 9ms/step - accuracy: 0.9622 - loss: 0.2651 - val_accuracy: 0.9707 - val_loss: 0.
2379
Epoch 12/30
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 9ms/step - accuracy: 0.9644 - loss: 0.2619 - val_accuracy: 0.9722 - val_loss: 0.
2331
Epoch 13/30
375/375 ━━━━━━━━━━━━━━━━━━━━ 4s 10ms/step - accuracy: 0.9635 - loss: 0.2620 - val_accuracy: 0.9728 - val_loss: 0
.2298
Epoch 14/30
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 9ms/step - accuracy: 0.9631 - loss: 0.2622 - val_accuracy: 0.9689 - val_loss: 0.
2393
Epoch 15/30
375/375 ━━━━━━━━━━━━━━━━━━━━ 4s 9ms/step - accuracy: 0.9628 - loss: 0.2627 - val_accuracy: 0.9741 - val_loss: 0.
2255
Epoch 16/30
375/375 ━━━━━━━━━━━━━━━━━━━━ 4s 10ms/step - accuracy: 0.9627 - loss: 0.2564 - val_accuracy: 0.9697 - val_loss: 0
.2353
Epoch 17/30
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 9ms/step - accuracy: 0.9630 - loss: 0.2605 - val_accuracy: 0.9746 - val_loss: 0.
2283
Epoch 18/30
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 9ms/step - accuracy: 0.9633 - loss: 0.2566 - val_accuracy: 0.9723 - val_loss: 0.
2282
EXPERIMENT 5: Hyperparameter Tuning
model_lr = Sequential([
Dense(512, activation='relu', input_shape=(784,)),
Dense(256, activation='relu'),
Dense(10, activation='softmax')
])
23BQ1A4272
model_lr.compile(
optimizer=[Link](learning_rate=0.0005),
loss='categorical_crossentropy',
metrics=['accuracy']
)
history_lr = model_lr.fit(
x_train, y_train_cat,
epochs=20,
batch_size=64,
validation_data=(x_val, y_val_cat)
)
Epoch 1/20
750/750 ━━━━━━━━━━━━━━━━━━━━ 5s 6ms/step - accuracy: 0.9239 - loss: 0.2666 - val_accuracy: 0.9534 - val_loss: 0.
1474
Epoch 2/20
750/750 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.9700 - loss: 0.0995 - val_accuracy: 0.9724 - val_loss: 0.
0921
Epoch 3/20
750/750 ━━━━━━━━━━━━━━━━━━━━ 5s 6ms/step - accuracy: 0.9809 - loss: 0.0617 - val_accuracy: 0.9755 - val_loss: 0.
0816
Epoch 4/20
750/750 ━━━━━━━━━━━━━━━━━━━━ 5s 6ms/step - accuracy: 0.9872 - loss: 0.0423 - val_accuracy: 0.9762 - val_loss: 0.
0782
Epoch 5/20
750/750 ━━━━━━━━━━━━━━━━━━━━ 5s 6ms/step - accuracy: 0.9903 - loss: 0.0311 - val_accuracy: 0.9787 - val_loss: 0.
0783
Epoch 6/20
750/750 ━━━━━━━━━━━━━━━━━━━━ 5s 7ms/step - accuracy: 0.9932 - loss: 0.0217 - val_accuracy: 0.9787 - val_loss: 0.
0789
Epoch 7/20
750/750 ━━━━━━━━━━━━━━━━━━━━ 5s 6ms/step - accuracy: 0.9945 - loss: 0.0170 - val_accuracy: 0.9797 - val_loss: 0.
0813
Epoch 8/20
750/750 ━━━━━━━━━━━━━━━━━━━━ 5s 6ms/step - accuracy: 0.9964 - loss: 0.0127 - val_accuracy: 0.9795 - val_loss: 0.
0834
Epoch 9/20
750/750 ━━━━━━━━━━━━━━━━━━━━ 5s 7ms/step - accuracy: 0.9960 - loss: 0.0123 - val_accuracy: 0.9766 - val_loss: 0.
0979
Epoch 10/20
750/750 ━━━━━━━━━━━━━━━━━━━━ 5s 6ms/step - accuracy: 0.9962 - loss: 0.0115 - val_accuracy: 0.9774 - val_loss: 0.
1022
Epoch 11/20
750/750 ━━━━━━━━━━━━━━━━━━━━ 5s 6ms/step - accuracy: 0.9961 - loss: 0.0111 - val_accuracy: 0.9818 - val_loss: 0.
0983
Epoch 12/20
750/750 ━━━━━━━━━━━━━━━━━━━━ 5s 7ms/step - accuracy: 0.9976 - loss: 0.0078 - val_accuracy: 0.9763 - val_loss: 0.
1169
Epoch 13/20
750/750 ━━━━━━━━━━━━━━━━━━━━ 5s 6ms/step - accuracy: 0.9971 - loss: 0.0093 - val_accuracy: 0.9812 - val_loss: 0.
0900
Epoch 14/20
750/750 ━━━━━━━━━━━━━━━━━━━━ 5s 6ms/step - accuracy: 0.9978 - loss: 0.0070 - val_accuracy: 0.9799 - val_loss: 0.
0971
Epoch 15/20
750/750 ━━━━━━━━━━━━━━━━━━━━ 5s 7ms/step - accuracy: 0.9981 - loss: 0.0060 - val_accuracy: 0.9803 - val_loss: 0.
0937
Epoch 16/20
750/750 ━━━━━━━━━━━━━━━━━━━━ 5s 7ms/step - accuracy: 0.9974 - loss: 0.0076 - val_accuracy: 0.9793 - val_loss: 0.
1097
Epoch 17/20
750/750 ━━━━━━━━━━━━━━━━━━━━ 5s 6ms/step - accuracy: 0.9979 - loss: 0.0065 - val_accuracy: 0.9787 - val_loss: 0.
1096
Epoch 18/20
750/750 ━━━━━━━━━━━━━━━━━━━━ 5s 6ms/step - accuracy: 0.9989 - loss: 0.0038 - val_accuracy: 0.9793 - val_loss: 0.
1110
Epoch 19/20
750/750 ━━━━━━━━━━━━━━━━━━━━ 5s 7ms/step - accuracy: 0.9977 - loss: 0.0066 - val_accuracy: 0.9813 - val_loss: 0.
1021
Epoch 20/20
750/750 ━━━━━━━━━━━━━━━━━━━━ 5s 7ms/step - accuracy: 0.9983 - loss: 0.0052 - val_accuracy: 0.9838 - val_loss: 0.
0940
EXPERIMENT 6: SGD vs Adam
model_sgd = Sequential([
Dense(512, activation='relu', input_shape=(784,)),
Dense(256, activation='relu'),
Dense(10, activation='softmax')
])
model_sgd.compile(
optimizer=[Link](learning_rate=0.01), 23BQ1A4272
loss='categorical_crossentropy',
metrics=['accuracy']
)
history_sgd = model_sgd.fit(
x_train, y_train_cat,
epochs=20,
batch_size=128,
validation_data=(x_val, y_val_cat)
)
loss_sgd, acc_sgd = model_sgd.evaluate(x_test, y_test_cat)
print("SGD Accuracy:", acc_sgd)
Epoch 1/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 6ms/step - accuracy: 0.7211 - loss: 1.2147 - val_accuracy: 0.8522 - val_loss: 0.
6228
Epoch 2/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 2s 6ms/step - accuracy: 0.8725 - loss: 0.5032 - val_accuracy: 0.8867 - val_loss: 0.
4233
Epoch 3/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 2s 6ms/step - accuracy: 0.8932 - loss: 0.3900 - val_accuracy: 0.9024 - val_loss: 0.
3560
Epoch 4/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 2s 6ms/step - accuracy: 0.9041 - loss: 0.3411 - val_accuracy: 0.9108 - val_loss: 0.
3197
Epoch 5/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 2s 6ms/step - accuracy: 0.9114 - loss: 0.3108 - val_accuracy: 0.9167 - val_loss: 0.
2965
Epoch 6/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 2s 5ms/step - accuracy: 0.9173 - loss: 0.2890 - val_accuracy: 0.9233 - val_loss: 0.
2774
Epoch 7/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 2s 5ms/step - accuracy: 0.9226 - loss: 0.2717 - val_accuracy: 0.9268 - val_loss: 0.
2632
Epoch 8/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 2s 7ms/step - accuracy: 0.9271 - loss: 0.2570 - val_accuracy: 0.9302 - val_loss: 0.
2508
Epoch 9/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 7ms/step - accuracy: 0.9308 - loss: 0.2446 - val_accuracy: 0.9318 - val_loss: 0.
2411
Epoch 10/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 7ms/step - accuracy: 0.9340 - loss: 0.2337 - val_accuracy: 0.9339 - val_loss: 0.
2329
Epoch 11/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 8ms/step - accuracy: 0.9374 - loss: 0.2239 - val_accuracy: 0.9373 - val_loss: 0.
2240
Epoch 12/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 7ms/step - accuracy: 0.9400 - loss: 0.2150 - val_accuracy: 0.9397 - val_loss: 0.
2154
Epoch 13/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 7ms/step - accuracy: 0.9419 - loss: 0.2068 - val_accuracy: 0.9417 - val_loss: 0.
2082
Epoch 14/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 7ms/step - accuracy: 0.9439 - loss: 0.1992 - val_accuracy: 0.9429 - val_loss: 0.
2021
Epoch 15/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 7ms/step - accuracy: 0.9464 - loss: 0.1920 - val_accuracy: 0.9456 - val_loss: 0.
1969
Epoch 16/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 8ms/step - accuracy: 0.9487 - loss: 0.1857 - val_accuracy: 0.9475 - val_loss: 0.
1908
Epoch 17/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 8ms/step - accuracy: 0.9501 - loss: 0.1796 - val_accuracy: 0.9484 - val_loss: 0.
1854
Epoch 18/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 7ms/step - accuracy: 0.9520 - loss: 0.1739 - val_accuracy: 0.9490 - val_loss: 0.
1817
Epoch 19/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 7ms/step - accuracy: 0.9531 - loss: 0.1686 - val_accuracy: 0.9506 - val_loss: 0.
1768
Epoch 20/20
375/375 ━━━━━━━━━━━━━━━━━━━━ 3s 7ms/step - accuracy: 0.9540 - loss: 0.1633 - val_accuracy: 0.9513 - val_loss: 0.
1723
313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step - accuracy: 0.9513 - loss: 0.1666
SGD Accuracy: 0.9513000249862671
print("Baseline Accuracy :", test_acc)
print("Deep Accuracy :", acc_deep)
print("SGD Accuracy :", acc_sgd)
Baseline Accuracy : 0.9817000031471252
23BQ1A4272
Deep Accuracy : 0.982200026512146
SGD Accuracy : 0.9513000249862671
Loading [MathJax]/jax/output/CommonHTML/fonts/TeX/[Link]