0% found this document useful (0 votes)
2 views12 pages

DL - Lab-4 (R)

The document outlines a machine learning project using TensorFlow to classify MNIST handwritten digits. It includes steps for importing libraries, loading and preprocessing the dataset, building and training a baseline neural network model, and evaluating its performance with accuracy and confusion matrix visualizations. Additionally, it describes a second experiment with a deeper network architecture to improve classification results.

Uploaded by

kasaharsha2007
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
2 views12 pages

DL - Lab-4 (R)

The document outlines a machine learning project using TensorFlow to classify MNIST handwritten digits. It includes steps for importing libraries, loading and preprocessing the dataset, building and training a baseline neural network model, and evaluating its performance with accuracy and confusion matrix visualizations. Additionally, it describes a second experiment with a deeper network architecture to improve classification results.

Uploaded by

kasaharsha2007
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

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]

You might also like