Upload main.ipynb
Browse files- main.ipynb +168 -43
main.ipynb
CHANGED
@@ -18,10 +18,10 @@
|
|
18 |
"name": "stderr",
|
19 |
"output_type": "stream",
|
20 |
"text": [
|
21 |
-
"2025-01-19
|
22 |
-
"2025-01-19
|
23 |
-
"2025-01-19
|
24 |
-
"2025-01-19
|
25 |
"To enable the following instructions: SSE4.1 SSE4.2 AVX AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n"
|
26 |
]
|
27 |
}
|
@@ -269,7 +269,7 @@
|
|
269 |
},
|
270 |
{
|
271 |
"cell_type": "code",
|
272 |
-
"execution_count":
|
273 |
"id": "c5c5e756-0735-4e6d-86a5-33009a44e199",
|
274 |
"metadata": {},
|
275 |
"outputs": [
|
@@ -278,26 +278,36 @@
|
|
278 |
"output_type": "stream",
|
279 |
"text": [
|
280 |
"Epoch 1/10\n",
|
281 |
-
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[
|
282 |
"Epoch 2/10\n",
|
283 |
-
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m16s\u001b[0m 9ms/step - accuracy: 0.
|
284 |
"Epoch 3/10\n",
|
285 |
-
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m16s\u001b[0m 9ms/step - accuracy: 0.
|
286 |
"Epoch 4/10\n",
|
287 |
-
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m15s\u001b[0m 8ms/step - accuracy: 0.
|
288 |
"Epoch 5/10\n",
|
289 |
-
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m16s\u001b[0m
|
290 |
"Epoch 6/10\n",
|
291 |
-
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[
|
292 |
"Epoch 7/10\n",
|
293 |
-
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m16s\u001b[0m 9ms/step - accuracy: 0.
|
294 |
"Epoch 8/10\n",
|
295 |
-
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[
|
296 |
"Epoch 9/10\n",
|
297 |
-
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[
|
298 |
"Epoch 10/10\n",
|
299 |
-
"\u001b[
|
300 |
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
301 |
}
|
302 |
],
|
303 |
"source": [
|
@@ -306,10 +316,19 @@
|
|
306 |
},
|
307 |
{
|
308 |
"cell_type": "code",
|
309 |
-
"execution_count":
|
310 |
"id": "3d879a06-4779-450b-a730-2fd403409392",
|
311 |
"metadata": {},
|
312 |
-
"outputs": [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
313 |
"source": [
|
314 |
"test_loss, test_acc = model.evaluate(test_images, test_labels)\n",
|
315 |
"print('Test accuracy:', test_acc)"
|
@@ -325,7 +344,7 @@
|
|
325 |
},
|
326 |
{
|
327 |
"cell_type": "code",
|
328 |
-
"execution_count":
|
329 |
"id": "5cc13e61-aebf-46e1-94b1-a20d369e0f7d",
|
330 |
"metadata": {},
|
331 |
"outputs": [],
|
@@ -355,12 +374,23 @@
|
|
355 |
},
|
356 |
{
|
357 |
"cell_type": "code",
|
358 |
-
"execution_count":
|
359 |
"id": "51fdf7c3-0016-4bd6-a99f-9ffebfffd6cf",
|
360 |
"metadata": {
|
361 |
"scrolled": true
|
362 |
},
|
363 |
-
"outputs": [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
364 |
"source": [
|
365 |
"# Filter the images to get only those with label '2' for better understanding and comparison\n",
|
366 |
"label_of_interest = 2\n",
|
@@ -393,7 +423,7 @@
|
|
393 |
},
|
394 |
{
|
395 |
"cell_type": "code",
|
396 |
-
"execution_count":
|
397 |
"id": "0e468ad2-5c10-461d-b39f-38ef3a56b826",
|
398 |
"metadata": {},
|
399 |
"outputs": [],
|
@@ -405,10 +435,47 @@
|
|
405 |
},
|
406 |
{
|
407 |
"cell_type": "code",
|
408 |
-
"execution_count":
|
409 |
"id": "bb11d7d9-d7a9-495d-ae64-f4609fdbdfbd",
|
410 |
"metadata": {},
|
411 |
-
"outputs": [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
412 |
"source": [
|
413 |
"# Train the model using the augmented data generator\n",
|
414 |
"model.fit(datagen.flow(train_images, train_labels, batch_size=32), epochs=10)"
|
@@ -416,10 +483,19 @@
|
|
416 |
},
|
417 |
{
|
418 |
"cell_type": "code",
|
419 |
-
"execution_count":
|
420 |
"id": "5d4bbd2a-9e18-49dd-a555-d1841d5d68f2",
|
421 |
"metadata": {},
|
422 |
-
"outputs": [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
423 |
"source": [
|
424 |
"# Evaluate the model on the test set\n",
|
425 |
"augmented_test_loss, augmented_test_acc = model.evaluate(test_images, test_labels)\n",
|
@@ -428,10 +504,19 @@
|
|
428 |
},
|
429 |
{
|
430 |
"cell_type": "code",
|
431 |
-
"execution_count":
|
432 |
"id": "9a788df7-c878-49f6-86b5-e385be7bf842",
|
433 |
"metadata": {},
|
434 |
-
"outputs": [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
435 |
"source": [
|
436 |
"# Compare the model accuracy on the original set vs the augmented set\n",
|
437 |
"print('Simple test accuracy:', test_acc)\n",
|
@@ -448,7 +533,7 @@
|
|
448 |
},
|
449 |
{
|
450 |
"cell_type": "code",
|
451 |
-
"execution_count":
|
452 |
"id": "89cca745-bda4-4a8a-92f0-8d31d508cc8e",
|
453 |
"metadata": {},
|
454 |
"outputs": [],
|
@@ -474,7 +559,7 @@
|
|
474 |
},
|
475 |
{
|
476 |
"cell_type": "code",
|
477 |
-
"execution_count":
|
478 |
"id": "c1dfe2cf-86f9-4f36-8184-1dd566ece339",
|
479 |
"metadata": {},
|
480 |
"outputs": [],
|
@@ -484,22 +569,70 @@
|
|
484 |
},
|
485 |
{
|
486 |
"cell_type": "code",
|
487 |
-
"execution_count":
|
488 |
"id": "93ba283c-6a0f-49c8-adf6-505ac51cbece",
|
489 |
"metadata": {},
|
490 |
-
"outputs": [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
491 |
"source": [
|
492 |
-
"advanced_model.fit(datagen.flow(train_images, train_labels, batch_size=
|
493 |
" validation_data=(test_images, test_labels),\n",
|
494 |
" epochs=10)"
|
495 |
]
|
496 |
},
|
497 |
{
|
498 |
"cell_type": "code",
|
499 |
-
"execution_count":
|
500 |
"id": "ba5a04bc-f912-45ee-8c38-f860ae59687a",
|
501 |
"metadata": {},
|
502 |
-
"outputs": [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
503 |
"source": [
|
504 |
"advanced_test_loss, advanced_test_acc = advanced_model.evaluate(test_images, test_labels)\n",
|
505 |
"print('Simple test accuracy:', test_acc)\n",
|
@@ -509,7 +642,7 @@
|
|
509 |
},
|
510 |
{
|
511 |
"cell_type": "code",
|
512 |
-
"execution_count":
|
513 |
"id": "2178138b-5388-45a0-9e01-5cbae10e5bb9",
|
514 |
"metadata": {},
|
515 |
"outputs": [],
|
@@ -518,14 +651,6 @@
|
|
518 |
"if __name__ == \"__main__\":\n",
|
519 |
" pass # Prevent unintended execution during import"
|
520 |
]
|
521 |
-
},
|
522 |
-
{
|
523 |
-
"cell_type": "code",
|
524 |
-
"execution_count": null,
|
525 |
-
"id": "9b99f734-21dd-4621-b62f-8f2a88783f0b",
|
526 |
-
"metadata": {},
|
527 |
-
"outputs": [],
|
528 |
-
"source": []
|
529 |
}
|
530 |
],
|
531 |
"metadata": {
|
|
|
18 |
"name": "stderr",
|
19 |
"output_type": "stream",
|
20 |
"text": [
|
21 |
+
"2025-01-19 20:47:16.372082: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:485] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n",
|
22 |
+
"2025-01-19 20:47:16.396318: E external/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:8454] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n",
|
23 |
+
"2025-01-19 20:47:16.402421: E external/local_xla/xla/stream_executor/cuda/cuda_blas.cc:1452] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n",
|
24 |
+
"2025-01-19 20:47:16.420317: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n",
|
25 |
"To enable the following instructions: SSE4.1 SSE4.2 AVX AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n"
|
26 |
]
|
27 |
}
|
|
|
269 |
},
|
270 |
{
|
271 |
"cell_type": "code",
|
272 |
+
"execution_count": 13,
|
273 |
"id": "c5c5e756-0735-4e6d-86a5-33009a44e199",
|
274 |
"metadata": {},
|
275 |
"outputs": [
|
|
|
278 |
"output_type": "stream",
|
279 |
"text": [
|
280 |
"Epoch 1/10\n",
|
281 |
+
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m16s\u001b[0m 8ms/step - accuracy: 0.8804 - loss: 0.4226\n",
|
282 |
"Epoch 2/10\n",
|
283 |
+
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m16s\u001b[0m 9ms/step - accuracy: 0.9634 - loss: 0.1228\n",
|
284 |
"Epoch 3/10\n",
|
285 |
+
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m16s\u001b[0m 9ms/step - accuracy: 0.9766 - loss: 0.0772\n",
|
286 |
"Epoch 4/10\n",
|
287 |
+
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m15s\u001b[0m 8ms/step - accuracy: 0.9813 - loss: 0.0627\n",
|
288 |
"Epoch 5/10\n",
|
289 |
+
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m16s\u001b[0m 9ms/step - accuracy: 0.9869 - loss: 0.0447\n",
|
290 |
"Epoch 6/10\n",
|
291 |
+
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m16s\u001b[0m 8ms/step - accuracy: 0.9893 - loss: 0.0332\n",
|
292 |
"Epoch 7/10\n",
|
293 |
+
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m16s\u001b[0m 9ms/step - accuracy: 0.9926 - loss: 0.0250\n",
|
294 |
"Epoch 8/10\n",
|
295 |
+
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m16s\u001b[0m 8ms/step - accuracy: 0.9936 - loss: 0.0224\n",
|
296 |
"Epoch 9/10\n",
|
297 |
+
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m15s\u001b[0m 8ms/step - accuracy: 0.9942 - loss: 0.0187\n",
|
298 |
"Epoch 10/10\n",
|
299 |
+
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m15s\u001b[0m 8ms/step - accuracy: 0.9962 - loss: 0.0132\n"
|
300 |
]
|
301 |
+
},
|
302 |
+
{
|
303 |
+
"data": {
|
304 |
+
"text/plain": [
|
305 |
+
"<keras.src.callbacks.history.History at 0x781c2256aa10>"
|
306 |
+
]
|
307 |
+
},
|
308 |
+
"execution_count": 13,
|
309 |
+
"metadata": {},
|
310 |
+
"output_type": "execute_result"
|
311 |
}
|
312 |
],
|
313 |
"source": [
|
|
|
316 |
},
|
317 |
{
|
318 |
"cell_type": "code",
|
319 |
+
"execution_count": 14,
|
320 |
"id": "3d879a06-4779-450b-a730-2fd403409392",
|
321 |
"metadata": {},
|
322 |
+
"outputs": [
|
323 |
+
{
|
324 |
+
"name": "stdout",
|
325 |
+
"output_type": "stream",
|
326 |
+
"text": [
|
327 |
+
"\u001b[1m313/313\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 3ms/step - accuracy: 0.9739 - loss: 0.0968\n",
|
328 |
+
"Test accuracy: 0.9768999814987183\n"
|
329 |
+
]
|
330 |
+
}
|
331 |
+
],
|
332 |
"source": [
|
333 |
"test_loss, test_acc = model.evaluate(test_images, test_labels)\n",
|
334 |
"print('Test accuracy:', test_acc)"
|
|
|
344 |
},
|
345 |
{
|
346 |
"cell_type": "code",
|
347 |
+
"execution_count": 15,
|
348 |
"id": "5cc13e61-aebf-46e1-94b1-a20d369e0f7d",
|
349 |
"metadata": {},
|
350 |
"outputs": [],
|
|
|
374 |
},
|
375 |
{
|
376 |
"cell_type": "code",
|
377 |
+
"execution_count": 16,
|
378 |
"id": "51fdf7c3-0016-4bd6-a99f-9ffebfffd6cf",
|
379 |
"metadata": {
|
380 |
"scrolled": true
|
381 |
},
|
382 |
+
"outputs": [
|
383 |
+
{
|
384 |
+
"data": {
|
385 |
+
"image/png": "iVBORw0KGgoAAAANSUhEUgAABcAAAAExCAYAAABbMgFNAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAp70lEQVR4nO3da7CV5X03/muzT5zPiJzBjSAKCqIRFBMFDyN14okGbdPEUzVjGnsw6ZhJmrQeMknrNJN2mmo1g0NjEocEwRjiAUlIoyJqAwaNCggKAhsRRGAf2If1f/H8H/rYxFw/w4a9uPl8Znghfvf3uvbaa13rXj9upaJUKpUSAAAAAAAUTJfO3gAAAAAAABwKBuAAAAAAABSSATgAAAAAAIVkAA4AAAAAQCEZgAMAAAAAUEgG4AAAAAAAFJIBOAAAAAAAhWQADgAAAABAIRmAAwAAAABQSAbgR6j7778/VVRUpOeff75D+ioqKtJf/MVfdEjX/9v593//93/Q177wwgvps5/9bJo0aVLq1atXGjx4cDrvvPPSsmXLOnSPwKHhjALKmTMKKGfOKKCcOaM4EhmAU5a+//3vp5UrV6Zrr702LV68ON13332ptrY2zZo1K82fP7+ztwcc5ZxRQDlzRgHlzBkFlDNnVDFVdfYG4Hf527/923TXXXe97/dmz56dTj311HTbbbelT33qU520MwBnFFDenFFAOXNGAeXMGVVM7gAvsKampnTLLbekyZMnpz59+qT+/fun6dOnp8WLF3/g19xzzz1p3Lhxqba2Np144onpBz/4wW9ltm3blm688cY0fPjwVFNTk8aMGZP+4R/+IbW2tnbY3o855pjf+r3Kyso0derUtGnTpg5bB+g8ziignDmjgHLmjALKmTOKcuMO8AJrbm5OO3fuTJ///OfTsGHD0v79+9PSpUvT5ZdfnubNm/dbf2r18MMPp5/97GfptttuSz169Ejf/va301VXXZWqqqrSnDlzUkr/57D5yEc+krp06ZK+8pWvpLq6uvTMM8+kO+64I23cuDHNmzfv9+5p9OjRKaWUNm7c+KG/n9bW1vRf//Vf6aSTTvrQXwuUH2cUUM6cUUA5c0YB5cwZRdkpcUSaN29eKaVUeu6558Jf09raWmppaSldd911pSlTprzv36WUSt26dStt27btffkTTjihNHbs2AO/d+ONN5Z69uxZeuONN9739XfddVcppVR66aWX3tf51a9+9X25urq6Ul1dXXjP/68vfelLpZRSadGiRX/Q1wOHjzMKKGfOKKCcOaOAcuaM4kjkf4FScAsWLEhnnXVW6tmzZ6qqqkrV1dXpO9/5TvrNb37zW9lZs2alwYMHH/jnysrKNHfu3LRu3bq0efPmlFJKjzzySDr33HPT0KFDU2tr64FfF110UUoppeXLl//e/axbty6tW7fuQ38f9913X7rzzjvTLbfcki655JIP/fVAeXJGAeXMGQWUM2cUUM6cUZQTA/ACW7hwYfrEJz6Rhg0blr773e+mZ555Jj333HPp2muvTU1NTb+VP/bYYz/w9955552UUkr19fXpxz/+caqurn7fr//7n4Hs2LGjw7+PefPmpRtvvDHdcMMN6Z/+6Z86vB/oHM4ooJw5o4By5owCypkzinLj/wFeYN/97nfTmDFj0oMPPpgqKioO/H5zc/PvzG/btu0Df2/AgAEppZQGDhyYTj755HTnnXf+zo6hQ4ce7LbfZ968een6669Pn/70p9Pdd9/9vu8DOLI5o4By5owCypkzCihnzijKjQF4gVVUVKSampr3vUi3bdv2gX/r7pNPPpnq6+sP/GcnbW1t6cEHH0x1dXVp+PDhKaWULr744rRkyZJUV1eX+vXrd0j3f//996frr78+ffKTn0z33XefwwYKxhkFlDNnFFDOnFFAOXNGUW4MwI9wy5Yt+51/g+3s2bPTxRdfnBYuXJhuuummNGfOnLRp06Z0++23pyFDhqS1a9f+1tcMHDgwzZw5M/3d3/3dgb9195VXXkk/+MEPDmRuu+229MQTT6Qzzzwz3XzzzWn8+PGpqakpbdy4MS1ZsiTdfffdBw6n32Xs2LEppZT9/y4tWLAgXXfddWny5MnpxhtvTCtXrnzfv58yZUqqra39vR1A53NGAeXMGQWUM2cUUM6cURxROvtv4eQP83//1t0P+rVhw4ZSqVQqff3rXy+NHj26VFtbW5owYULp3nvvLX31q18t/e8ffUqp9NnPfrb07W9/u1RXV1eqrq4unXDCCaUHHnjgt9Z+++23SzfffHNpzJgxperq6lL//v1LU6dOLX3pS18q7d27932d//tv3R01alRp1KhR2e/v05/+dOj7A8qTM2rDh33IgMPIGbXhwz5kwGHkjNrwYR8y4DByRm34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176WzVx77bWhriuvvDKbGTp0aKhr48aN2Uzk89L3vve90HqvvvpqNhN9TFevXp3NvPvuu6GuNWvWZDN79uwJdb333nvZzI4dO0JdRecOcAAAAAAACskAHAAAAACAQjIABwAAAACgkAzAAQAAAAAoJANwAAAAAAAKyQAcAAAAAIBCMgAHAAAAAKCQDMABAAAAACikqo4sa2xsDOVmzpyZzZx44omhrsrKylDuSFYqlbKZ3bt3h7qeffbZbObuu+/OZl5//fXQelu2bMlmrr/++lBX3759Q7mIyPOma9euoa5Zs2ZlMy+88EKoiyNH9OwZP358NvOpT30q1HXhhRdmMz169Ah1HW7Nzc2h3MqVK7OZf//3f89mdu3aFVpv9erV2Ux9fX2oCzhydevWLZTbtGlTNrNnz55sJnomLl26NJv55S9/Gerav39/NhO55kwppSFDhmQz0bMz8j45evToUFefPn1COaBjRM67p59+OtT1sY99LJsZMGBAqCtyPVxVFRuFtLS0hHJwOETnCnfeeWc2c8YZZ4S6pk2bls3U1NSEuh577LFsZvHixdnM5s2bQ+tF7Ny5M5SLzMkqKipCXdHZKR3LHeAAAAAAABSSATgAAAAAAIVkAA4AAAAAQCEZgAMAAAAAUEgG4AAAAAAAFJIBOAAAAAAAhWQADgAAAABAIRmAAwAAAABQSAbgAAAAAAAUUlVHlr355puh3D333JPNzJkzJ9Q1bdq0bGbEiBGhrnK1cePGbObJJ58MdX3rW9/KZtasWRPqiujTp082c9FFF4W6jjnmmGymd+/eoa6ampps5sUXXwx1bdq0KZSjWAYNGhTKzZ07N5u54oorQl19+/YN5Q63V199NZu59957Q10PPPBANrN9+/ZQF0BUY2NjKLdhw4Zs5p//+Z+zmSlTpoTWW7hwYTbz85//PNTVkVavXp3NNDU1hbqam5uzmV27doW69u/fn81069atw7qi2traOqwLyknkdf7ss8+GuiKv84EDB4a6Lr300mwmekYtWLAgm+nZs2eoa9u2baEcfJDo+8nPfvazbCb62vyP//iPbGbnzp2hriNZ9MygfLkDHAAAAACAQjIABwAAAACgkAzAAQAAAAAoJANwAAAAAAAKyQAcAAAAAIBCMgAHAAAAAKCQDMABAAAAACgkA3AAAAAAAAqpolQqlULBiooOW7RP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",
|
386 |
+
"text/plain": [
|
387 |
+
"<Figure size 1500x300 with 5 Axes>"
|
388 |
+
]
|
389 |
+
},
|
390 |
+
"metadata": {},
|
391 |
+
"output_type": "display_data"
|
392 |
+
}
|
393 |
+
],
|
394 |
"source": [
|
395 |
"# Filter the images to get only those with label '2' for better understanding and comparison\n",
|
396 |
"label_of_interest = 2\n",
|
|
|
423 |
},
|
424 |
{
|
425 |
"cell_type": "code",
|
426 |
+
"execution_count": 17,
|
427 |
"id": "0e468ad2-5c10-461d-b39f-38ef3a56b826",
|
428 |
"metadata": {},
|
429 |
"outputs": [],
|
|
|
435 |
},
|
436 |
{
|
437 |
"cell_type": "code",
|
438 |
+
"execution_count": 19,
|
439 |
"id": "bb11d7d9-d7a9-495d-ae64-f4609fdbdfbd",
|
440 |
"metadata": {},
|
441 |
+
"outputs": [
|
442 |
+
{
|
443 |
+
"name": "stdout",
|
444 |
+
"output_type": "stream",
|
445 |
+
"text": [
|
446 |
+
"Epoch 1/10\n",
|
447 |
+
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m58s\u001b[0m 31ms/step - accuracy: 0.6399 - loss: 1.1305\n",
|
448 |
+
"Epoch 2/10\n",
|
449 |
+
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m57s\u001b[0m 30ms/step - accuracy: 0.7456 - loss: 0.8298\n",
|
450 |
+
"Epoch 3/10\n",
|
451 |
+
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m59s\u001b[0m 31ms/step - accuracy: 0.7830 - loss: 0.6953\n",
|
452 |
+
"Epoch 4/10\n",
|
453 |
+
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m58s\u001b[0m 31ms/step - accuracy: 0.8088 - loss: 0.6210\n",
|
454 |
+
"Epoch 5/10\n",
|
455 |
+
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m57s\u001b[0m 30ms/step - accuracy: 0.8225 - loss: 0.5732\n",
|
456 |
+
"Epoch 6/10\n",
|
457 |
+
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m56s\u001b[0m 30ms/step - accuracy: 0.8357 - loss: 0.5396\n",
|
458 |
+
"Epoch 7/10\n",
|
459 |
+
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m59s\u001b[0m 31ms/step - accuracy: 0.8414 - loss: 0.5202\n",
|
460 |
+
"Epoch 8/10\n",
|
461 |
+
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m53s\u001b[0m 28ms/step - accuracy: 0.8482 - loss: 0.5012\n",
|
462 |
+
"Epoch 9/10\n",
|
463 |
+
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m54s\u001b[0m 29ms/step - accuracy: 0.8566 - loss: 0.4772\n",
|
464 |
+
"Epoch 10/10\n",
|
465 |
+
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m57s\u001b[0m 30ms/step - accuracy: 0.8574 - loss: 0.4629\n"
|
466 |
+
]
|
467 |
+
},
|
468 |
+
{
|
469 |
+
"data": {
|
470 |
+
"text/plain": [
|
471 |
+
"<keras.src.callbacks.history.History at 0x781c1ecec190>"
|
472 |
+
]
|
473 |
+
},
|
474 |
+
"execution_count": 19,
|
475 |
+
"metadata": {},
|
476 |
+
"output_type": "execute_result"
|
477 |
+
}
|
478 |
+
],
|
479 |
"source": [
|
480 |
"# Train the model using the augmented data generator\n",
|
481 |
"model.fit(datagen.flow(train_images, train_labels, batch_size=32), epochs=10)"
|
|
|
483 |
},
|
484 |
{
|
485 |
"cell_type": "code",
|
486 |
+
"execution_count": 20,
|
487 |
"id": "5d4bbd2a-9e18-49dd-a555-d1841d5d68f2",
|
488 |
"metadata": {},
|
489 |
+
"outputs": [
|
490 |
+
{
|
491 |
+
"name": "stdout",
|
492 |
+
"output_type": "stream",
|
493 |
+
"text": [
|
494 |
+
"\u001b[1m313/313\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 3ms/step - accuracy: 0.9229 - loss: 0.2424\n",
|
495 |
+
"Augmented test accuracy: 0.932200014591217\n"
|
496 |
+
]
|
497 |
+
}
|
498 |
+
],
|
499 |
"source": [
|
500 |
"# Evaluate the model on the test set\n",
|
501 |
"augmented_test_loss, augmented_test_acc = model.evaluate(test_images, test_labels)\n",
|
|
|
504 |
},
|
505 |
{
|
506 |
"cell_type": "code",
|
507 |
+
"execution_count": 21,
|
508 |
"id": "9a788df7-c878-49f6-86b5-e385be7bf842",
|
509 |
"metadata": {},
|
510 |
+
"outputs": [
|
511 |
+
{
|
512 |
+
"name": "stdout",
|
513 |
+
"output_type": "stream",
|
514 |
+
"text": [
|
515 |
+
"Simple test accuracy: 0.9768999814987183\n",
|
516 |
+
"Simple augmented test accuracy: 0.932200014591217\n"
|
517 |
+
]
|
518 |
+
}
|
519 |
+
],
|
520 |
"source": [
|
521 |
"# Compare the model accuracy on the original set vs the augmented set\n",
|
522 |
"print('Simple test accuracy:', test_acc)\n",
|
|
|
533 |
},
|
534 |
{
|
535 |
"cell_type": "code",
|
536 |
+
"execution_count": 22,
|
537 |
"id": "89cca745-bda4-4a8a-92f0-8d31d508cc8e",
|
538 |
"metadata": {},
|
539 |
"outputs": [],
|
|
|
559 |
},
|
560 |
{
|
561 |
"cell_type": "code",
|
562 |
+
"execution_count": 23,
|
563 |
"id": "c1dfe2cf-86f9-4f36-8184-1dd566ece339",
|
564 |
"metadata": {},
|
565 |
"outputs": [],
|
|
|
569 |
},
|
570 |
{
|
571 |
"cell_type": "code",
|
572 |
+
"execution_count": 24,
|
573 |
"id": "93ba283c-6a0f-49c8-adf6-505ac51cbece",
|
574 |
"metadata": {},
|
575 |
+
"outputs": [
|
576 |
+
{
|
577 |
+
"name": "stdout",
|
578 |
+
"output_type": "stream",
|
579 |
+
"text": [
|
580 |
+
"Epoch 1/10\n",
|
581 |
+
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m251s\u001b[0m 133ms/step - accuracy: 0.5385 - loss: 1.3305 - val_accuracy: 0.9559 - val_loss: 0.1485\n",
|
582 |
+
"Epoch 2/10\n",
|
583 |
+
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m246s\u001b[0m 131ms/step - accuracy: 0.8474 - loss: 0.4887 - val_accuracy: 0.9647 - val_loss: 0.1102\n",
|
584 |
+
"Epoch 3/10\n",
|
585 |
+
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m241s\u001b[0m 129ms/step - accuracy: 0.8866 - loss: 0.3713 - val_accuracy: 0.9685 - val_loss: 0.0905\n",
|
586 |
+
"Epoch 4/10\n",
|
587 |
+
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m241s\u001b[0m 128ms/step - accuracy: 0.9064 - loss: 0.3077 - val_accuracy: 0.9735 - val_loss: 0.0727\n",
|
588 |
+
"Epoch 5/10\n",
|
589 |
+
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m245s\u001b[0m 130ms/step - accuracy: 0.9166 - loss: 0.2790 - val_accuracy: 0.9762 - val_loss: 0.0756\n",
|
590 |
+
"Epoch 6/10\n",
|
591 |
+
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m243s\u001b[0m 129ms/step - accuracy: 0.9195 - loss: 0.2690 - val_accuracy: 0.9792 - val_loss: 0.0639\n",
|
592 |
+
"Epoch 7/10\n",
|
593 |
+
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m245s\u001b[0m 130ms/step - accuracy: 0.9270 - loss: 0.2395 - val_accuracy: 0.9804 - val_loss: 0.0569\n",
|
594 |
+
"Epoch 8/10\n",
|
595 |
+
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m240s\u001b[0m 128ms/step - accuracy: 0.9340 - loss: 0.2231 - val_accuracy: 0.9774 - val_loss: 0.0704\n",
|
596 |
+
"Epoch 9/10\n",
|
597 |
+
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m243s\u001b[0m 130ms/step - accuracy: 0.9356 - loss: 0.2144 - val_accuracy: 0.9844 - val_loss: 0.0496\n",
|
598 |
+
"Epoch 10/10\n",
|
599 |
+
"\u001b[1m1875/1875\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m240s\u001b[0m 128ms/step - accuracy: 0.9395 - loss: 0.2053 - val_accuracy: 0.9827 - val_loss: 0.0538\n"
|
600 |
+
]
|
601 |
+
},
|
602 |
+
{
|
603 |
+
"data": {
|
604 |
+
"text/plain": [
|
605 |
+
"<keras.src.callbacks.history.History at 0x781c1ebabb10>"
|
606 |
+
]
|
607 |
+
},
|
608 |
+
"execution_count": 24,
|
609 |
+
"metadata": {},
|
610 |
+
"output_type": "execute_result"
|
611 |
+
}
|
612 |
+
],
|
613 |
"source": [
|
614 |
+
"advanced_model.fit(datagen.flow(train_images, train_labels, batch_size=32),\n",
|
615 |
" validation_data=(test_images, test_labels),\n",
|
616 |
" epochs=10)"
|
617 |
]
|
618 |
},
|
619 |
{
|
620 |
"cell_type": "code",
|
621 |
+
"execution_count": 25,
|
622 |
"id": "ba5a04bc-f912-45ee-8c38-f860ae59687a",
|
623 |
"metadata": {},
|
624 |
+
"outputs": [
|
625 |
+
{
|
626 |
+
"name": "stdout",
|
627 |
+
"output_type": "stream",
|
628 |
+
"text": [
|
629 |
+
"\u001b[1m313/313\u001b[0m \u001b[32mββββββββββββββββββββ\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 28ms/step - accuracy: 0.9814 - loss: 0.0564\n",
|
630 |
+
"Simple test accuracy: 0.9768999814987183\n",
|
631 |
+
"Simple augmented test accuracy: 0.932200014591217\n",
|
632 |
+
"Advanced test accuracy: 0.982699990272522\n"
|
633 |
+
]
|
634 |
+
}
|
635 |
+
],
|
636 |
"source": [
|
637 |
"advanced_test_loss, advanced_test_acc = advanced_model.evaluate(test_images, test_labels)\n",
|
638 |
"print('Simple test accuracy:', test_acc)\n",
|
|
|
642 |
},
|
643 |
{
|
644 |
"cell_type": "code",
|
645 |
+
"execution_count": 26,
|
646 |
"id": "2178138b-5388-45a0-9e01-5cbae10e5bb9",
|
647 |
"metadata": {},
|
648 |
"outputs": [],
|
|
|
651 |
"if __name__ == \"__main__\":\n",
|
652 |
" pass # Prevent unintended execution during import"
|
653 |
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
654 |
}
|
655 |
],
|
656 |
"metadata": {
|