Spaces:
Sleeping
Sleeping
File size: 190,147 Bytes
d65f7e4 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 |
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"provenance": [],
"gpuType": "T4"
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
},
"accelerator": "GPU",
"widgets": {
"application/vnd.jupyter.widget-state+json": {
"691004dbd42f41cabb2213951c49ad32": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HBoxModel",
"model_module_version": "1.5.0",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "HBoxModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "HBoxView",
"box_style": "",
"children": [
"IPY_MODEL_efc7fbbc6c58401cad9786e7b70b14e0",
"IPY_MODEL_57447709a60840dab09da3b444c2d4fd",
"IPY_MODEL_b5245512642144af9108d0d0d95c5ad7"
],
"layout": "IPY_MODEL_d03aaf2b0e1941fe95b6872e2acb7ead"
}
},
"efc7fbbc6c58401cad9786e7b70b14e0": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "HTMLModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "HTMLView",
"description": "",
"description_tooltip": null,
"layout": "IPY_MODEL_e0a475eb726344408e867688d6f43713",
"placeholder": "",
"style": "IPY_MODEL_3bbd5b5b3b8d4d9f975208a77be35d89",
"value": "README.md: 100%"
}
},
"57447709a60840dab09da3b444c2d4fd": {
"model_module": "@jupyter-widgets/controls",
"model_name": "FloatProgressModel",
"model_module_version": "1.5.0",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "FloatProgressModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "ProgressView",
"bar_style": "success",
"description": "",
"description_tooltip": null,
"layout": "IPY_MODEL_bd13f529cc314631b735b23dc8d1b3c4",
"max": 2035,
"min": 0,
"orientation": "horizontal",
"style": "IPY_MODEL_fc879d4d50474cbea971c6ea9162270f",
"value": 2035
}
},
"b5245512642144af9108d0d0d95c5ad7": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "HTMLModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "HTMLView",
"description": "",
"description_tooltip": null,
"layout": "IPY_MODEL_2babfecc61c848cca1d971fb77ee8e7a",
"placeholder": "",
"style": "IPY_MODEL_eb7435fd4d1d4c6ba1f6ad8f2940742a",
"value": " 2.04k/2.04k [00:00<00:00, 108kB/s]"
}
},
"d03aaf2b0e1941fe95b6872e2acb7ead": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": null
}
},
"e0a475eb726344408e867688d6f43713": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": null
}
},
"3bbd5b5b3b8d4d9f975208a77be35d89": {
"model_module": "@jupyter-widgets/controls",
"model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "DescriptionStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
"description_width": ""
}
},
"bd13f529cc314631b735b23dc8d1b3c4": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": null
}
},
"fc879d4d50474cbea971c6ea9162270f": {
"model_module": "@jupyter-widgets/controls",
"model_name": "ProgressStyleModel",
"model_module_version": "1.5.0",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "ProgressStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
"bar_color": null,
"description_width": ""
}
},
"2babfecc61c848cca1d971fb77ee8e7a": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": null
}
},
"eb7435fd4d1d4c6ba1f6ad8f2940742a": {
"model_module": "@jupyter-widgets/controls",
"model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "DescriptionStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
"description_width": ""
}
},
"797e9ce1b42347219c68718bd7b71305": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HBoxModel",
"model_module_version": "1.5.0",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "HBoxModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "HBoxView",
"box_style": "",
"children": [
"IPY_MODEL_720bc088135f4fcba43573867b3bb1b2",
"IPY_MODEL_6ccf492eb4ff4f93aca49eed33bf7b25",
"IPY_MODEL_3aa9f037a76a4b8895094c2b5486a02b"
],
"layout": "IPY_MODEL_9244ce7764d14328b23baf5e3eca31e4"
}
},
"720bc088135f4fcba43573867b3bb1b2": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "HTMLModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "HTMLView",
"description": "",
"description_tooltip": null,
"layout": "IPY_MODEL_ac4354c6c8734e60bab46191175bf385",
"placeholder": "",
"style": "IPY_MODEL_0ff6dd7910ef422ca44a8e513ab81c06",
"value": "Loading train: "
}
},
"6ccf492eb4ff4f93aca49eed33bf7b25": {
"model_module": "@jupyter-widgets/controls",
"model_name": "FloatProgressModel",
"model_module_version": "1.5.0",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "FloatProgressModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "ProgressView",
"bar_style": "success",
"description": "",
"description_tooltip": null,
"layout": "IPY_MODEL_bad5bd14c595497080e280d2234548b0",
"max": 1,
"min": 0,
"orientation": "horizontal",
"style": "IPY_MODEL_1ffeccecec3a49af884e702a41847d33",
"value": 1
}
},
"3aa9f037a76a4b8895094c2b5486a02b": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "HTMLModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "HTMLView",
"description": "",
"description_tooltip": null,
"layout": "IPY_MODEL_9ed1e14f911e49afa2492bb17c080fa8",
"placeholder": "",
"style": "IPY_MODEL_112d8c3db9bc4b6fbe19f24769fb5b6e",
"value": " 5000/? [00:14<00:00, 547.41it/s]"
}
},
"9244ce7764d14328b23baf5e3eca31e4": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": null
}
},
"ac4354c6c8734e60bab46191175bf385": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": null
}
},
"0ff6dd7910ef422ca44a8e513ab81c06": {
"model_module": "@jupyter-widgets/controls",
"model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "DescriptionStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
"description_width": ""
}
},
"bad5bd14c595497080e280d2234548b0": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": "20px"
}
},
"1ffeccecec3a49af884e702a41847d33": {
"model_module": "@jupyter-widgets/controls",
"model_name": "ProgressStyleModel",
"model_module_version": "1.5.0",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "ProgressStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
"bar_color": null,
"description_width": ""
}
},
"9ed1e14f911e49afa2492bb17c080fa8": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": null
}
},
"112d8c3db9bc4b6fbe19f24769fb5b6e": {
"model_module": "@jupyter-widgets/controls",
"model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "DescriptionStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
"description_width": ""
}
},
"cb26bb419f4f4c7ebaeb01d1557fa335": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HBoxModel",
"model_module_version": "1.5.0",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "HBoxModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "HBoxView",
"box_style": "",
"children": [
"IPY_MODEL_18b856ef3a19466ea6057424e218c117",
"IPY_MODEL_14ef834102b340aea1d0724f421f51ed",
"IPY_MODEL_0f5aa1e72a4543f3924a11f87b6ef3a3"
],
"layout": "IPY_MODEL_284031202a8946cfb09a1586d4d5fce6"
}
},
"18b856ef3a19466ea6057424e218c117": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "HTMLModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "HTMLView",
"description": "",
"description_tooltip": null,
"layout": "IPY_MODEL_f3f55d67c5e0449f904ad333cd7cc5f7",
"placeholder": "",
"style": "IPY_MODEL_e232d8b6e64f46c09ab0bd40e07dd786",
"value": "Loading test: "
}
},
"14ef834102b340aea1d0724f421f51ed": {
"model_module": "@jupyter-widgets/controls",
"model_name": "FloatProgressModel",
"model_module_version": "1.5.0",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "FloatProgressModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "ProgressView",
"bar_style": "success",
"description": "",
"description_tooltip": null,
"layout": "IPY_MODEL_ee859dd359d94209b4a418d0ee368990",
"max": 1,
"min": 0,
"orientation": "horizontal",
"style": "IPY_MODEL_daad2734da424c82b9d2055b27cbd69a",
"value": 1
}
},
"0f5aa1e72a4543f3924a11f87b6ef3a3": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "HTMLModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "HTMLView",
"description": "",
"description_tooltip": null,
"layout": "IPY_MODEL_0d7e54d079a3444eaee38993b64f7943",
"placeholder": "",
"style": "IPY_MODEL_bb27e8509fda443a8fa4e2b3f54be6b3",
"value": " 1000/? [00:03<00:00, 291.78it/s]"
}
},
"284031202a8946cfb09a1586d4d5fce6": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": null
}
},
"f3f55d67c5e0449f904ad333cd7cc5f7": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": null
}
},
"e232d8b6e64f46c09ab0bd40e07dd786": {
"model_module": "@jupyter-widgets/controls",
"model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "DescriptionStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
"description_width": ""
}
},
"ee859dd359d94209b4a418d0ee368990": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": "20px"
}
},
"daad2734da424c82b9d2055b27cbd69a": {
"model_module": "@jupyter-widgets/controls",
"model_name": "ProgressStyleModel",
"model_module_version": "1.5.0",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "ProgressStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
"bar_color": null,
"description_width": ""
}
},
"0d7e54d079a3444eaee38993b64f7943": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": null
}
},
"bb27e8509fda443a8fa4e2b3f54be6b3": {
"model_module": "@jupyter-widgets/controls",
"model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "DescriptionStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
"description_width": ""
}
}
}
}
},
"cells": [
{
"cell_type": "code",
"source": [
"\n",
"\n",
"!pip install datasets tqdm typing-extensions==4.11.0 --quiet\n",
"\n",
"# 2. IMPORT LIBRARIES\n",
"import numpy as np\n",
"import tensorflow as tf\n",
"from tensorflow.keras.models import Sequential\n",
"from tensorflow.keras.layers import Conv2D, MaxPooling2D, BatchNormalization, LeakyReLU\n",
"from tensorflow.keras.layers import Dense, Dropout, Flatten, Activation\n",
"from tensorflow.keras.regularizers import l2\n",
"from tensorflow.keras.optimizers import Adam\n",
"from tensorflow.keras.preprocessing.image import ImageDataGenerator,img_to_array\n",
"from tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau, ModelCheckpoint\n",
"from sklearn.utils.class_weight import compute_class_weight\n",
"from datasets import load_dataset\n",
"from tqdm.auto import tqdm\n",
"from sklearn.preprocessing import LabelEncoder\n",
"import matplotlib.pyplot as plt"
],
"metadata": {
"id": "RKhyyQDr_wum",
"colab": {
"base_uri": "https://localhost:8080/"
},
"collapsed": true,
"outputId": "b5a1c7df-703a-4d5e-f938-f5310cc26b05"
},
"execution_count": 1,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"\u001b[?25l \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m0.0/491.2 kB\u001b[0m \u001b[31m?\u001b[0m eta \u001b[36m-:--:--\u001b[0m\r\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m491.2/491.2 kB\u001b[0m \u001b[31m17.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25h\u001b[?25l \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m0.0/116.3 kB\u001b[0m \u001b[31m?\u001b[0m eta \u001b[36m-:--:--\u001b[0m\r\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m116.3/116.3 kB\u001b[0m \u001b[31m11.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25h\u001b[?25l \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m0.0/183.9 kB\u001b[0m \u001b[31m?\u001b[0m eta \u001b[36m-:--:--\u001b[0m\r\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m183.9/183.9 kB\u001b[0m \u001b[31m18.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25h\u001b[?25l \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m0.0/143.5 kB\u001b[0m \u001b[31m?\u001b[0m eta \u001b[36m-:--:--\u001b[0m\r\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m143.5/143.5 kB\u001b[0m \u001b[31m15.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25h\u001b[?25l \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m0.0/194.8 kB\u001b[0m \u001b[31m?\u001b[0m eta \u001b[36m-:--:--\u001b[0m\r\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m194.8/194.8 kB\u001b[0m \u001b[31m19.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25h\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n",
"torch 2.6.0+cu124 requires nvidia-cublas-cu12==12.4.5.8; platform_system == \"Linux\" and platform_machine == \"x86_64\", but you have nvidia-cublas-cu12 12.5.3.2 which is incompatible.\n",
"torch 2.6.0+cu124 requires nvidia-cuda-cupti-cu12==12.4.127; platform_system == \"Linux\" and platform_machine == \"x86_64\", but you have nvidia-cuda-cupti-cu12 12.5.82 which is incompatible.\n",
"torch 2.6.0+cu124 requires nvidia-cuda-nvrtc-cu12==12.4.127; platform_system == \"Linux\" and platform_machine == \"x86_64\", but you have nvidia-cuda-nvrtc-cu12 12.5.82 which is incompatible.\n",
"torch 2.6.0+cu124 requires nvidia-cuda-runtime-cu12==12.4.127; platform_system == \"Linux\" and platform_machine == \"x86_64\", but you have nvidia-cuda-runtime-cu12 12.5.82 which is incompatible.\n",
"torch 2.6.0+cu124 requires nvidia-cudnn-cu12==9.1.0.70; platform_system == \"Linux\" and platform_machine == \"x86_64\", but you have nvidia-cudnn-cu12 9.3.0.75 which is incompatible.\n",
"torch 2.6.0+cu124 requires nvidia-cufft-cu12==11.2.1.3; platform_system == \"Linux\" and platform_machine == \"x86_64\", but you have nvidia-cufft-cu12 11.2.3.61 which is incompatible.\n",
"torch 2.6.0+cu124 requires nvidia-curand-cu12==10.3.5.147; platform_system == \"Linux\" and platform_machine == \"x86_64\", but you have nvidia-curand-cu12 10.3.6.82 which is incompatible.\n",
"torch 2.6.0+cu124 requires nvidia-cusolver-cu12==11.6.1.9; platform_system == \"Linux\" and platform_machine == \"x86_64\", but you have nvidia-cusolver-cu12 11.6.3.83 which is incompatible.\n",
"torch 2.6.0+cu124 requires nvidia-cusparse-cu12==12.3.1.170; platform_system == \"Linux\" and platform_machine == \"x86_64\", but you have nvidia-cusparse-cu12 12.5.1.3 which is incompatible.\n",
"torch 2.6.0+cu124 requires nvidia-nvjitlink-cu12==12.4.127; platform_system == \"Linux\" and platform_machine == \"x86_64\", but you have nvidia-nvjitlink-cu12 12.5.82 which is incompatible.\n",
"gcsfs 2025.3.0 requires fsspec==2025.3.0, but you have fsspec 2024.12.0 which is incompatible.\n",
"pydantic 2.10.6 requires typing-extensions>=4.12.2, but you have typing-extensions 4.11.0 which is incompatible.\u001b[0m\u001b[31m\n",
"\u001b[0m"
]
}
]
},
{
"cell_type": "code",
"source": [
"\n",
"CONFIG = {\n",
" \"image_size\": (128, 128),\n",
" \"batch_size\": 64,\n",
" \"epochs\": 30,\n",
" \"num_train_samples\": 5000,\n",
" \"num_test_samples\": 1000,\n",
" \"learning_rate\": 3e-4,\n",
" \"weight_decay\": 1e-4,\n",
" \"early_stop_patience\": 10,\n",
" \"lr_patience\": 5,\n",
"\n",
"}"
],
"metadata": {
"id": "ovAJSC6X_2s6",
"collapsed": true
},
"execution_count": 2,
"outputs": []
},
{
"cell_type": "code",
"source": [
"\n",
"# ==============================================\n",
"# Data Loading Function\n",
"# ==============================================\n",
"def load_data(split, n_samples=None):\n",
" \"\"\"Optimized data loader with error handling\"\"\"\n",
" dataset = load_dataset(\"GVJahnavi/PlantVillage_dataset\", split=split, streaming=True)\n",
" images, labels = [], []\n",
"\n",
" for sample in tqdm(dataset.take(n_samples) if n_samples else dataset, desc=f\"Loading {split}\"):\n",
" try:\n",
" img = sample['image'].resize(CONFIG[\"image_size\"])\n",
" img_array = np.array(img)\n",
"\n",
" # Handle grayscale images\n",
" if len(img_array.shape) == 2:\n",
" img_array = np.stack((img_array,)*3, axis=-1)\n",
"\n",
" images.append(img_array / 255.0)\n",
" labels.append(str(sample['label']))\n",
" except Exception as e:\n",
" continue\n",
"\n",
" return np.array(images), np.array(labels)\n"
],
"metadata": {
"id": "YzwJxCKj_5AJ"
},
"execution_count": 3,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# ==============================================\n",
"# Data Loading\n",
"# ==============================================\n",
"print(\"Loading data...\")\n",
"X_train, y_train = load_data(\"train\", CONFIG[\"num_train_samples\"])\n",
"X_test, y_test = load_data(\"test\", CONFIG[\"num_test_samples\"])\n",
"\n",
"# Label encoding\n",
"le = LabelEncoder()\n",
"y_train = le.fit_transform(y_train)\n",
"y_test = le.transform(y_test)\n",
"\n",
"# Class weights\n",
"class_weights = compute_class_weight('balanced', classes=np.unique(y_train), y=y_train)\n",
"class_weights = dict(enumerate(class_weights))\n"
],
"metadata": {
"id": "Bhg8PmYD_7KG",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 130,
"referenced_widgets": [
"691004dbd42f41cabb2213951c49ad32",
"efc7fbbc6c58401cad9786e7b70b14e0",
"57447709a60840dab09da3b444c2d4fd",
"b5245512642144af9108d0d0d95c5ad7",
"d03aaf2b0e1941fe95b6872e2acb7ead",
"e0a475eb726344408e867688d6f43713",
"3bbd5b5b3b8d4d9f975208a77be35d89",
"bd13f529cc314631b735b23dc8d1b3c4",
"fc879d4d50474cbea971c6ea9162270f",
"2babfecc61c848cca1d971fb77ee8e7a",
"eb7435fd4d1d4c6ba1f6ad8f2940742a",
"797e9ce1b42347219c68718bd7b71305",
"720bc088135f4fcba43573867b3bb1b2",
"6ccf492eb4ff4f93aca49eed33bf7b25",
"3aa9f037a76a4b8895094c2b5486a02b",
"9244ce7764d14328b23baf5e3eca31e4",
"ac4354c6c8734e60bab46191175bf385",
"0ff6dd7910ef422ca44a8e513ab81c06",
"bad5bd14c595497080e280d2234548b0",
"1ffeccecec3a49af884e702a41847d33",
"9ed1e14f911e49afa2492bb17c080fa8",
"112d8c3db9bc4b6fbe19f24769fb5b6e",
"cb26bb419f4f4c7ebaeb01d1557fa335",
"18b856ef3a19466ea6057424e218c117",
"14ef834102b340aea1d0724f421f51ed",
"0f5aa1e72a4543f3924a11f87b6ef3a3",
"284031202a8946cfb09a1586d4d5fce6",
"f3f55d67c5e0449f904ad333cd7cc5f7",
"e232d8b6e64f46c09ab0bd40e07dd786",
"ee859dd359d94209b4a418d0ee368990",
"daad2734da424c82b9d2055b27cbd69a",
"0d7e54d079a3444eaee38993b64f7943",
"bb27e8509fda443a8fa4e2b3f54be6b3"
]
},
"collapsed": true,
"outputId": "8c8196f5-d7b6-45ff-df33-8f1cc603ca82"
},
"execution_count": 4,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Loading data...\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"README.md: 0%| | 0.00/2.04k [00:00<?, ?B/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "691004dbd42f41cabb2213951c49ad32"
}
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"Loading train: 0it [00:00, ?it/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "797e9ce1b42347219c68718bd7b71305"
}
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"Loading test: 0it [00:00, ?it/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "cb26bb419f4f4c7ebaeb01d1557fa335"
}
},
"metadata": {}
}
]
},
{
"cell_type": "code",
"source": [
"# ==============================================\n",
"# Data Augmentation\n",
"# ==============================================\n",
"train_datagen = ImageDataGenerator(\n",
" rotation_range=40,\n",
" width_shift_range=0.2,\n",
" height_shift_range=0.2,\n",
" shear_range=0.2,\n",
" zoom_range=0.2,\n",
" horizontal_flip=True,\n",
" vertical_flip=True, # Added vertical flip\n",
" fill_mode='nearest'\n",
")\n",
"\n",
"val_datagen = ImageDataGenerator()\n"
],
"metadata": {
"id": "jjOfjjiH_9pf"
},
"execution_count": 5,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# ==============================================\n",
"# Enhanced Model Architecture\n",
"# ==============================================\n",
"def build_model():\n",
" model = Sequential()\n",
" input_shape = (*CONFIG[\"image_size\"], 3)\n",
"\n",
" # Conv Blocks\n",
" filters = [32, 64, 128, 256]\n",
" dropouts = [0.25, 0.3, 0.4, 0.5]\n",
"\n",
" for i, (f, dr) in enumerate(zip(filters, dropouts)):\n",
" # First block has input_shape\n",
" if i == 0:\n",
" model.add(Conv2D(f, (3,3), padding=\"same\", input_shape=input_shape,\n",
" kernel_regularizer=l2(CONFIG[\"weight_decay\"])))\n",
" else:\n",
" model.add(Conv2D(f, (3,3), padding=\"same\",\n",
" kernel_regularizer=l2(CONFIG[\"weight_decay\"])))\n",
"\n",
" model.add(LeakyReLU(alpha=0.1))\n",
" model.add(BatchNormalization())\n",
"\n",
" # Add second conv layer for deeper blocks\n",
" if i >= 1:\n",
" model.add(Conv2D(f, (3,3), padding=\"same\"))\n",
" model.add(LeakyReLU(alpha=0.1))\n",
" model.add(BatchNormalization())\n",
"\n",
" model.add(MaxPooling2D((2,2)))\n",
" model.add(Dropout(dr))\n",
"\n",
" # Classifier\n",
" model.add(Flatten())\n",
" model.add(Dense(1024, kernel_regularizer=l2(CONFIG[\"weight_decay\"])))\n",
" model.add(LeakyReLU(alpha=0.1))\n",
" model.add(BatchNormalization())\n",
" model.add(Dropout(0.6))\n",
"\n",
" model.add(Dense(len(le.classes_), activation='softmax'))\n",
"\n",
" return model\n",
"\n",
"model = build_model()\n",
"model.summary()\n"
],
"metadata": {
"id": "KCQe29-dAA7Q",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
},
"outputId": "b0bee921-0a97-45b1-fd58-40b2a51e1e20"
},
"execution_count": 6,
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"/usr/local/lib/python3.11/dist-packages/keras/src/layers/convolutional/base_conv.py:107: UserWarning: Do not pass 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.\n",
" super().__init__(activity_regularizer=activity_regularizer, **kwargs)\n",
"/usr/local/lib/python3.11/dist-packages/keras/src/layers/activations/leaky_relu.py:41: UserWarning: Argument `alpha` is deprecated. Use `negative_slope` instead.\n",
" warnings.warn(\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"\u001b[1mModel: \"sequential\"\u001b[0m\n"
],
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"sequential\"</span>\n",
"</pre>\n"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩\n",
"│ conv2d (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m896\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ leaky_re_lu (\u001b[38;5;33mLeakyReLU\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ batch_normalization │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m128\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m128\u001b[0m │\n",
"│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ max_pooling2d (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ dropout (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ conv2d_1 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m18,496\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ leaky_re_lu_1 (\u001b[38;5;33mLeakyReLU\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ batch_normalization_1 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m256\u001b[0m │\n",
"│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ conv2d_2 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m36,928\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ leaky_re_lu_2 (\u001b[38;5;33mLeakyReLU\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ batch_normalization_2 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m256\u001b[0m │\n",
"│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ max_pooling2d_1 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ dropout_1 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ conv2d_3 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m73,856\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ leaky_re_lu_3 (\u001b[38;5;33mLeakyReLU\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ batch_normalization_3 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m512\u001b[0m │\n",
"│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ conv2d_4 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m147,584\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ leaky_re_lu_4 (\u001b[38;5;33mLeakyReLU\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ batch_normalization_4 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m512\u001b[0m │\n",
"│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ max_pooling2d_2 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ dropout_2 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ conv2d_5 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m295,168\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ leaky_re_lu_5 (\u001b[38;5;33mLeakyReLU\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ batch_normalization_5 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m1,024\u001b[0m │\n",
"│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ conv2d_6 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m590,080\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ leaky_re_lu_6 (\u001b[38;5;33mLeakyReLU\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ batch_normalization_6 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m1,024\u001b[0m │\n",
"│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ max_pooling2d_3 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ dropout_3 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ flatten (\u001b[38;5;33mFlatten\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16384\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1024\u001b[0m) │ \u001b[38;5;34m16,778,240\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ leaky_re_lu_7 (\u001b[38;5;33mLeakyReLU\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1024\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ batch_normalization_7 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1024\u001b[0m) │ \u001b[38;5;34m4,096\u001b[0m │\n",
"│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ dropout_4 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1024\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ dense_1 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m7\u001b[0m) │ \u001b[38;5;34m7,175\u001b[0m │\n",
"└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘\n"
],
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓\n",
"┃<span style=\"font-weight: bold\"> Layer (type) </span>┃<span style=\"font-weight: bold\"> Output Shape </span>┃<span style=\"font-weight: bold\"> Param # </span>┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩\n",
"│ conv2d (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">896</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ leaky_re_lu (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">LeakyReLU</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ batch_normalization │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span> │\n",
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">BatchNormalization</span>) │ │ │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ max_pooling2d (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">MaxPooling2D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ dropout (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dropout</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ conv2d_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">18,496</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ leaky_re_lu_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">LeakyReLU</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ batch_normalization_1 │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span> │\n",
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">BatchNormalization</span>) │ │ │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ conv2d_2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">36,928</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ leaky_re_lu_2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">LeakyReLU</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ batch_normalization_2 │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span> │\n",
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">BatchNormalization</span>) │ │ │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ max_pooling2d_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">MaxPooling2D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ dropout_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dropout</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ conv2d_3 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">73,856</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ leaky_re_lu_3 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">LeakyReLU</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ batch_normalization_3 │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">512</span> │\n",
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">BatchNormalization</span>) │ │ │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ conv2d_4 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">147,584</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ leaky_re_lu_4 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">LeakyReLU</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ batch_normalization_4 │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">512</span> │\n",
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">BatchNormalization</span>) │ │ │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ max_pooling2d_2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">MaxPooling2D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">16</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">16</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ dropout_2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dropout</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">16</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">16</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ conv2d_5 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">16</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">16</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">295,168</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ leaky_re_lu_5 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">LeakyReLU</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">16</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">16</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ batch_normalization_5 │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">16</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">16</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">1,024</span> │\n",
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">BatchNormalization</span>) │ │ │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ conv2d_6 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">16</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">16</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">590,080</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ leaky_re_lu_6 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">LeakyReLU</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">16</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">16</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ batch_normalization_6 │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">16</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">16</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">1,024</span> │\n",
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">BatchNormalization</span>) │ │ │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ max_pooling2d_3 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">MaxPooling2D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ dropout_3 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dropout</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ flatten (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Flatten</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">16384</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ dense (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1024</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">16,778,240</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ leaky_re_lu_7 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">LeakyReLU</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1024</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ batch_normalization_7 │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1024</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">4,096</span> │\n",
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">BatchNormalization</span>) │ │ │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ dropout_4 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dropout</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1024</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ dense_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">7</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">7,175</span> │\n",
"└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘\n",
"</pre>\n"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"\u001b[1m Total params: \u001b[0m\u001b[38;5;34m17,956,231\u001b[0m (68.50 MB)\n"
],
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">17,956,231</span> (68.50 MB)\n",
"</pre>\n"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m17,952,327\u001b[0m (68.48 MB)\n"
],
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">17,952,327</span> (68.48 MB)\n",
"</pre>\n"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m3,904\u001b[0m (15.25 KB)\n"
],
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">3,904</span> (15.25 KB)\n",
"</pre>\n"
]
},
"metadata": {}
}
]
},
{
"cell_type": "code",
"source": [
"# ==============================================\n",
"# Training Setup\n",
"# ==============================================\n",
"optimizer = Adam(learning_rate=CONFIG[\"learning_rate\"],\n",
" weight_decay=CONFIG[\"weight_decay\"])\n",
"\n",
"model.compile(\n",
" loss=\"sparse_categorical_crossentropy\",\n",
" optimizer=optimizer,\n",
" metrics=[\"accuracy\", tf.keras.metrics.SparseTopKCategoricalAccuracy(k=3)]\n",
")\n",
"\n",
"callbacks = [\n",
" EarlyStopping(patience=CONFIG[\"early_stop_patience\"],\n",
" restore_best_weights=True,\n",
" monitor='val_accuracy'),\n",
" ReduceLROnPlateau(factor=0.5,\n",
" patience=CONFIG[\"lr_patience\"],\n",
" verbose=1),\n",
"]\n"
],
"metadata": {
"id": "9ZO8IYQAADZF"
},
"execution_count": 7,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# ==============================================\n",
"# Training Execution\n",
"# ==============================================\n",
"print(\"\\nTraining model...\")\n",
"history = model.fit(\n",
" train_datagen.flow(X_train, y_train, batch_size=CONFIG[\"batch_size\"]),\n",
" steps_per_epoch=len(X_train) // CONFIG[\"batch_size\"],\n",
" validation_data=val_datagen.flow(X_test, y_test),\n",
" epochs=CONFIG[\"epochs\"],\n",
" callbacks=callbacks,\n",
" class_weight=class_weights,\n",
" verbose=1\n",
")"
],
"metadata": {
"id": "DZaNPXyzAFtx",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "daf89a9d-36a2-4a92-c1c9-b42289bcb475"
},
"execution_count": 8,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"\n",
"Training model...\n"
]
},
{
"output_type": "stream",
"name": "stderr",
"text": [
"/usr/local/lib/python3.11/dist-packages/keras/src/trainers/data_adapters/py_dataset_adapter.py:121: UserWarning: Your `PyDataset` class should call `super().__init__(**kwargs)` in its constructor. `**kwargs` can include `workers`, `use_multiprocessing`, `max_queue_size`. Do not pass these arguments to `fit()`, as they will be ignored.\n",
" self._warn_if_super_not_called()\n"
]
},
{
"output_type": "stream",
"name": "stdout",
"text": [
"Epoch 1/30\n",
"\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m63s\u001b[0m 503ms/step - accuracy: 0.4329 - loss: 2.4943 - sparse_top_k_categorical_accuracy: 0.7645 - val_accuracy: 0.1320 - val_loss: 9.4595 - val_sparse_top_k_categorical_accuracy: 0.2420 - learning_rate: 3.0000e-04\n",
"Epoch 2/30\n",
"\u001b[1m 1/78\u001b[0m \u001b[37m━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[1m5s\u001b[0m 71ms/step - accuracy: 0.5781 - loss: 1.9116 - sparse_top_k_categorical_accuracy: 0.8750"
]
},
{
"output_type": "stream",
"name": "stderr",
"text": [
"/usr/local/lib/python3.11/dist-packages/keras/src/trainers/epoch_iterator.py:107: UserWarning: Your input ran out of data; interrupting training. Make sure that your dataset or generator can generate at least `steps_per_epoch * epochs` batches. You may need to use the `.repeat()` function when building your dataset.\n",
" self._interrupted_warning()\n"
]
},
{
"output_type": "stream",
"name": "stdout",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 8ms/step - accuracy: 0.5781 - loss: 1.9116 - sparse_top_k_categorical_accuracy: 0.8750 - val_accuracy: 0.1280 - val_loss: 9.3718 - val_sparse_top_k_categorical_accuracy: 0.2420 - learning_rate: 3.0000e-04\n",
"Epoch 3/30\n",
"\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m49s\u001b[0m 286ms/step - accuracy: 0.6459 - loss: 1.4719 - sparse_top_k_categorical_accuracy: 0.9345 - val_accuracy: 0.0560 - val_loss: 10.2090 - val_sparse_top_k_categorical_accuracy: 0.2420 - learning_rate: 3.0000e-04\n",
"Epoch 4/30\n",
"\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 6ms/step - accuracy: 0.7656 - loss: 0.9638 - sparse_top_k_categorical_accuracy: 0.9375 - val_accuracy: 0.0560 - val_loss: 10.1537 - val_sparse_top_k_categorical_accuracy: 0.2420 - learning_rate: 3.0000e-04\n",
"Epoch 5/30\n",
"\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m42s\u001b[0m 304ms/step - accuracy: 0.7353 - loss: 1.0905 - sparse_top_k_categorical_accuracy: 0.9676 - val_accuracy: 0.0560 - val_loss: 11.6470 - val_sparse_top_k_categorical_accuracy: 0.4430 - learning_rate: 3.0000e-04\n",
"Epoch 6/30\n",
"\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 8ms/step - accuracy: 0.7188 - loss: 1.0508 - sparse_top_k_categorical_accuracy: 0.9688 - val_accuracy: 0.0560 - val_loss: 11.7472 - val_sparse_top_k_categorical_accuracy: 0.4430 - learning_rate: 3.0000e-04\n",
"Epoch 7/30\n",
"\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 300ms/step - accuracy: 0.7702 - loss: 0.9361 - sparse_top_k_categorical_accuracy: 0.9761\n",
"Epoch 7: ReduceLROnPlateau reducing learning rate to 0.0001500000071246177.\n",
"\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m41s\u001b[0m 309ms/step - accuracy: 0.7704 - loss: 0.9358 - sparse_top_k_categorical_accuracy: 0.9761 - val_accuracy: 0.0570 - val_loss: 14.8491 - val_sparse_top_k_categorical_accuracy: 0.4570 - learning_rate: 3.0000e-04\n",
"Epoch 8/30\n",
"\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 6ms/step - accuracy: 0.8438 - loss: 0.5789 - sparse_top_k_categorical_accuracy: 0.9844 - val_accuracy: 0.0570 - val_loss: 14.9557 - val_sparse_top_k_categorical_accuracy: 0.4570 - learning_rate: 1.5000e-04\n",
"Epoch 9/30\n",
"\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m40s\u001b[0m 305ms/step - accuracy: 0.8353 - loss: 0.7625 - sparse_top_k_categorical_accuracy: 0.9743 - val_accuracy: 0.1700 - val_loss: 9.7745 - val_sparse_top_k_categorical_accuracy: 0.5520 - learning_rate: 1.5000e-04\n",
"Epoch 10/30\n",
"\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 7ms/step - accuracy: 0.8281 - loss: 0.6357 - sparse_top_k_categorical_accuracy: 0.9531 - val_accuracy: 0.1860 - val_loss: 9.6140 - val_sparse_top_k_categorical_accuracy: 0.5510 - learning_rate: 1.5000e-04\n",
"Epoch 11/30\n",
"\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m41s\u001b[0m 308ms/step - accuracy: 0.8245 - loss: 0.7697 - sparse_top_k_categorical_accuracy: 0.9761 - val_accuracy: 0.3340 - val_loss: 5.1914 - val_sparse_top_k_categorical_accuracy: 0.6730 - learning_rate: 1.5000e-04\n",
"Epoch 12/30\n",
"\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 10ms/step - accuracy: 0.8438 - loss: 0.8136 - sparse_top_k_categorical_accuracy: 0.9688 - val_accuracy: 0.3350 - val_loss: 5.0796 - val_sparse_top_k_categorical_accuracy: 0.6900 - learning_rate: 1.5000e-04\n",
"Epoch 13/30\n",
"\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m39s\u001b[0m 295ms/step - accuracy: 0.8382 - loss: 0.6952 - sparse_top_k_categorical_accuracy: 0.9848 - val_accuracy: 0.4000 - val_loss: 4.8749 - val_sparse_top_k_categorical_accuracy: 0.6660 - learning_rate: 1.5000e-04\n",
"Epoch 14/30\n",
"\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 6ms/step - accuracy: 0.8125 - loss: 0.5888 - sparse_top_k_categorical_accuracy: 0.9844 - val_accuracy: 0.3900 - val_loss: 4.7950 - val_sparse_top_k_categorical_accuracy: 0.6670 - learning_rate: 1.5000e-04\n",
"Epoch 15/30\n",
"\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m40s\u001b[0m 289ms/step - accuracy: 0.8581 - loss: 0.6752 - sparse_top_k_categorical_accuracy: 0.9833 - val_accuracy: 0.4940 - val_loss: 4.3225 - val_sparse_top_k_categorical_accuracy: 0.7150 - learning_rate: 1.5000e-04\n",
"Epoch 16/30\n",
"\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 8ms/step - accuracy: 0.8125 - loss: 0.9437 - sparse_top_k_categorical_accuracy: 0.9531 - val_accuracy: 0.5020 - val_loss: 4.3453 - val_sparse_top_k_categorical_accuracy: 0.7200 - learning_rate: 1.5000e-04\n",
"Epoch 17/30\n",
"\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m41s\u001b[0m 302ms/step - accuracy: 0.8685 - loss: 0.6388 - sparse_top_k_categorical_accuracy: 0.9889 - val_accuracy: 0.7610 - val_loss: 1.2823 - val_sparse_top_k_categorical_accuracy: 0.9430 - learning_rate: 1.5000e-04\n",
"Epoch 18/30\n",
"\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 10ms/step - accuracy: 0.9219 - loss: 0.6197 - sparse_top_k_categorical_accuracy: 1.0000 - val_accuracy: 0.7710 - val_loss: 1.2378 - val_sparse_top_k_categorical_accuracy: 0.9490 - learning_rate: 1.5000e-04\n",
"Epoch 19/30\n",
"\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m22s\u001b[0m 285ms/step - accuracy: 0.8733 - loss: 0.6129 - sparse_top_k_categorical_accuracy: 0.9892 - val_accuracy: 0.7810 - val_loss: 1.0951 - val_sparse_top_k_categorical_accuracy: 0.9540 - learning_rate: 1.5000e-04\n",
"Epoch 20/30\n",
"\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 10ms/step - accuracy: 0.8906 - loss: 0.7196 - sparse_top_k_categorical_accuracy: 1.0000 - val_accuracy: 0.8020 - val_loss: 1.0278 - val_sparse_top_k_categorical_accuracy: 0.9620 - learning_rate: 1.5000e-04\n",
"Epoch 21/30\n",
"\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m41s\u001b[0m 303ms/step - accuracy: 0.8914 - loss: 0.5703 - sparse_top_k_categorical_accuracy: 0.9904 - val_accuracy: 0.8500 - val_loss: 0.7309 - val_sparse_top_k_categorical_accuracy: 0.9860 - learning_rate: 1.5000e-04\n",
"Epoch 22/30\n",
"\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 10ms/step - accuracy: 0.9219 - loss: 0.5307 - sparse_top_k_categorical_accuracy: 1.0000 - val_accuracy: 0.8540 - val_loss: 0.7115 - val_sparse_top_k_categorical_accuracy: 0.9870 - learning_rate: 1.5000e-04\n",
"Epoch 23/30\n",
"\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m23s\u001b[0m 289ms/step - accuracy: 0.9092 - loss: 0.5199 - sparse_top_k_categorical_accuracy: 0.9906 - val_accuracy: 0.8820 - val_loss: 0.6575 - val_sparse_top_k_categorical_accuracy: 0.9950 - learning_rate: 1.5000e-04\n",
"Epoch 24/30\n",
"\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 8ms/step - accuracy: 0.8906 - loss: 0.5522 - sparse_top_k_categorical_accuracy: 1.0000 - val_accuracy: 0.8880 - val_loss: 0.6323 - val_sparse_top_k_categorical_accuracy: 0.9950 - learning_rate: 1.5000e-04\n",
"Epoch 25/30\n",
"\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m41s\u001b[0m 303ms/step - accuracy: 0.8964 - loss: 0.5625 - sparse_top_k_categorical_accuracy: 0.9919 - val_accuracy: 0.8980 - val_loss: 0.7370 - val_sparse_top_k_categorical_accuracy: 0.9860 - learning_rate: 1.5000e-04\n",
"Epoch 26/30\n",
"\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 8ms/step - accuracy: 0.8438 - loss: 0.6429 - sparse_top_k_categorical_accuracy: 0.9844 - val_accuracy: 0.8850 - val_loss: 0.7962 - val_sparse_top_k_categorical_accuracy: 0.9830 - learning_rate: 1.5000e-04\n",
"Epoch 27/30\n",
"\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m40s\u001b[0m 301ms/step - accuracy: 0.9000 - loss: 0.5165 - sparse_top_k_categorical_accuracy: 0.9899 - val_accuracy: 0.9030 - val_loss: 0.5893 - val_sparse_top_k_categorical_accuracy: 0.9940 - learning_rate: 1.5000e-04\n",
"Epoch 28/30\n",
"\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 8ms/step - accuracy: 0.9219 - loss: 0.4556 - sparse_top_k_categorical_accuracy: 1.0000 - val_accuracy: 0.9020 - val_loss: 0.6038 - val_sparse_top_k_categorical_accuracy: 0.9940 - learning_rate: 1.5000e-04\n",
"Epoch 29/30\n",
"\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m40s\u001b[0m 304ms/step - accuracy: 0.8677 - loss: 0.6720 - sparse_top_k_categorical_accuracy: 0.9883 - val_accuracy: 0.8350 - val_loss: 0.8678 - val_sparse_top_k_categorical_accuracy: 0.9710 - learning_rate: 1.5000e-04\n",
"Epoch 30/30\n",
"\u001b[1m78/78\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 6ms/step - accuracy: 0.8906 - loss: 0.5368 - sparse_top_k_categorical_accuracy: 1.0000 - val_accuracy: 0.8340 - val_loss: 0.8807 - val_sparse_top_k_categorical_accuracy: 0.9690 - learning_rate: 1.5000e-04\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"# ==============================================\n",
"# Evaluation & Visualization\n",
"# ==============================================\n",
"plt.figure(figsize=(14, 5))\n",
"plt.subplot(1, 2, 1)\n",
"plt.plot(history.history['accuracy'], label='Train')\n",
"plt.plot(history.history['val_accuracy'], label='Validation')\n",
"plt.title('Model Accuracy')\n",
"plt.ylabel('Accuracy')\n",
"plt.xlabel('Epoch')\n",
"plt.legend()\n",
"\n",
"plt.subplot(1, 2, 2)\n",
"plt.plot(history.history['loss'], label='Train')\n",
"plt.plot(history.history['val_loss'], label='Validation')\n",
"plt.title('Model Loss')\n",
"plt.ylabel('Loss')\n",
"plt.xlabel('Epoch')\n",
"plt.legend()\n",
"plt.show()\n",
"\n"
],
"metadata": {
"id": "I8ak3_e3AHks",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 487
},
"outputId": "c5e7694b-579f-4ffa-c781-cf0feba5da83"
},
"execution_count": 9,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 1400x500 with 2 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAABIYAAAHWCAYAAAACWYJQAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAuUxJREFUeJzs3Xd4FGXXx/HvbnpCCgkhIbTQO6FJEwUURVQEERUsYMUCNtTHgmB5Feyi4mN7VCyAKAhWVECkSJXea+gJIYT0np33jyGB0EM2mezm97muuXYyOzN7NoFk5ux9n2MzDMNAREREREREREQqHbvVAYiIiIiIiIiIiDWUGBIRERERERERqaSUGBIRERERERERqaSUGBIRERERERERqaSUGBIRERERERERqaSUGBIRERERERERqaSUGBIRERERERERqaSUGBIRERERERERqaSUGBIRERERERERqaSUGBKRUrPZbLzwwgslPm737t3YbDYmTpzo9JhEREREKhNdj4nIhVJiSMRNTJw4EZvNhs1mY9GiRac8bxgGtWvXxmazce2111oQoXP89ttv2Gw2oqKicDgcVocjIiIiUsSdr8f+/vtvbDYb06ZNszoUEXEyJYZE3Iyvry+TJ08+Zfv8+fPZv38/Pj4+FkTlPJMmTSI6Opq4uDj++usvq8MREREROYW7X4+JiHtRYkjEzVx99dV8//335OfnF9s+efJk2rdvT2RkpEWRlV5GRgY//vgjI0eOpG3btkyaNMnqkM4oIyPD6hBERETEIu58PSYi7keJIRE3M3jwYI4cOcLs2bOLtuXm5jJt2jRuueWW0x6TkZHB448/Tu3atfHx8aFJkya8+eabGIZRbL+cnBwee+wxwsPDCQwM5LrrrmP//v2nPeeBAwe46667iIiIwMfHhxYtWvD555+X6r3NmDGDrKwsbrzxRgYNGsQPP/xAdnb2KftlZ2fzwgsv0LhxY3x9falRowYDBgxg586dRfs4HA7effddWrVqha+vL+Hh4Vx11VX8+++/wNnn2588h/+FF17AZrOxadMmbrnlFqpWrUq3bt0AWLduHXfccQf169fH19eXyMhI7rrrLo4cOXLa79ndd99NVFQUPj4+1KtXjwceeIDc3Fx27dqFzWbjnXfeOeW4xYsXY7PZmDJlSkm/pSIiIlIG3Pl67Fx27drFjTfeSGhoKP7+/nTu3Jlff/31lP3ef/99WrRogb+/P1WrVqVDhw7FRlmlpaXx6KOPEh0djY+PD9WrV+eKK65g1apVZRq/SGXkaXUAIuJc0dHRdOnShSlTptCnTx8AZs2aRUpKCoMGDeK9994rtr9hGFx33XXMmzePu+++mzZt2vDHH3/w5JNPcuDAgWKJiHvuuYdvvvmGW265ha5du/LXX39xzTXXnBLDoUOH6Ny5MzabjREjRhAeHs6sWbO4++67SU1N5dFHH72g9zZp0iR69uxJZGQkgwYN4umnn+bnn3/mxhtvLNqnoKCAa6+9lrlz5zJo0CAeeeQR0tLSmD17Nhs2bKBBgwYA3H333UycOJE+ffpwzz33kJ+fz8KFC1m6dCkdOnS4oPhuvPFGGjVqxNixY4su4mbPns2uXbu48847iYyMZOPGjXzyySds3LiRpUuXYrPZADh48CAdO3YkOTmZYcOG0bRpUw4cOMC0adPIzMykfv36XHzxxUyaNInHHnvslO9LYGAg/fr1u6C4RURExLnc+XrsbA4dOkTXrl3JzMzk4YcfJiwsjC+//JLrrruOadOmcf311wPw6aef8vDDDzNw4EAeeeQRsrOzWbduHcuWLStKnN1///1MmzaNESNG0Lx5c44cOcKiRYvYvHkz7dq1c3rsIpWaISJu4YsvvjAAY8WKFcaECROMwMBAIzMz0zAMw7jxxhuNnj17GoZhGHXr1jWuueaaouNmzpxpAMbLL79c7HwDBw40bDabsWPHDsMwDGPNmjUGYDz44IPF9rvlllsMwHj++eeLtt19991GjRo1jMTExGL7Dho0yAgODi6KKzY21gCML7744pzv79ChQ4anp6fx6aefFm3r2rWr0a9fv2L7ff755wZgvP3226ecw+FwGIZhGH/99ZcBGA8//PAZ9zlbbCe/3+eff94AjMGDB5+yb+F7PdGUKVMMwFiwYEHRtiFDhhh2u91YsWLFGWP6+OOPDcDYvHlz0XO5ublGtWrVjKFDh55ynIiIiJQvd74emzdvngEY33///Rn3efTRRw3AWLhwYdG2tLQ0o169ekZ0dLRRUFBgGIZh9OvXz2jRosVZXy84ONgYPnz4WfcREefQVDIRN3TTTTeRlZXFL7/8QlpaGr/88ssZhy3/9ttveHh48PDDDxfb/vjjj2MYBrNmzSraDzhlv5M/bTIMg+nTp9O3b18MwyAxMbFo6d27NykpKRc0BPjbb7/Fbrdzww03FG0bPHgws2bN4ujRo0Xbpk+fTrVq1XjooYdOOUfh6Jzp06djs9l4/vnnz7jPhbj//vtP2ebn51e0np2dTWJiIp07dwYo+j44HA5mzpxJ3759TztaqTCmm266CV9f32K1lf744w8SExO57bbbLjhuERERcT53vB47l99++42OHTsWTakHqFKlCsOGDWP37t1s2rQJgJCQEPbv38+KFSvOeK6QkBCWLVvGwYMHnR6niBSnxJCIGwoPD6dXr15MnjyZH374gYKCAgYOHHjafffs2UNUVBSBgYHFtjdr1qzo+cJHu91eNBWrUJMmTYp9ffjwYZKTk/nkk08IDw8vttx5550AJCQklPg9ffPNN3Ts2JEjR46wY8cOduzYQdu2bcnNzeX7778v2m/nzp00adIET88zz5TduXMnUVFRhIaGljiOs6lXr94p25KSknjkkUeIiIjAz8+P8PDwov1SUlIA83uWmppKy5Ytz3r+kJAQ+vbtW2z+/aRJk6hZsyaXXXaZE9+JiIiIlJY7Xo+dy549e06J5XTv46mnnqJKlSp07NiRRo0aMXz4cP75559ix7z++uts2LCB2rVr07FjR1544QV27drl9JhFRDWGRNzWLbfcwr333kt8fDx9+vQhJCSkXF7X4XAAcNtttzF06NDT7tO6desSnXP79u1Fnyg1atTolOcnTZrEsGHDShjp2Z1p5FBBQcEZjzlxdFChm266icWLF/Pkk0/Spk0bqlSpgsPh4Kqrrir6XpXEkCFD+P7771m8eDGtWrXip59+4sEHH8RuV55fRESkonGn6zFnatasGVu3buWXX37h999/Z/r06fz3v/9lzJgxvPjii4B5DXXJJZcwY8YM/vzzT9544w1ee+01fvjhh6K6TSLiHEoMibip66+/nvvuu4+lS5cyderUM+5Xt25d5syZQ1paWrFPqbZs2VL0fOGjw+EoGpFTaOvWrcXOV9gho6CggF69ejnlvUyaNAkvLy++/vprPDw8ij23aNEi3nvvPfbu3UudOnVo0KABy5YtIy8vDy8vr9Oer0GDBvzxxx8kJSWdcdRQ1apVAUhOTi62vfCTrvNx9OhR5s6dy4svvsiYMWOKtm/fvr3YfuHh4QQFBbFhw4ZznvOqq64iPDycSZMm0alTJzIz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lixZwr59+/jtt98sjk7EhYQ1NB81YkhEpMRKnBi64447yiAMEZETFI4WanAZBEZaG4uISBnq3r0727Zt44MPPmDLli0ADBgwgGHDhvHyyy9zySWXWByhiIsI04ghEZELVeLE0BdffEGVKlW48cbin+J///33ZGZmMnToUKcFJyKVkMMB644lhmIGWxuLiEg5iIqKOqXI9Nq1a/nss8/45JNPLIpKxMUUTiVL2Qf5OeDpY208IiIupMTFp8eNG0e1atVO2V69enXGjh3rlKBEpBLbu8RsNesdCE2utjoaERERcQVVqoN3FTAccHS31dGIiLiUEieG9u7dS7169U7ZXrduXfbu3euUoESkEls7xXxs0Q+8/a2NRURERFyDzWa2rAdNJxMRKaESJ4aqV6/OunXrTtm+du1awsLCnBKUiFRSeVmwcaa5rmlkIiIiUhKFdYZUgFpEpERKXGNo8ODBPPzwwwQGBnLppZcCMH/+fB555BEGDRrk9ABFpBLZ8ivkpkFIHajT1epoRETKzIABA876fHJycvkEIuJO1LJeROSClDgx9H//93/s3r2byy+/HE9P83CHw8GQIUNUY0hESqewG1nrQWAv8YBGERGXERwcfM7nhwwZUk7RiLgJjRgSEbkgJU4MeXt7M3XqVF5++WXWrFmDn58frVq1om7dumURn4hUFmnxsHOuuR6j0Yci4t6++OILq0MQcT9FI4Z2WRuHiIiLKXFiqFCjRo1o1KiRM2MRkcps/fdmJ5FaHY9/4iciIiJyvgqvH1L3m3ULvfysjUdExEWUeK7GDTfcwGuvvXbK9tdff50bb7zRKUGJSCVUOI1Mo4VERETkQviHgc+xaZpJsdbGIiLiQkqcGFqwYAFXX331Kdv79OnDggULnBKUiFQy8evh0Abw8IYW11sdjYiIiLgimw3CjrWsV50hEZHzVuLEUHp6Ot7e3qds9/LyIjU11SlBiUglUzhaqEkf8A+1NhYRERFxXepMJiJSYiVODLVq1YqpU6eesv3bb7+lefPmTglKRCqRgnxY9525HjPY2lhERETEtYU1NB81YkhE5LyVuPj06NGjGTBgADt37uSyyy4DYO7cuUyePJlp06Y5PUARcXO75kFGglkXoGEvq6MRERERVxamzmQiIiVV4sRQ3759mTlzJmPHjmXatGn4+fkRExPDX3/9RWiopoCISAmtmWw+troRPLysjUVERERcW+FUMo0YEhE5byWeSgZwzTXX8M8//5CRkcGuXbu46aabeOKJJ4iJiXF2fCLizrKSYcuv5rq6kYmIiEhpFRafTouDnHRrYxERcREXlBgCszvZ0KFDiYqK4q233uKyyy5j6dKlzoxNRNzdph+hIAfCm0KNNlZHIyIiIq7Oryr4HZvFkKTpZCIi56NEU8ni4+OZOHEin332Gampqdx0003k5OQwc+ZMFZ4WkZIr7EYWM8hsMSsiIiJSWmENYH+SOZ2sRmuroxERqfDOe8RQ3759adKkCevWrWP8+PEcPHiQ999/vyxjExF3lhQLexcDNmh9s9XRiIiIiLtQy3oRkRI57xFDs2bN4uGHH+aBBx6gUaNGZRmTiFQGhS3q6/eAoChLQxERERE3UtiZTFPJRETOy3mPGFq0aBFpaWm0b9+eTp06MWHCBBITE8syNhFxV4YBa6eY6zGDrY1FRERE3EvosQLUGjEkInJezjsx1LlzZz799FPi4uK47777+Pbbb4mKisLhcDB79mzS0tLKMk4RcSf7lsPRWPAKgGbXWh2NiIiIuJMwtawXESmJEnclCwgI4K677mLRokWsX7+exx9/nFdffZXq1atz3XXXXVAQH3zwAdHR0fj6+tKpUyeWL19+Xsd9++232Gw2+vfvf0GvKyIWWTvZfGzeD7wDrI1FRERE3EthjaGMw5Cdam0sIiIu4ILb1QM0adKE119/nf379zNlypQLOsfUqVMZOXIkzz//PKtWrSImJobevXuTkJBw1uN2797NE088wSWXXHJBrysiFsnLhg0zzPWYQdbGIiIiIu7HNwgCws11jRoSETmnUiWGCnl4eNC/f39++umnEh/79ttvc++993LnnXfSvHlzPvroI/z9/fn888/PeExBQQG33norL774IvXr1y9N6CJS3rbNgpwUCKoF0UrsioiISBlQZzIRkfPmlMTQhcrNzWXlypX06tWraJvdbqdXr14sWbLkjMe99NJLVK9enbvvvvucr5GTk0NqamqxRUQu0MK34ePu8NuTsPkXyEou+TnWfms+xtwMdkt/BYmIiIi7UmcyEZHzdt7t6stCYmIiBQUFREREFNseERHBli1bTnvMokWL+Oyzz1izZs15vca4ceN48cUXSxuqiBxcDXNfAgyIWwPLPwGbHWq0gfrdoV53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PT81JDrZg8vcBjMYuhA918rrms2g6Ggt24/UsKusnsr6loDDtthoB2nxTirrW04bxpniju4SBI3ITgx4YvgzaW7zUlrbzNHqJlravcwYefo8RuejN5/ZF3awqfQ9VzxMf8gcEnViv9XV9DMbRLnA4TJ7RjlcHZOdncd/oCP+l0IhERERERG5YGw2m/9ObfkpVlfTczabjSiH9UMWsxJjyBoVw8xRJwMVwzCobWqjqqGFyvpWqhpaqGpo4XjDye3Khlaq6s3tlnYfTR139ANIj3f6Q6DiwWkMy4zv87vkdYqJdvh7UgULBUPhYOJ8yO6YaygU2R1fCXucJ7ejOseFuno0472IiIiIiIhEFpvNRrLbSbLbydDMsx/b2WOrMyRKdjsZkhEXsvN09QV90w4HNhvkT7S6ChEREREREZGgdmqPrUFB1GvHSprFTEREREREREQkQikYEhERERERERGJUAqGREREREREREQilIIhEREREREREZEIpWBIREREJAIsXbqUQYMGERMTQ3FxMRs2bLC6JBEREQkCCoZEREREwtwrr7zCokWLWLx4MZs3b2bcuHHMmjWLiooKq0sTERERiykYEhEREQlzTz31FHfccQfz589n1KhRPPPMM7jdbp5//nmrSxMRERGLKRgSERERCWOtra1s2rSJmTNn+vfZ7XZmzpzJunXrun1NS0sLdXV1XRYREREJTwqGRERERMJYVVUVXq+XrKysLvuzsrIoKyvr9jVLliwhKSnJvwwYMOBClCoiIiIWUDAkIiIiIl089NBD1NbW+pfDhw9bXZKIiIj0kyirCxARERGR/pOeno7D4aC8vLzL/vLycrKzs7t9jcvlwuVyXYjyRERExGLqMSQiIiISxpxOJxMnTmTlypX+fT6fj5UrVzJ16lQLKxMREZFgoB5DIiIiImFu0aJFzJs3j0mTJjFlyhSefvppPB4P8+fPt7o0ERERsZiCIREREZEwd9NNN1FZWckjjzxCWVkZ48eP55133jltQmoRERGJPBEXDBmGAaDbroqIiAS5zs/qzs9uOT8LFy5k4cKFvXqt2k8iIiKhoTftp4gLhurr6wF021UREZEQUV9fT1JSktVlRDS1n0REREJLIO0nmxFhf4bz+XwcO3aMhIQEbDZbn/7suro6BgwYwOHDh0lMTOzTnx2udM4Cp3PWOzpvgdM5C5zO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\n"
},
"metadata": {}
}
]
},
{
"cell_type": "code",
"source": [
"\n",
"# Final evaluation\n",
"results = model.evaluate(X_test, y_test, verbose=0)\n",
"print(f\"\\nFinal Metrics:\")\n",
"print(f\"Test Accuracy: {results[1]*100:.2f}%\")\n",
"print(f\"Top-3 Accuracy: {results[2]*100:.2f}%\")"
],
"metadata": {
"id": "ddcxnETVAJoX",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "8473336b-33bf-4eb3-d286-d0aa79b7d37f"
},
"execution_count": 10,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"\n",
"Final Metrics:\n",
"Test Accuracy: 90.30%\n",
"Top-3 Accuracy: 99.40%\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"\n",
"# Save class names for inference\n",
"np.save('detection.npy', le.classes_)\n",
"model.save('detectiontest.h5')\n",
"print(\"\\nTraining complete! Model and class names saved.\")"
],
"metadata": {
"id": "-VaW2FhR5gbm",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "bd1b77fe-f28e-4d6c-a8b0-887cc39aaa40"
},
"execution_count": 12,
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. \n"
]
},
{
"output_type": "stream",
"name": "stdout",
"text": [
"\n",
"Training complete! Model and class names saved.\n"
]
}
]
}
]
} |