Autoencoder From Scratch
Autoencoder From Scratch
train_data = pd.read_csv('data/mnist_train.csv')
test_data = pd.read_csv('data/mnist_test.csv')
train_data.shape
(60000, 784)
def relu(x):
return np.maximum(0.01 * x, x) # Leaky ReLU
def softmax(x):
exp_x = np.exp(x)
return exp_x / np.sum(exp_x, axis=0)
def sigmoid(x):
return 1 / (1 + np.exp(-x))
class AdamOptimizer:
def __init__(self, lr=0.001, beta1=0.9, beta2=0.999, epsilon=1e-
8):
self.lr = lr
self.beta1 = beta1
self.beta2 = beta2
self.epsilon = epsilon
self.m_w = 0
self.v_w = 0
self.m_b = 0
self.v_b = 0
self.t = 0
class Encoder:
def __init__(self, input_size, hidden_size, optimizer):
self.input_size = input_size
self.hidden_size = hidden_size
self.optimizer = optimizer
self.W1, self.b1 = init_params(input_size, hidden_size)
self.m_w1 = self.v_w1 = np.zeros_like(self.W1)
self.m_b1 = self.v_b1 = np.zeros_like(self.b1)
def update(self):
self.W1, self.m_w1, self.v_w1 = self.optimizer.update(self.W1,
self.dW1, self.m_w1, self.v_w1)
self.b1, self.m_b1, self.v_b1 = self.optimizer.update(self.b1,
self.db1, self.m_b1, self.v_b1)
class Decoder:
def __init__(self, hidden_size, output_size, optimizer):
self.hidden_size = hidden_size
self.output_size = output_size
self.optimizer = optimizer
self.W2, self.b2 = init_params(hidden_size, output_size)
self.m_w2 = self.v_w2 = np.zeros_like(self.W2)
self.m_b2 = self.v_b2 = np.zeros_like(self.b2)
def update(self):
self.W2, self.m_w2, self.v_w2 = self.optimizer.update(self.W2,
self.dW2, self.m_w2, self.v_w2)
self.b2, self.m_b2, self.v_b2 = self.optimizer.update(self.b2,
self.db2, self.m_b2, self.v_b2)
class Autoencoder:
def __init__(self, input_size, hidden_size, optimizer):
self.encoder = Encoder(input_size, hidden_size, optimizer)
self.decoder = Decoder(hidden_size, input_size, optimizer)
self.optimizer = optimizer
self.loss_history = []
self.total_params = self.calculate_total_params()
def calculate_total_params(self):
encoder_params = np.prod(self.encoder.W1.shape) +
np.prod(self.encoder.b1.shape)
decoder_params = np.prod(self.decoder.W2.shape) +
np.prod(self.decoder.b2.shape)
return encoder_params + decoder_params
def summary(self):
# Header
print("------------------------------------------------------------")
print(f"{'Layer (Type)':<20} {'Output Shape':<20} {'Param
#':<10}")
print("============================================================")
# Encoder details
encoder_params = np.prod(self.encoder.W1.shape) +
np.prod(self.encoder.b1.shape)
print(f"Encoder (Dense):{'':<9} ({self.encoder.hidden_size},)
{encoder_params:<10}")
# Decoder details
decoder_params = np.prod(self.decoder.W2.shape) +
np.prod(self.decoder.b2.shape)
print(f"Decoder (Dense):{'':<9} ({self.decoder.output_size},)
{decoder_params:<10}")
# Footer
print("============================================================")
print(f"Total Parameters: {self.total_params}")
print(f"Trainable Parameters: {self.total_params}")
print(f"Non-trainable Parameters: 0")
print("------------------------------------------------------------")
self.forward(x_batch)
self.backward(y_batch)
all_predictions.append(self.decoded)
all_true_values.append(y_batch)
all_predictions = np.vstack(all_predictions)
all_true_values = np.vstack(all_true_values)
accuracy = calculate_accuracy(all_true_values,
all_predictions, threshold)
self.accuracy_history.append(accuracy)
print("-----------------------------------------------")
print(f'Epoch {epoch + 1}/{epochs} - Loss:
{avg_epoch_loss:.4f}, Accuracy: {accuracy}%')
self.plot_metrics()
def plot_metrics(self):
plt.figure(figsize=(10, 5))
plt.plot(self.loss_history, label="Training Loss",
color='blue')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Training Loss Over Epochs')
plt.legend()
plt.grid()
plt.show()
plt.figure(figsize=(10, 5))
plt.plot(self.accuracy_history, label="Training Accuracy",
color='orange')
plt.xlabel('Epoch')
plt.ylabel('Accuracy (%)')
plt.title('Training Accuracy Over Epochs')
plt.legend()
plt.grid()
plt.show()
learning_rate = 0.001
batch_size = 64
epochs = 300
optimizer = AdamOptimizer(lr=learning_rate)
autoencoder = Autoencoder(784, 256, optimizer)
autoencoder.summary()
autoencoder.train(train_data, train_data, epochs, batch_size)
------------------------------------------------------------
Layer (Type) Output Shape Param #
============================================================
Encoder (Dense): (256,) 200960
Decoder (Dense): (784,) 201488
============================================================
Total Parameters: 402448
Trainable Parameters: 402448
Non-trainable Parameters: 0
------------------------------------------------------------
-----------------------------------------------
Epoch 1/300 - Loss: 0.3840, Accuracy: 21.52900297619048%
-----------------------------------------------
Epoch 2/300 - Loss: 0.2798, Accuracy: 56.69454931972789%
-----------------------------------------------
Epoch 3/300 - Loss: 0.2642, Accuracy: 59.54459396258503%
-----------------------------------------------
Epoch 4/300 - Loss: 0.2551, Accuracy: 59.86257653061225%
-----------------------------------------------
Epoch 5/300 - Loss: 0.2483, Accuracy: 60.191162840136045%
-----------------------------------------------
Epoch 6/300 - Loss: 0.2427, Accuracy: 60.7926955782313%
-----------------------------------------------
Epoch 7/300 - Loss: 0.2378, Accuracy: 61.68807823129252%
-----------------------------------------------
Epoch 8/300 - Loss: 0.2335, Accuracy: 62.490376275510194%
-----------------------------------------------
Epoch 9/300 - Loss: 0.2297, Accuracy: 63.13521045918367%
-----------------------------------------------
Epoch 10/300 - Loss: 0.2262, Accuracy: 63.6871449829932%
-----------------------------------------------
Epoch 11/300 - Loss: 0.2229, Accuracy: 64.15137967687075%
-----------------------------------------------
Epoch 12/300 - Loss: 0.2199, Accuracy: 64.5486224489796%
-----------------------------------------------
Epoch 13/300 - Loss: 0.2170, Accuracy: 64.89455782312926%
-----------------------------------------------
Epoch 14/300 - Loss: 0.2143, Accuracy: 65.20010416666666%
-----------------------------------------------
Epoch 15/300 - Loss: 0.2117, Accuracy: 65.47606717687076%
-----------------------------------------------
Epoch 16/300 - Loss: 0.2092, Accuracy: 65.72524234693878%
-----------------------------------------------
Epoch 17/300 - Loss: 0.2068, Accuracy: 65.9536755952381%
-----------------------------------------------
Epoch 18/300 - Loss: 0.2045, Accuracy: 66.1662138605442%
-----------------------------------------------
Epoch 19/300 - Loss: 0.2023, Accuracy: 66.36696428571429%
-----------------------------------------------
Epoch 20/300 - Loss: 0.2001, Accuracy: 66.5596449829932%
-----------------------------------------------
Epoch 21/300 - Loss: 0.1980, Accuracy: 66.74392644557823%
-----------------------------------------------
Epoch 22/300 - Loss: 0.1960, Accuracy: 66.92299319727891%
-----------------------------------------------
Epoch 23/300 - Loss: 0.1940, Accuracy: 67.09876700680272%
-----------------------------------------------
Epoch 24/300 - Loss: 0.1921, Accuracy: 67.27059948979593%
-----------------------------------------------
Epoch 25/300 - Loss: 0.1902, Accuracy: 67.44163052721088%
-----------------------------------------------
Epoch 26/300 - Loss: 0.1884, Accuracy: 67.61135204081631%
-----------------------------------------------
Epoch 27/300 - Loss: 0.1866, Accuracy: 67.78029336734694%
-----------------------------------------------
Epoch 28/300 - Loss: 0.1849, Accuracy: 67.95316964285713%
-----------------------------------------------
Epoch 29/300 - Loss: 0.1832, Accuracy: 68.12602253401361%
-----------------------------------------------
Epoch 30/300 - Loss: 0.1816, Accuracy: 68.30124362244898%
-----------------------------------------------
Epoch 31/300 - Loss: 0.1800, Accuracy: 68.48010416666666%
-----------------------------------------------
Epoch 32/300 - Loss: 0.1784, Accuracy: 68.66144557823128%
-----------------------------------------------
Epoch 33/300 - Loss: 0.1769, Accuracy: 68.84751488095237%
-----------------------------------------------
Epoch 34/300 - Loss: 0.1754, Accuracy: 69.0386118197279%
-----------------------------------------------
Epoch 35/300 - Loss: 0.1740, Accuracy: 69.23223852040816%
-----------------------------------------------
Epoch 36/300 - Loss: 0.1725, Accuracy: 69.42930484693878%
-----------------------------------------------
Epoch 37/300 - Loss: 0.1711, Accuracy: 69.62935161564626%
-----------------------------------------------
Epoch 38/300 - Loss: 0.1698, Accuracy: 69.83399872448979%
-----------------------------------------------
Epoch 39/300 - Loss: 0.1685, Accuracy: 70.0400531462585%
-----------------------------------------------
Epoch 40/300 - Loss: 0.1672, Accuracy: 70.24960671768709%
-----------------------------------------------
Epoch 41/300 - Loss: 0.1659, Accuracy: 70.4613350340136%
-----------------------------------------------
Epoch 42/300 - Loss: 0.1647, Accuracy: 70.67481292517007%
-----------------------------------------------
Epoch 43/300 - Loss: 0.1634, Accuracy: 70.88984056122449%
-----------------------------------------------
Epoch 44/300 - Loss: 0.1623, Accuracy: 71.10813775510204%
-----------------------------------------------
Epoch 45/300 - Loss: 0.1611, Accuracy: 71.32588010204081%
-----------------------------------------------
Epoch 46/300 - Loss: 0.1600, Accuracy: 71.54409863945578%
-----------------------------------------------
Epoch 47/300 - Loss: 0.1588, Accuracy: 71.76318664965986%
-----------------------------------------------
Epoch 48/300 - Loss: 0.1578, Accuracy: 71.98220238095239%
-----------------------------------------------
Epoch 49/300 - Loss: 0.1567, Accuracy: 72.20055484693877%
-----------------------------------------------
Epoch 50/300 - Loss: 0.1556, Accuracy: 72.4177657312925%
-----------------------------------------------
Epoch 51/300 - Loss: 0.1546, Accuracy: 72.63408163265306%
-----------------------------------------------
Epoch 52/300 - Loss: 0.1536, Accuracy: 72.84906887755102%
-----------------------------------------------
Epoch 53/300 - Loss: 0.1526, Accuracy: 73.06284651360544%
-----------------------------------------------
Epoch 54/300 - Loss: 0.1517, Accuracy: 73.27646896258501%
-----------------------------------------------
Epoch 55/300 - Loss: 0.1507, Accuracy: 73.48695365646259%
-----------------------------------------------
Epoch 56/300 - Loss: 0.1498, Accuracy: 73.69687074829933%
-----------------------------------------------
Epoch 57/300 - Loss: 0.1489, Accuracy: 73.90308035714285%
-----------------------------------------------
Epoch 58/300 - Loss: 0.1480, Accuracy: 74.10887542517007%
-----------------------------------------------
Epoch 59/300 - Loss: 0.1471, Accuracy: 74.31372661564627%
-----------------------------------------------
Epoch 60/300 - Loss: 0.1463, Accuracy: 74.51477678571429%
-----------------------------------------------
Epoch 61/300 - Loss: 0.1455, Accuracy: 74.71266794217686%
-----------------------------------------------
Epoch 62/300 - Loss: 0.1446, Accuracy: 74.90875212585033%
-----------------------------------------------
Epoch 63/300 - Loss: 0.1438, Accuracy: 75.10416028911564%
-----------------------------------------------
Epoch 64/300 - Loss: 0.1430, Accuracy: 75.29636692176871%
-----------------------------------------------
Epoch 65/300 - Loss: 0.1422, Accuracy: 75.48600552721089%
-----------------------------------------------
Epoch 66/300 - Loss: 0.1415, Accuracy: 75.6727019557823%
-----------------------------------------------
Epoch 67/300 - Loss: 0.1407, Accuracy: 75.85758078231292%
-----------------------------------------------
Epoch 68/300 - Loss: 0.1400, Accuracy: 76.04020408163265%
-----------------------------------------------
Epoch 69/300 - Loss: 0.1393, Accuracy: 76.2205505952381%
-----------------------------------------------
Epoch 70/300 - Loss: 0.1386, Accuracy: 76.39901360544216%
-----------------------------------------------
Epoch 71/300 - Loss: 0.1379, Accuracy: 76.57425170068028%
-----------------------------------------------
Epoch 72/300 - Loss: 0.1372, Accuracy: 76.74664965986395%
-----------------------------------------------
Epoch 73/300 - Loss: 0.1365, Accuracy: 76.9166050170068%
-----------------------------------------------
Epoch 74/300 - Loss: 0.1358, Accuracy: 77.08435799319729%
-----------------------------------------------
Epoch 75/300 - Loss: 0.1352, Accuracy: 77.25115646258503%
-----------------------------------------------
Epoch 76/300 - Loss: 0.1346, Accuracy: 77.41463860544219%
-----------------------------------------------
Epoch 77/300 - Loss: 0.1339, Accuracy: 77.5760693027211%
-----------------------------------------------
Epoch 78/300 - Loss: 0.1333, Accuracy: 77.73596301020407%
-----------------------------------------------
Epoch 79/300 - Loss: 0.1327, Accuracy: 77.8919238945578%
-----------------------------------------------
Epoch 80/300 - Loss: 0.1321, Accuracy: 78.04741284013605%
-----------------------------------------------
Epoch 81/300 - Loss: 0.1315, Accuracy: 78.19900510204081%
-----------------------------------------------
Epoch 82/300 - Loss: 0.1309, Accuracy: 78.34852040816327%
-----------------------------------------------
Epoch 83/300 - Loss: 0.1304, Accuracy: 78.49628188775512%
-----------------------------------------------
Epoch 84/300 - Loss: 0.1298, Accuracy: 78.64163477891157%
-----------------------------------------------
Epoch 85/300 - Loss: 0.1293, Accuracy: 78.78530612244896%
-----------------------------------------------
Epoch 86/300 - Loss: 0.1287, Accuracy: 78.92593112244897%
-----------------------------------------------
Epoch 87/300 - Loss: 0.1282, Accuracy: 79.0643494897959%
-----------------------------------------------
Epoch 88/300 - Loss: 0.1277, Accuracy: 79.20223852040816%
-----------------------------------------------
Epoch 89/300 - Loss: 0.1271, Accuracy: 79.33728528911566%
-----------------------------------------------
Epoch 90/300 - Loss: 0.1266, Accuracy: 79.46964710884355%
-----------------------------------------------
Epoch 91/300 - Loss: 0.1261, Accuracy: 79.60085884353741%
-----------------------------------------------
Epoch 92/300 - Loss: 0.1256, Accuracy: 79.73090348639454%
-----------------------------------------------
Epoch 93/300 - Loss: 0.1251, Accuracy: 79.85830782312925%
-----------------------------------------------
Epoch 94/300 - Loss: 0.1247, Accuracy: 79.98409226190476%
-----------------------------------------------
Epoch 95/300 - Loss: 0.1242, Accuracy: 80.10799107142856%
-----------------------------------------------
Epoch 96/300 - Loss: 0.1237, Accuracy: 80.23015518707484%
-----------------------------------------------
Epoch 97/300 - Loss: 0.1233, Accuracy: 80.34992134353742%
-----------------------------------------------
Epoch 98/300 - Loss: 0.1228, Accuracy: 80.46855442176872%
-----------------------------------------------
Epoch 99/300 - Loss: 0.1224, Accuracy: 80.58509778911565%
-----------------------------------------------
Epoch 100/300 - Loss: 0.1219, Accuracy: 80.70156462585032%
-----------------------------------------------
Epoch 101/300 - Loss: 0.1215, Accuracy: 80.81525935374151%
-----------------------------------------------
Epoch 102/300 - Loss: 0.1211, Accuracy: 80.92789753401361%
-----------------------------------------------
Epoch 103/300 - Loss: 0.1206, Accuracy: 81.03822704081632%
-----------------------------------------------
Epoch 104/300 - Loss: 0.1202, Accuracy: 81.14762967687075%
-----------------------------------------------
Epoch 105/300 - Loss: 0.1198, Accuracy: 81.2553273809524%
-----------------------------------------------
Epoch 106/300 - Loss: 0.1194, Accuracy: 81.3615837585034%
-----------------------------------------------
Epoch 107/300 - Loss: 0.1190, Accuracy: 81.46674744897958%
-----------------------------------------------
Epoch 108/300 - Loss: 0.1186, Accuracy: 81.5706101190476%
-----------------------------------------------
Epoch 109/300 - Loss: 0.1182, Accuracy: 81.67400722789117%
-----------------------------------------------
Epoch 110/300 - Loss: 0.1179, Accuracy: 81.77440263605443%
-----------------------------------------------
Epoch 111/300 - Loss: 0.1175, Accuracy: 81.87405824829932%
-----------------------------------------------
Epoch 112/300 - Loss: 0.1171, Accuracy: 81.97249787414965%
-----------------------------------------------
Epoch 113/300 - Loss: 0.1167, Accuracy: 82.06988732993197%
-----------------------------------------------
Epoch 114/300 - Loss: 0.1164, Accuracy: 82.16553784013607%
-----------------------------------------------
Epoch 115/300 - Loss: 0.1160, Accuracy: 82.26045280612246%
-----------------------------------------------
Epoch 116/300 - Loss: 0.1157, Accuracy: 82.35401573129252%
-----------------------------------------------
Epoch 117/300 - Loss: 0.1153, Accuracy: 82.44610544217687%
-----------------------------------------------
Epoch 118/300 - Loss: 0.1150, Accuracy: 82.53726615646258%
-----------------------------------------------
Epoch 119/300 - Loss: 0.1146, Accuracy: 82.6276700680272%
-----------------------------------------------
Epoch 120/300 - Loss: 0.1143, Accuracy: 82.71644982993197%
-----------------------------------------------
Epoch 121/300 - Loss: 0.1140, Accuracy: 82.80413265306123%
-----------------------------------------------
Epoch 122/300 - Loss: 0.1137, Accuracy: 82.8910055272109%
-----------------------------------------------
Epoch 123/300 - Loss: 0.1133, Accuracy: 82.97706632653062%
-----------------------------------------------
Epoch 124/300 - Loss: 0.1130, Accuracy: 83.0606462585034%
-----------------------------------------------
Epoch 125/300 - Loss: 0.1127, Accuracy: 83.14452168367346%
-----------------------------------------------
Epoch 126/300 - Loss: 0.1124, Accuracy: 83.22775085034014%
-----------------------------------------------
Epoch 127/300 - Loss: 0.1121, Accuracy: 83.30972576530613%
-----------------------------------------------
Epoch 128/300 - Loss: 0.1118, Accuracy: 83.39073341836735%
-----------------------------------------------
Epoch 129/300 - Loss: 0.1115, Accuracy: 83.47102465986397%
-----------------------------------------------
Epoch 130/300 - Loss: 0.1112, Accuracy: 83.54950042517005%
-----------------------------------------------
Epoch 131/300 - Loss: 0.1109, Accuracy: 83.62721726190478%
-----------------------------------------------
Epoch 132/300 - Loss: 0.1106, Accuracy: 83.7051169217687%
-----------------------------------------------
Epoch 133/300 - Loss: 0.1103, Accuracy: 83.78185161564625%
-----------------------------------------------
Epoch 134/300 - Loss: 0.1100, Accuracy: 83.85693027210885%
-----------------------------------------------
Epoch 135/300 - Loss: 0.1098, Accuracy: 83.93068452380952%
-----------------------------------------------
Epoch 136/300 - Loss: 0.1095, Accuracy: 84.00417942176868%
-----------------------------------------------
Epoch 137/300 - Loss: 0.1092, Accuracy: 84.07722789115647%
-----------------------------------------------
Epoch 138/300 - Loss: 0.1089, Accuracy: 84.14890093537414%
-----------------------------------------------
Epoch 139/300 - Loss: 0.1087, Accuracy: 84.22018494897958%
-----------------------------------------------
Epoch 140/300 - Loss: 0.1084, Accuracy: 84.29019557823129%
-----------------------------------------------
Epoch 141/300 - Loss: 0.1082, Accuracy: 84.35921343537414%
-----------------------------------------------
Epoch 142/300 - Loss: 0.1079, Accuracy: 84.42848426870748%
-----------------------------------------------
Epoch 143/300 - Loss: 0.1076, Accuracy: 84.49693239795918%
-----------------------------------------------
Epoch 144/300 - Loss: 0.1074, Accuracy: 84.56441326530611%
-----------------------------------------------
Epoch 145/300 - Loss: 0.1071, Accuracy: 84.63088647959185%
-----------------------------------------------
Epoch 146/300 - Loss: 0.1069, Accuracy: 84.69667304421769%
-----------------------------------------------
Epoch 147/300 - Loss: 0.1067, Accuracy: 84.76183460884354%
-----------------------------------------------
Epoch 148/300 - Loss: 0.1064, Accuracy: 84.8258099489796%
-----------------------------------------------
Epoch 149/300 - Loss: 0.1062, Accuracy: 84.88948341836733%
-----------------------------------------------
Epoch 150/300 - Loss: 0.1059, Accuracy: 84.95215348639456%
-----------------------------------------------
Epoch 151/300 - Loss: 0.1057, Accuracy: 85.01491921768707%
-----------------------------------------------
Epoch 152/300 - Loss: 0.1055, Accuracy: 85.07703656462586%
-----------------------------------------------
Epoch 153/300 - Loss: 0.1053, Accuracy: 85.13834608843538%
-----------------------------------------------
Epoch 154/300 - Loss: 0.1050, Accuracy: 85.19956420068027%
-----------------------------------------------
Epoch 155/300 - Loss: 0.1048, Accuracy: 85.25963647959183%
-----------------------------------------------
Epoch 156/300 - Loss: 0.1046, Accuracy: 85.3188818027211%
-----------------------------------------------
Epoch 157/300 - Loss: 0.1044, Accuracy: 85.37826530612244%
-----------------------------------------------
Epoch 158/300 - Loss: 0.1042, Accuracy: 85.43674957482993%
-----------------------------------------------
Epoch 159/300 - Loss: 0.1039, Accuracy: 85.49396471088436%
-----------------------------------------------
Epoch 160/300 - Loss: 0.1037, Accuracy: 85.55076530612244%
-----------------------------------------------
Epoch 161/300 - Loss: 0.1035, Accuracy: 85.60738095238094%
-----------------------------------------------
Epoch 162/300 - Loss: 0.1033, Accuracy: 85.66349489795918%
-----------------------------------------------
Epoch 163/300 - Loss: 0.1031, Accuracy: 85.7186968537415%
-----------------------------------------------
Epoch 164/300 - Loss: 0.1029, Accuracy: 85.77351615646258%
-----------------------------------------------
Epoch 165/300 - Loss: 0.1027, Accuracy: 85.82728528911565%
-----------------------------------------------
Epoch 166/300 - Loss: 0.1025, Accuracy: 85.88081845238096%
-----------------------------------------------
Epoch 167/300 - Loss: 0.1023, Accuracy: 85.93363095238095%
-----------------------------------------------
Epoch 168/300 - Loss: 0.1021, Accuracy: 85.98629889455783%
-----------------------------------------------
Epoch 169/300 - Loss: 0.1019, Accuracy: 86.03874362244898%
-----------------------------------------------
Epoch 170/300 - Loss: 0.1017, Accuracy: 86.09057610544217%
-----------------------------------------------
Epoch 171/300 - Loss: 0.1015, Accuracy: 86.14133503401361%
-----------------------------------------------
Epoch 172/300 - Loss: 0.1014, Accuracy: 86.19220238095238%
-----------------------------------------------
Epoch 173/300 - Loss: 0.1012, Accuracy: 86.24275722789115%
-----------------------------------------------
Epoch 174/300 - Loss: 0.1010, Accuracy: 86.29217049319729%
-----------------------------------------------
Epoch 175/300 - Loss: 0.1008, Accuracy: 86.34148809523808%
-----------------------------------------------
Epoch 176/300 - Loss: 0.1006, Accuracy: 86.39021258503402%
-----------------------------------------------
Epoch 177/300 - Loss: 0.1004, Accuracy: 86.43876913265306%
-----------------------------------------------
Epoch 178/300 - Loss: 0.1003, Accuracy: 86.48727465986396%
-----------------------------------------------
Epoch 179/300 - Loss: 0.1001, Accuracy: 86.5337287414966%
-----------------------------------------------
Epoch 180/300 - Loss: 0.0999, Accuracy: 86.58104379251701%
-----------------------------------------------
Epoch 181/300 - Loss: 0.0998, Accuracy: 86.62764030612244%
-----------------------------------------------
Epoch 182/300 - Loss: 0.0996, Accuracy: 86.6739880952381%
-----------------------------------------------
Epoch 183/300 - Loss: 0.0994, Accuracy: 86.71962797619047%
-----------------------------------------------
Epoch 184/300 - Loss: 0.0992, Accuracy: 86.7653167517007%
-----------------------------------------------
Epoch 185/300 - Loss: 0.0991, Accuracy: 86.810518707483%
-----------------------------------------------
Epoch 186/300 - Loss: 0.0989, Accuracy: 86.85568452380953%
-----------------------------------------------
Epoch 187/300 - Loss: 0.0988, Accuracy: 86.89962159863944%
-----------------------------------------------
Epoch 188/300 - Loss: 0.0986, Accuracy: 86.94323979591837%
-----------------------------------------------
Epoch 189/300 - Loss: 0.0984, Accuracy: 86.98582908163264%
-----------------------------------------------
Epoch 190/300 - Loss: 0.0983, Accuracy: 87.02930909863946%
-----------------------------------------------
Epoch 191/300 - Loss: 0.0981, Accuracy: 87.07177933673469%
-----------------------------------------------
Epoch 192/300 - Loss: 0.0980, Accuracy: 87.11378613945578%
-----------------------------------------------
Epoch 193/300 - Loss: 0.0978, Accuracy: 87.15557823129251%
-----------------------------------------------
Epoch 194/300 - Loss: 0.0977, Accuracy: 87.19712372448978%
-----------------------------------------------
Epoch 195/300 - Loss: 0.0975, Accuracy: 87.23851403061225%
-----------------------------------------------
Epoch 196/300 - Loss: 0.0974, Accuracy: 87.27918792517006%
-----------------------------------------------
Epoch 197/300 - Loss: 0.0972, Accuracy: 87.3197300170068%
-----------------------------------------------
Epoch 198/300 - Loss: 0.0971, Accuracy: 87.36064413265305%
-----------------------------------------------
Epoch 199/300 - Loss: 0.0969, Accuracy: 87.40038265306123%
-----------------------------------------------
Epoch 200/300 - Loss: 0.0968, Accuracy: 87.43974489795917%
-----------------------------------------------
Epoch 201/300 - Loss: 0.0966, Accuracy: 87.47894557823128%
-----------------------------------------------
Epoch 202/300 - Loss: 0.0965, Accuracy: 87.5177274659864%
-----------------------------------------------
Epoch 203/300 - Loss: 0.0964, Accuracy: 87.55659863945579%
-----------------------------------------------
Epoch 204/300 - Loss: 0.0962, Accuracy: 87.5947087585034%
-----------------------------------------------
Epoch 205/300 - Loss: 0.0961, Accuracy: 87.63267431972788%
-----------------------------------------------
Epoch 206/300 - Loss: 0.0959, Accuracy: 87.67059736394559%
-----------------------------------------------
Epoch 207/300 - Loss: 0.0958, Accuracy: 87.70821428571429%
-----------------------------------------------
Epoch 208/300 - Loss: 0.0957, Accuracy: 87.7453975340136%
-----------------------------------------------
Epoch 209/300 - Loss: 0.0955, Accuracy: 87.78224914965986%
-----------------------------------------------
Epoch 210/300 - Loss: 0.0954, Accuracy: 87.81855229591838%
-----------------------------------------------
Epoch 211/300 - Loss: 0.0953, Accuracy: 87.85494472789117%
-----------------------------------------------
Epoch 212/300 - Loss: 0.0951, Accuracy: 87.89059523809523%
-----------------------------------------------
Epoch 213/300 - Loss: 0.0950, Accuracy: 87.92584183673469%
-----------------------------------------------
Epoch 214/300 - Loss: 0.0949, Accuracy: 87.96110331632653%
-----------------------------------------------
Epoch 215/300 - Loss: 0.0948, Accuracy: 87.99615646258503%
-----------------------------------------------
Epoch 216/300 - Loss: 0.0946, Accuracy: 88.03028486394558%
-----------------------------------------------
Epoch 217/300 - Loss: 0.0945, Accuracy: 88.06378613945579%
-----------------------------------------------
Epoch 218/300 - Loss: 0.0944, Accuracy: 88.09770408163266%
-----------------------------------------------
Epoch 219/300 - Loss: 0.0943, Accuracy: 88.1313988095238%
-----------------------------------------------
Epoch 220/300 - Loss: 0.0941, Accuracy: 88.16492772108843%
-----------------------------------------------
Epoch 221/300 - Loss: 0.0940, Accuracy: 88.19837159863945%
-----------------------------------------------
Epoch 222/300 - Loss: 0.0939, Accuracy: 88.23138392857143%
-----------------------------------------------
Epoch 223/300 - Loss: 0.0938, Accuracy: 88.26375425170069%
-----------------------------------------------
Epoch 224/300 - Loss: 0.0937, Accuracy: 88.29575892857142%
-----------------------------------------------
Epoch 225/300 - Loss: 0.0935, Accuracy: 88.32774022108845%
-----------------------------------------------
Epoch 226/300 - Loss: 0.0934, Accuracy: 88.36012542517007%
-----------------------------------------------
Epoch 227/300 - Loss: 0.0933, Accuracy: 88.39228954081632%
-----------------------------------------------
Epoch 228/300 - Loss: 0.0932, Accuracy: 88.4240837585034%
-----------------------------------------------
Epoch 229/300 - Loss: 0.0931, Accuracy: 88.45520408163266%
-----------------------------------------------
Epoch 230/300 - Loss: 0.0930, Accuracy: 88.48663477891158%
-----------------------------------------------
Epoch 231/300 - Loss: 0.0929, Accuracy: 88.51725977891157%
-----------------------------------------------
Epoch 232/300 - Loss: 0.0928, Accuracy: 88.54776360544217%
-----------------------------------------------
Epoch 233/300 - Loss: 0.0926, Accuracy: 88.57820153061225%
-----------------------------------------------
Epoch 234/300 - Loss: 0.0925, Accuracy: 88.608856292517%
-----------------------------------------------
Epoch 235/300 - Loss: 0.0924, Accuracy: 88.63859481292516%
-----------------------------------------------
Epoch 236/300 - Loss: 0.0923, Accuracy: 88.66801232993198%
-----------------------------------------------
Epoch 237/300 - Loss: 0.0922, Accuracy: 88.69778911564626%
-----------------------------------------------
Epoch 238/300 - Loss: 0.0921, Accuracy: 88.72727891156462%
-----------------------------------------------
Epoch 239/300 - Loss: 0.0920, Accuracy: 88.7560161564626%
-----------------------------------------------
Epoch 240/300 - Loss: 0.0919, Accuracy: 88.78497023809526%
-----------------------------------------------
Epoch 241/300 - Loss: 0.0918, Accuracy: 88.8137861394558%
-----------------------------------------------
Epoch 242/300 - Loss: 0.0917, Accuracy: 88.84277848639455%
-----------------------------------------------
Epoch 243/300 - Loss: 0.0916, Accuracy: 88.87041241496601%
-----------------------------------------------
Epoch 244/300 - Loss: 0.0915, Accuracy: 88.89855442176872%
-----------------------------------------------
Epoch 245/300 - Loss: 0.0914, Accuracy: 88.92717261904761%
-----------------------------------------------
Epoch 246/300 - Loss: 0.0913, Accuracy: 88.95473426870748%
-----------------------------------------------
Epoch 247/300 - Loss: 0.0912, Accuracy: 88.98225127551021%
-----------------------------------------------
Epoch 248/300 - Loss: 0.0911, Accuracy: 89.01001275510203%
-----------------------------------------------
Epoch 249/300 - Loss: 0.0910, Accuracy: 89.03720238095238%
-----------------------------------------------
Epoch 250/300 - Loss: 0.0909, Accuracy: 89.06392431972789%
-----------------------------------------------
Epoch 251/300 - Loss: 0.0908, Accuracy: 89.09050170068028%
-----------------------------------------------
Epoch 252/300 - Loss: 0.0907, Accuracy: 89.1168324829932%
-----------------------------------------------
Epoch 253/300 - Loss: 0.0906, Accuracy: 89.14342474489796%
-----------------------------------------------
Epoch 254/300 - Loss: 0.0905, Accuracy: 89.16982568027211%
-----------------------------------------------
Epoch 255/300 - Loss: 0.0904, Accuracy: 89.19584821428572%
-----------------------------------------------
Epoch 256/300 - Loss: 0.0903, Accuracy: 89.22133715986395%
-----------------------------------------------
Epoch 257/300 - Loss: 0.0902, Accuracy: 89.24692602040815%
-----------------------------------------------
Epoch 258/300 - Loss: 0.0902, Accuracy: 89.27226190476189%
-----------------------------------------------
Epoch 259/300 - Loss: 0.0901, Accuracy: 89.29779124149661%
-----------------------------------------------
Epoch 260/300 - Loss: 0.0900, Accuracy: 89.32320790816325%
-----------------------------------------------
Epoch 261/300 - Loss: 0.0899, Accuracy: 89.3479081632653%
-----------------------------------------------
Epoch 262/300 - Loss: 0.0898, Accuracy: 89.37269557823129%
-----------------------------------------------
Epoch 263/300 - Loss: 0.0897, Accuracy: 89.39745535714285%
-----------------------------------------------
Epoch 264/300 - Loss: 0.0896, Accuracy: 89.42184311224489%
-----------------------------------------------
Epoch 265/300 - Loss: 0.0895, Accuracy: 89.44592261904762%
-----------------------------------------------
Epoch 266/300 - Loss: 0.0894, Accuracy: 89.47031037414966%
-----------------------------------------------
Epoch 267/300 - Loss: 0.0894, Accuracy: 89.49429634353743%
-----------------------------------------------
Epoch 268/300 - Loss: 0.0893, Accuracy: 89.51837159863945%
-----------------------------------------------
Epoch 269/300 - Loss: 0.0892, Accuracy: 89.54237882653062%
-----------------------------------------------
Epoch 270/300 - Loss: 0.0891, Accuracy: 89.56562074829932%
-----------------------------------------------
Epoch 271/300 - Loss: 0.0890, Accuracy: 89.58910289115644%
-----------------------------------------------
Epoch 272/300 - Loss: 0.0889, Accuracy: 89.61209183673469%
-----------------------------------------------
Epoch 273/300 - Loss: 0.0889, Accuracy: 89.63487032312926%
-----------------------------------------------
Epoch 274/300 - Loss: 0.0888, Accuracy: 89.65747023809523%
-----------------------------------------------
Epoch 275/300 - Loss: 0.0887, Accuracy: 89.68029761904764%
-----------------------------------------------
Epoch 276/300 - Loss: 0.0886, Accuracy: 89.70245535714285%
-----------------------------------------------
Epoch 277/300 - Loss: 0.0885, Accuracy: 89.724693877551%
-----------------------------------------------
Epoch 278/300 - Loss: 0.0885, Accuracy: 89.74709821428571%
-----------------------------------------------
Epoch 279/300 - Loss: 0.0884, Accuracy: 89.76947704081633%
-----------------------------------------------
Epoch 280/300 - Loss: 0.0883, Accuracy: 89.79118622448979%
-----------------------------------------------
Epoch 281/300 - Loss: 0.0882, Accuracy: 89.81309948979592%
-----------------------------------------------
Epoch 282/300 - Loss: 0.0881, Accuracy: 89.83486394557822%
-----------------------------------------------
Epoch 283/300 - Loss: 0.0881, Accuracy: 89.85632015306122%
-----------------------------------------------
Epoch 284/300 - Loss: 0.0880, Accuracy: 89.87774022108842%
-----------------------------------------------
Epoch 285/300 - Loss: 0.0879, Accuracy: 89.89849702380954%
-----------------------------------------------
Epoch 286/300 - Loss: 0.0878, Accuracy: 89.91962372448981%
-----------------------------------------------
Epoch 287/300 - Loss: 0.0878, Accuracy: 89.94054421768706%
-----------------------------------------------
Epoch 288/300 - Loss: 0.0877, Accuracy: 89.96135629251702%
-----------------------------------------------
Epoch 289/300 - Loss: 0.0876, Accuracy: 89.98165816326531%
-----------------------------------------------
Epoch 290/300 - Loss: 0.0876, Accuracy: 90.00233418367348%
-----------------------------------------------
Epoch 291/300 - Loss: 0.0875, Accuracy: 90.02246173469388%
-----------------------------------------------
Epoch 292/300 - Loss: 0.0874, Accuracy: 90.04333333333334%
-----------------------------------------------
Epoch 293/300 - Loss: 0.0873, Accuracy: 90.06367772108844%
-----------------------------------------------
Epoch 294/300 - Loss: 0.0873, Accuracy: 90.08428146258504%
-----------------------------------------------
Epoch 295/300 - Loss: 0.0872, Accuracy: 90.10412840136055%
-----------------------------------------------
Epoch 296/300 - Loss: 0.0871, Accuracy: 90.12427295918368%
-----------------------------------------------
Epoch 297/300 - Loss: 0.0871, Accuracy: 90.14402423469389%
-----------------------------------------------
Epoch 298/300 - Loss: 0.0870, Accuracy: 90.16344600340138%
-----------------------------------------------
Epoch 299/300 - Loss: 0.0869, Accuracy: 90.1827168367347%
-----------------------------------------------
Epoch 300/300 - Loss: 0.0868, Accuracy: 90.2019387755102%
# Testing the model
test_loss = autoencoder.evaluate(test_data, test_data)
print(f'Test Loss: {test_loss}')
n = 10
plt.figure(figsize=(20, 6))
for i in range(n):
# Original Image
ax = plt.subplot(3, n, i + 1)
plt.title("Original")
plt.imshow(test_data[i].reshape(28, 28))
plt.gray()
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
# Encoded Image
encoded_data = autoencoder.encoder.forward(test_data)
ax = plt.subplot(3, n, i + 1 + n)
plt.title("Encoded")
plt.imshow(encoded_data[i].reshape(16, 16))
plt.gray()
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
# Reconstructed Image
reconstructed_data = autoencoder.predict(test_data)
ax = plt.subplot(3, n, i + 1 + 2 * n)
plt.title("Reconstructed")
plt.imshow(reconstructed_data[i].reshape(28, 28))
plt.gray()
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
plt.tight_layout()
plt.show()