{"cells":[{"cell_type":"code","execution_count":1,"id":"67a85157-37a9-4aea-aaef-f1802ac133c2","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["Using device: cuda\n","Loading taxonomy data...\n","Loading training data...\n"]},{"data":{"application/vnd.jupyter.widget-view+json":{"model_id":"cd8b2332bdf94a13ab6e87762447b74c","version_major":2,"version_minor":0},"text/plain":["Validating files:   0%|          | 0/28564 [00:00<?, ?it/s]"]},"metadata":{},"output_type":"display_data"},{"name":"stderr","output_type":"stream","text":["INFO:timm.models._builder:Loading pretrained weights from Hugging Face hub (timm/regnety_008.pycls_in1k)\n"]},{"name":"stdout","output_type":"stream","text":["Found 28564 valid files.\n","Number of classes: 206\n","Dataset initialized with 28564 samples\n","Initializing model: regnety_008...\n","Available RegNet models: ['haloregnetz_b', 'nf_regnet_b0', 'nf_regnet_b1', 'nf_regnet_b2', 'nf_regnet_b3']... (showing first 5)\n"]},{"name":"stderr","output_type":"stream","text":["INFO:timm.models._hub:[timm/regnety_008.pycls_in1k] Safe alternative available for 'pytorch_model.bin' (as 'model.safetensors'). Loading weights using safetensors.\n","INFO:timm.models._builder:Converted input conv stem.conv pretrained weights from 3 to 1 channel(s)\n"]},{"name":"stdout","output_type":"stream","text":["Feature dimension detected: 768\n","Model moved to cuda\n","Starting full training for 15 epochs...\n"]},{"data":{"application/vnd.jupyter.widget-view+json":{"model_id":"00b0492e6fb24ab790ed683e8f2a8afd","version_major":2,"version_minor":0},"text/plain":["Epoch 1/15:   0%|          | 0/892 [00:00<?, ?it/s]"]},"metadata":{},"output_type":"display_data"},{"name":"stdout","output_type":"stream","text":["Batch shapes - inputs: torch.Size([32, 1, 224, 224]), targets: torch.Size([32, 206])\n","Epoch 1 - Loss: 0.0275, Acc: 0.9952\n","Epoch 1 completed in 688.9s\n","Train Loss: 0.0275, Train Acc: 0.9952\n"]},{"data":{"application/vnd.jupyter.widget-view+json":{"model_id":"0695dfd7dfd144018eb9dba674208ad9","version_major":2,"version_minor":0},"text/plain":["Epoch 2/15:   0%|          | 0/892 [00:00<?, ?it/s]"]},"metadata":{},"output_type":"display_data"},{"name":"stdout","output_type":"stream","text":["Epoch 2 - Loss: 0.0121, Acc: 0.9968\n","Epoch 2 completed in 535.1s\n","Train Loss: 0.0121, Train Acc: 0.9968\n","Saved best model at epoch 2\n"]},{"data":{"application/vnd.jupyter.widget-view+json":{"model_id":"16caf1b9187d4dfb840e9bd38938b808","version_major":2,"version_minor":0},"text/plain":["Epoch 3/15:   0%|          | 0/892 [00:00<?, ?it/s]"]},"metadata":{},"output_type":"display_data"},{"name":"stdout","output_type":"stream","text":["Epoch 3 - Loss: 0.0090, Acc: 0.9975\n","Epoch 3 completed in 418.9s\n","Train Loss: 0.0090, Train Acc: 0.9975\n","Saved best model at epoch 3\n"]},{"data":{"application/vnd.jupyter.widget-view+json":{"model_id":"41103ae2ed71447387ff85f883a4d456","version_major":2,"version_minor":0},"text/plain":["Epoch 4/15:   0%|          | 0/892 [00:00<?, ?it/s]"]},"metadata":{},"output_type":"display_data"},{"name":"stdout","output_type":"stream","text":["Epoch 4 - Loss: 0.0069, Acc: 0.9980\n","Epoch 4 completed in 415.5s\n","Train Loss: 0.0069, Train Acc: 0.9980\n","Saved best model at epoch 4\n"]},{"data":{"application/vnd.jupyter.widget-view+json":{"model_id":"2d04f24c661f49c5ab59e39e7962da34","version_major":2,"version_minor":0},"text/plain":["Epoch 5/15:   0%|          | 0/892 [00:00<?, ?it/s]"]},"metadata":{},"output_type":"display_data"},{"name":"stdout","output_type":"stream","text":["Epoch 5 - Loss: 0.0052, Acc: 0.9985\n","Epoch 5 completed in 423.4s\n","Train Loss: 0.0052, Train Acc: 0.9985\n","Saved best model at epoch 5\n"]},{"data":{"application/vnd.jupyter.widget-view+json":{"model_id":"5a0c6baa9c2148909649378d149f1a37","version_major":2,"version_minor":0},"text/plain":["Epoch 6/15:   0%|          | 0/892 [00:00<?, ?it/s]"]},"metadata":{},"output_type":"display_data"},{"name":"stdout","output_type":"stream","text":["Epoch 6 - Loss: 0.0037, Acc: 0.9989\n","Epoch 6 completed in 398.5s\n","Train Loss: 0.0037, Train Acc: 0.9989\n","Saved best model at epoch 6\n"]},{"data":{"application/vnd.jupyter.widget-view+json":{"model_id":"97830ecbcf314e13bed7f35d7ee62aa2","version_major":2,"version_minor":0},"text/plain":["Epoch 7/15:   0%|          | 0/892 [00:00<?, ?it/s]"]},"metadata":{},"output_type":"display_data"},{"name":"stdout","output_type":"stream","text":["Epoch 7 - Loss: 0.0024, Acc: 0.9992\n","Epoch 7 completed in 419.2s\n","Train Loss: 0.0024, Train Acc: 0.9992\n","Saved best model at epoch 7\n"]},{"data":{"application/vnd.jupyter.widget-view+json":{"model_id":"f71cc99aa262419da75f44899a6dd96f","version_major":2,"version_minor":0},"text/plain":["Epoch 8/15:   0%|          | 0/892 [00:00<?, ?it/s]"]},"metadata":{},"output_type":"display_data"},{"name":"stdout","output_type":"stream","text":["Epoch 8 - Loss: 0.0015, Acc: 0.9995\n","Epoch 8 completed in 439.9s\n","Train Loss: 0.0015, Train Acc: 0.9995\n","Saved best model at epoch 8\n"]},{"data":{"application/vnd.jupyter.widget-view+json":{"model_id":"96c5c8e4043043a4bbbb72021f0d79e4","version_major":2,"version_minor":0},"text/plain":["Epoch 9/15:   0%|          | 0/892 [00:00<?, ?it/s]"]},"metadata":{},"output_type":"display_data"},{"name":"stdout","output_type":"stream","text":["Epoch 9 - Loss: 0.0008, Acc: 0.9997\n","Epoch 9 completed in 436.0s\n","Train Loss: 0.0008, Train Acc: 0.9997\n","Saved best model at epoch 9\n"]},{"data":{"application/vnd.jupyter.widget-view+json":{"model_id":"4d22007baeb5436d947a8a13bff5a6f4","version_major":2,"version_minor":0},"text/plain":["Epoch 10/15:   0%|          | 0/892 [00:00<?, ?it/s]"]},"metadata":{},"output_type":"display_data"},{"name":"stdout","output_type":"stream","text":["Epoch 10 - Loss: 0.0005, Acc: 0.9999\n","Epoch 10 completed in 436.9s\n","Train Loss: 0.0005, Train Acc: 0.9999\n","Saved best model at epoch 10\n"]},{"data":{"application/vnd.jupyter.widget-view+json":{"model_id":"1e42cd9e0efb41079c525d95fe976ad4","version_major":2,"version_minor":0},"text/plain":["Epoch 11/15:   0%|          | 0/892 [00:00<?, ?it/s]"]},"metadata":{},"output_type":"display_data"},{"name":"stdout","output_type":"stream","text":["Epoch 11 - Loss: 0.0003, Acc: 0.9999\n","Epoch 11 completed in 435.8s\n","Train Loss: 0.0003, Train Acc: 0.9999\n","Saved best model at epoch 11\n"]},{"data":{"application/vnd.jupyter.widget-view+json":{"model_id":"3433d625a46045c9925945e41db9eb4e","version_major":2,"version_minor":0},"text/plain":["Epoch 12/15:   0%|          | 0/892 [00:00<?, ?it/s]"]},"metadata":{},"output_type":"display_data"},{"name":"stdout","output_type":"stream","text":["Epoch 12 - Loss: 0.0002, Acc: 1.0000\n","Epoch 12 completed in 416.9s\n","Train Loss: 0.0002, Train Acc: 1.0000\n","Saved best model at epoch 12\n"]},{"data":{"application/vnd.jupyter.widget-view+json":{"model_id":"9d4d46c9a67642d6ba3cae60c20eaf15","version_major":2,"version_minor":0},"text/plain":["Epoch 13/15:   0%|          | 0/892 [00:00<?, ?it/s]"]},"metadata":{},"output_type":"display_data"},{"name":"stdout","output_type":"stream","text":["Epoch 13 - Loss: 0.0001, Acc: 1.0000\n","Epoch 13 completed in 429.3s\n","Train Loss: 0.0001, Train Acc: 1.0000\n","Saved best model at epoch 13\n"]},{"data":{"application/vnd.jupyter.widget-view+json":{"model_id":"2ae37da1b3034f488c13c31e9fe3a9ca","version_major":2,"version_minor":0},"text/plain":["Epoch 14/15:   0%|          | 0/892 [00:00<?, ?it/s]"]},"metadata":{},"output_type":"display_data"},{"name":"stdout","output_type":"stream","text":["Epoch 14 - Loss: 0.0001, Acc: 1.0000\n","Epoch 14 completed in 441.9s\n","Train Loss: 0.0001, Train Acc: 1.0000\n","Saved best model at epoch 14\n"]},{"data":{"application/vnd.jupyter.widget-view+json":{"model_id":"dc699a2a839643d89cf80af667a1d1e5","version_major":2,"version_minor":0},"text/plain":["Epoch 15/15:   0%|          | 0/892 [00:00<?, ?it/s]"]},"metadata":{},"output_type":"display_data"},{"name":"stdout","output_type":"stream","text":["Epoch 15 - Loss: 0.0001, Acc: 1.0000\n","Epoch 15 completed in 426.2s\n","Train Loss: 0.0001, Train Acc: 1.0000\n","Saved best model at epoch 15\n"]},{"data":{"image/png":"iVBORw0KGgoAAAANSUhEUgAABKUAAAHqCAYAAADVi/1VAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACsf0lEQVR4nOzdd3gU1dvG8e9ueod0eiABQg0dQcRCJCgWmiIWioii4gtiRREQRKyIAoqNIoIgiIjKD42gooJ0pLfQSxqQSuruvH8gqzGAgEkm5f5c116S2bOzz6wsO7n3zHMshmEYiIiIiIiIiIiIlCCr2QWIiIiIiIiIiEjFo1BKRERERERERERKnEIpEREREREREREpcQqlRERERERERESkxCmUEhERERERERGREqdQSkRERERERERESpxCKRERERERERERKXEKpUREREREREREpMQplBIRERERERERkRKnUEpEREREREREREqcQikRMdXMmTOxWCysX7/e7FIuyebNm7n33nupUaMGbm5u+Pv7Ex0dzYwZM7DZbGaXJyIiImXAu+++i8VioW3btmaXUiYlJCTw5JNPEhkZiaenJ15eXrRs2ZKXXnqJlJQUs8sTkcvgbHYBIiJlxUcffcTgwYMJCQnhvvvuo27duqSnp7N8+XIGDhzIiRMneO6558wuU0REREq5OXPmEBYWxtq1a9m3bx8RERFml1RmrFu3jptvvpmMjAzuvfdeWrZsCcD69et55ZVXWLlyJd9//73JVYrIpVIoJSJyCX7//XcGDx5Mu3btWLp0KT4+Po77hg0bxvr169m2bVuRPFdmZiZeXl5Fsi8REREpXQ4cOMCqVatYtGgRDz30EHPmzGH06NFml3Vepe2cJCUlhe7du+Pk5MSmTZuIjIwscP/48eP58MMPi+S5Stuxi5RXunxPRMqETZs2cdNNN+Hr64u3tzedOnXi999/LzAmLy+PF198kbp16+Lu7k5AQAAdOnQgNjbWMSY+Pp4BAwZQvXp13NzcqFKlCrfffjsHDx686PO/+OKLWCwW5syZUyCQOqdVq1b0798fgJ9++gmLxcJPP/1UYMzBgwexWCzMnDnTsa1///54e3sTFxfHzTffjI+PD/fccw9DhgzB29ubM2fOFHquPn36EBoaWuBywf/9739cc801eHl54ePjQ9euXdm+fftFj0lERERK3pw5c6hcuTJdu3alV69ezJkz57zjUlJSePzxxwkLC8PNzY3q1avTt29fkpOTHWOys7MZM2YM9erVw93dnSpVqtCjRw/i4uKAojknAfjll1+44447qFmzJm5ubtSoUYPHH3+crKysQnXv2rWLO++8k6CgIDw8PKhfvz7PP/88AD/++CMWi4Uvv/yy0OPmzp2LxWJh9erVF3zt3n//fY4dO8bEiRMLBVIAISEhjBw50vGzxWJhzJgxhcaFhYU5ztvgr3YSP//8M4888gjBwcFUr16dhQsXOrafrxaLxVLgS8ldu3bRq1cv/P39cXd3p1WrVixZsuSCxyMimiklImXA9u3bueaaa/D19eXpp5/GxcWF999/n+uuu46ff/7Z0Y9hzJgxTJgwgQceeIA2bdqQlpbG+vXr2bhxIzfeeCMAPXv2ZPv27Tz22GOEhYWRmJhIbGwshw8fJiws7LzPf+bMGZYvX07Hjh2pWbNmkR9ffn4+MTExdOjQgTfeeANPT0/CwsKYOnUq3377LXfccUeBWr7++mv69++Pk5MTALNnz6Zfv37ExMTw6quvcubMGd577z06dOjApk2bLnhcIiIiUvLmzJlDjx49cHV1pU+fPrz33nusW7eO1q1bO8ZkZGRwzTXXsHPnTu6//35atGhBcnIyS5Ys4ejRowQGBmKz2bjllltYvnw5d911F0OHDiU9PZ3Y2Fi2bdtGeHj4Zdd2vnMSgAULFnDmzBkefvhhAgICWLt2LZMnT+bo0aMsWLDA8fgtW7ZwzTXX4OLiwoMPPkhYWBhxcXF8/fXXjB8/nuuuu44aNWowZ84cunfvXuh1CQ8Pp127dhesb8mSJXh4eNCrV6/LPrZL8cgjjxAUFMSoUaPIzMyka9eueHt78/nnn3PttdcWGDt//nwaNWpE48aNgbPnq1dffTXVqlXj2WefxcvLi88//5xu3brxxRdfFDpeEfmTISJiohkzZhiAsW7duguO6datm+Hq6mrExcU5th0/ftzw8fExOnbs6NgWFRVldO3a9YL7OX36tAEYr7/++mXV+McffxiAMXTo0Esa/+OPPxqA8eOPPxbYfuDAAQMwZsyY4djWr18/AzCeffbZAmPtdrtRrVo1o2fPngW2f/755wZgrFy50jAMw0hPTzcqVapkDBo0qMC4+Ph4w8/Pr9B2ERERMc/69esNwIiNjTUM4+znffXq1QudY4waNcoAjEWLFhXah91uNwzDMKZPn24AxsSJEy84pijOSQzDMM6cOVNo24QJEwyLxWIcOnTIsa1jx46Gj49PgW1/r8cwDGPEiBGGm5ubkZKS4tiWmJhoODs7G6NHjy70PH9XuXJlIyoq6qJj/g447z5r1apl9OvXz/HzufPRDh06GPn5+QXG9unTxwgODi6w/cSJE4bVajXGjh3r2NapUyejSZMmRnZ2tmOb3W432rdvb9StW/eSaxapaHT5noiUajabje+//55u3bpRp04dx/YqVapw99138+uvv5KWlgZApUqV2L59O3v37j3vvjw8PHB1deWnn37i9OnTl1zDuf2f77K9ovLwww8X+NlisXDHHXewdOlSMjIyHNvnz59PtWrV6NChAwCxsbGkpKTQp08fkpOTHTcnJyfatm3Ljz/+WGw1i4iIyOWZM2cOISEhXH/99cDZz/vevXszb968Apflf/HFF0RFRZ13do3FYnGMCQwM5LHHHrvgmCvxz3MSOHsOdU5mZibJycm0b98ewzDYtGkTAElJSaxcuZL777+/0Mzyv9fTt29fcnJyWLhwoWPb/Pnzyc/P5957771obWlpacV6PjZo0CDHTPRzevfuTWJiYoFLIBcuXIjdbqd3794AnDp1ihUrVnDnnXeSnp7uOB87efIkMTEx7N27l2PHjhVb3SJlmUIpESnVkpKSOHPmDPXr1y90X4MGDbDb7Rw5cgSAsWPHkpKSQr169WjSpAlPPfUUW7ZscYx3c3Pj1Vdf5X//+x8hISF07NiR1157jfj4+IvW4OvrC0B6enoRHtlfnJ2dqV69eqHtvXv3Jisry9GLICMjg6VLl3LHHXc4Tu7OBXA33HADQUFBBW7ff/89iYmJxVKziIiIXB6bzca8efO4/vrrOXDgAPv27WPfvn20bduWhIQEli9f7hgbFxfnuCzsQuLi4qhfvz7OzkXXkeVC5ySHDx+mf//++Pv74+3tTVBQkONyttTUVAD2798P8K91R0ZG0rp16wK9tObMmcNVV131r6sQ+vr6Ftv5GEDt2rULbevSpQt+fn7Mnz/fsW3+/Pk0a9aMevXqAbBv3z4Mw+CFF14odD52rom9zslEzk89pUSk3OjYsSNxcXF89dVXfP/993z00Ue89dZbTJs2jQceeAA4u1LerbfeyuLFi/nuu+94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Khnu7u5G/fr1jRdeeKHQPnNycozKlSsbfn5+RlZW1qW8jA7Hjx83Hn/8caNevXqGu7u74enpabRs2dIYP368kZqa6hhns9mMZ555xggMDDQ8PT2NmJgYY9++fUatWrWMfv36OcadOx9dt27dBZ8zNjbWAAyLxeI4P/2nuLg4o2/fvkZoaKjh4uJiVKtWzbjllluMhQsXXtbxiVQkFsP4x1xKERERERERkWKUn59P1apVufXWW/n444/NLkdETKKeUiIiIiIiIlKiFi9eTFJSUoHm6SJS8WimlIiIiIiIiJSINWvWsGXLFsaNG0dgYCAbN240uyQRMZFmSomIiIiIiEiJeO+993j44YcJDg7mk08+MbscETGZZkqJiIiIiIiIiEiJ00wpEREREREREREpcQqlRERERERERESkxDmbXUBZZbfbOX78OD4+PlgsFrPLERERkWJgGAbp6elUrVoVq1Xf5f1XOn8SERGpGC71HEqh1BU6fvw4NWrUMLsMERERKQFHjhyhevXqZpdR5un8SUREpGL5t3MohVJXyMfHBzj7Avv6+ppcjYiIiBSHtLQ0atSo4fjcl/9G508iIiIVw6WeQymUukLnppz7+vrqpEpERKSc06VmRUPnTyIiIhXLv51DqTmCiIiIiIiIiIiUOIVSIiIiIiIiIiJS4hRKiYiIiIiIiIhIiVNPKRERkStgs9nIy8szuwwpAq6urhddqlhKnt5fUpRcXFxwcnIyuwwRETkPhVIiIiKXwTAM4uPjSUlJMbsUKSJWq5XatWvj6upqdikVnt5fUlwqVapEaGioFi0QESllFEqJiIhchnO/MAcHB+Pp6alfcMo4u93O8ePHOXHiBDVr1tT/T5Pp/SVFzTAMzpw5Q2JiIgBVqlQxuSIREfk7hVIiIiKXyGazOX5hDggIMLscKSJBQUEcP36c/Px8XFxczC6nwtL7S4qLh4cHAImJiQQHB+tSPhGRUkQNFERERC7RuR43np6eJlciRencZXs2m83kSio2vb+kOJ37e6VeZSIipYtCKRERkcukS4rKF/3/LF30/0OKg/5eiYiUTgqlRERERERERESkxCmUEhERkSsSFhbGpEmTzC6jQlq5ciW33norVatWxWKxsHjx4n99zE8//USLFi1wc3MjIiKCmTNnFhozdepUwsLCcHd3p23btqxdu7bA/dnZ2Tz66KMEBATg7e1Nz549SUhIKKKjkr/T+0tERCoChVIiIiLlnMViuehtzJgxV7TfdevW8eCDD/6n2q677jqGDRv2n/ZREWVmZhIVFcXUqVMvafyBAwfo2rUr119/PZs3b2bYsGE88MADfPfdd44x8+fPZ/jw4YwePZqNGzcSFRVFTEyMY9UygMcff5yvv/6aBQsW8PPPP3P8+HF69OhR5MdXlpTm99c5n332GU5OTjz66KNFsj8REZGiotX3REREyrkTJ044/jx//nxGjRrF7t27Hdu8vb0dfzYMA5vNhrPzv58iBAUFFW2hcsluuukmbrrppkseP23aNGrXrs2bb74JQIMGDfj111956623iImJAWDixIkMGjSIAQMGOB7z7bffMn36dJ599llSU1P5+OOPmTt3LjfccAMAM2bMoEGDBvz+++9cddVVRXyUZUNZeH99/PHHPP3007z//vu8+eabuLu7F9m+L1dubq5jcQERERHNlBIRESnnQkNDHTc/Pz8sFovj5127duHj48P//vc/WrZsiZubG7/++itxcXHcfvvthISE4O3tTevWrfnhhx8K7PeflxdZLBY++ugjunfvjqenJ3Xr1mXJkiX/qfYvvviCRo0a4ebmRlhYmCNUOefdd9+lbt26uLu7ExISQq9evRz3LVy4kCZNmuDh4UFAQADR0dFkZmb+p3rKqtWrVxMdHV1gW0xMDKtXrwbOBgUbNmwoMMZqtRIdHe0Ys2HDBvLy8gqMiYyMpGbNmo4x/5STk0NaWlqBW3lT2t9fBw4cYNWqVTz77LPUq1ePRYsWFRozffp0x/usSpUqDBkyxHFfSkoKDz30ECEhIbi7u9O4cWO++eYbAMaMGUOzZs0K7GvSpEmEhYU5fu7fvz/dunVj/PjxVK1alfr16wMwe/ZsWrVqhY+PD6Ghodx9990FZuUBbN++nVtuuQVfX198fHy45ppriIuLY+XKlbi4uBAfH19g/LBhw7jmmmv+9TUREZHSQzOlSpmMnHw2HDpNenYetzStanY5IiLyLwzDICvPZspze7g4FdmKUs8++yxvvPEGderUoXLlyhw5coSbb76Z8ePH4+bmxieffMKtt97K7t27qVmz5gX38+KLL/Laa6/x+uuvM3nyZO655x4OHTqEv7//Zde0YcMG7rzzTsaMGUPv3r1ZtWoVjzzyCAEBAfTv35/1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S/pERCqwy51pPnLkSN5//30mT57Mjh07GDx4MN27d2fTpk2OMQ888ACxsbHMnj2brVu30rlzZ6Kjozl27JhjTFxcHB06dCAyMpKffvrp/9u78/CoqjSP47+qSlJZCCEbCQlbgMgqoCwxgAtNxgBuKA7ioCD99Ng6gEBaUBQU2yUtNoooA+r0YqO4DYKKI3SMEEHCImFT9h0CCQmQhAQSkqo7fxQpKAiINKmb5ft5nvsUde+5Ve89T6h68+acc7Vp0yZNmTJF/v51Y+2lVXtcU/c6NGmo0CA/k6MBAKDuM7UolZ+fL4fDoaioKI/9UVFRysnJqfKcnJycy7avfPyl13ziiSf08ccfa+nSpfr973+vV155RRMnTrxkrGVlZSoqKvLYAG9oHdlA//htT8156EbFhPjr0InTenTuOo38+1rty2dKHwDUR792pPncuXP1zDPPaODAgWrVqpUef/xxDRw4UNOnT5cknT59WvPnz9e0adN0yy23qE2bNpo6daratGmj2bNnu1/n2Wef1cCBAzVt2jTdcMMNat26te6++241btzYK9dd3Va615NilBQAAN5g+vQ9s6SkpOi2225T586d9dhjj2n69Ol66623VFZWVmX71NRUhYSEuLdmzZp5OWLUZxaLRf07NdG3f7hVo/q2lq/NomXb83T7G99rOlP6AKBeuZqR5mVlZReNZgoICNCKFSskSRUVFXI4HJdt43Q69fXXX+u6665TcnKyGjdurISEhIuWR6jNMivXk2pDUQoAAG8wtSgVEREhm82m3Nxcj/25ubmKjo6u8pzo6OjLtq98/DWvKUkJCQmqqKjQvn37qjw+adIkFRYWureDBw9e9tqA6hDo56MJye20ZNwtuuW6SJ1xOPXWd7uU9HqGljClDwDqhasZaZ6cnKzXX39dO3fulNPpVFpamj7//HMdOXJEkmudzcTERL344os6fPiwHA6HPvjgA2VmZrrbHD16VMXFxfrTn/6k/v3765///Kfuvfde3XfffcrIyKjyfWvTSPPsgtPad+yUbFaLerQMMzscAADqBVOLUn5+furWrZvS09Pd+5xOp9LT05WYmFjlOYmJiR7tJSktLc3dPi4uTtHR0R5tioqKtHr16ku+piRt2LBBVqv1ksPP7Xa7GjZs6LEBZmkV2UDvj+yhOQ91U2yjAGUXnNbv567TI39bq71M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","text/plain":["<Figure size 1200x500 with 2 Axes>"]},"metadata":{},"output_type":"display_data"},{"name":"stdout","output_type":"stream","text":["Saved final model.\n","Training completed in 112.87 minutes\n"]}],"source":"\"\"\"\n# BirdCLEF 2025 - RegNet Full Training (No Validation Split)\n\nThis notebook implements a RegNet model for the BirdCLEF 2025 competition.\nIt uses the entire dataset for training without a validation split to maximize\nthe amount of training data for the final model.\n\"\"\"\n\nimport os\nimport gc\nimport warnings\nimport logging\nimport time\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport librosa\nimport cv2\nfrom tqdm.auto import tqdm\nfrom pathlib import Path\nfrom collections import Counter\n\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torch.optim as optim\nfrom torch.utils.data import Dataset, DataLoader\nimport timm\n\nwarnings.filterwarnings(\"ignore\")\nlogging.basicConfig(level=logging.INFO)\n\n# Set random seeds for reproducibility\nSEED = 42\ntorch.manual_seed(SEED)\nnp.random.seed(SEED)\n\n# Configuration class\nclass CFG:\n    # Paths\n    train_audio_dir = \"C:/Users/lohit/Desktop/Radboud University/Machine Learning in Practice (NWI-IMC030)/Challenge 2/birdclef-2025/train_audio\"\n    train_csv = \"C:/Users/lohit/Desktop/Radboud University/Machine Learning in Practice (NWI-IMC030)/Challenge 2/birdclef-2025/train.csv\"\n    taxonomy_csv = \"C:/Users/lohit/Desktop/Radboud University/Machine Learning in Practice (NWI-IMC030)/Challenge 2/birdclef-2025/taxonomy.csv\"\n    model_save_path = \"./models\"\n    \n    # Audio parameters\n    sample_rate = 32000\n    duration = 5  # seconds\n    \n    # Mel spectrogram parameters\n    n_fft = 1024\n    hop_length = 512\n    n_mels = 64\n    fmin = 50\n    fmax = 14000\n    \n    # Image parameters\n    img_size = 224\n    \n    # Training parameters\n    model_name = 'regnety_008'\n    batch_size = 32\n    num_workers = 0  # Avoid dataloader deadlocks\n    epochs = 15\n    learning_rate = 3e-4\n    weight_decay = 1e-5\n    \n    # Mixed precision training\n    use_amp = True\n    \n    # Debug options\n    debug_mode = False     # Set to False for full training\n    debug_samples = 500    # Number of samples to use in debug mode\n    \n    # Device\n    device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n\ncfg = CFG()\n\n# Create model directory if it doesn't exist\nos.makedirs(cfg.model_save_path, exist_ok=True)\n\n# Load and prepare data\ndef load_data():\n    print(\"Loading taxonomy data...\")\n    taxonomy_df = pd.read_csv(cfg.taxonomy_csv)\n    species_map = {row['primary_label']: idx for idx, row in taxonomy_df.iterrows()}\n    \n    print(\"Loading training data...\")\n    train_df = pd.read_csv(cfg.train_csv)\n    \n    # Filter out missing files\n    valid_files = []\n    for idx, row in tqdm(train_df.iterrows(), total=len(train_df), desc=\"Validating files\"):\n        file_path = os.path.join(cfg.train_audio_dir, row['filename'])\n        if os.path.exists(file_path):\n            valid_files.append(idx)\n    \n    train_df = train_df.iloc[valid_files].reset_index(drop=True)\n    print(f\"Found {len(train_df)} valid files.\")\n    \n    # Debug mode: use smaller dataset\n    if cfg.debug_mode:\n        print(f\"Debug mode enabled. Using up to {cfg.debug_samples} samples.\")\n        \n        # Take a random sample\n        sample_size = min(cfg.debug_samples, len(train_df))\n        train_df = train_df.sample(sample_size, random_state=SEED)\n        \n        # Update species map to only include classes in our filtered dataset\n        present_classes = set(train_df['primary_label'].unique())\n        species_map = {species: idx for idx, species in enumerate(present_classes)}\n        \n        num_classes = len(species_map)\n        print(f\"Working with {num_classes} classes in debug mode\")\n    else:\n        # Full training mode\n        species_list = taxonomy_df['primary_label'].tolist()\n        num_classes = len(species_list)\n        print(f\"Number of classes: {num_classes}\")\n    \n    return train_df, taxonomy_df, species_map, num_classes\n\n# Audio processing functions\ndef audio_to_melspec(audio, cfg):\n    \"\"\"Convert audio data to mel spectrogram with optimized settings\"\"\"\n    # Handle NaN values\n    if np.isnan(audio).any():\n        audio = np.nan_to_num(audio)\n    \n    # Generate mel spectrogram\n    mel_spec = librosa.feature.melspectrogram(\n        y=audio,\n        sr=cfg.sample_rate,\n        n_fft=cfg.n_fft,\n        hop_length=cfg.hop_length,\n        n_mels=cfg.n_mels,\n        fmin=cfg.fmin,\n        fmax=cfg.fmax,\n        power=2.0\n    )\n    \n    # Convert to dB scale\n    mel_spec_db = librosa.power_to_db(mel_spec, ref=np.max)\n    \n    # Faster normalization\n    mel_spec_norm = (mel_spec_db + 80) / 80  # Typical dB range\n    \n    return np.clip(mel_spec_norm, 0, 1)  # Clip to [0, 1]\n\n# Dataset class\nclass BirdCLEFDataset(Dataset):\n    def __init__(self, df, species_map, cfg):\n        self.df = df\n        self.cfg = cfg\n        self.species_map = species_map\n        self.total_samples = len(df)\n        print(f\"Dataset initialized with {self.total_samples} samples\")\n        \n    def __len__(self):\n        return self.total_samples\n    \n    def __getitem__(self, idx):\n        row = self.df.iloc[idx]\n        file_path = os.path.join(self.cfg.train_audio_dir, row['filename'])\n        \n        try:\n            # Faster audio loading\n            audio, _ = librosa.load(\n                file_path, \n                sr=self.cfg.sample_rate, \n                res_type='kaiser_fast',  # Faster resampling\n                duration=self.cfg.duration  # Only load what we need\n            )\n            \n            # Make sure we have exactly cfg.duration seconds\n            expected_length = self.cfg.sample_rate * self.cfg.duration\n            if len(audio) < expected_length:\n                # Pad if shorter\n                audio = np.pad(audio, (0, expected_length - len(audio)), mode='constant')\n            elif len(audio) > expected_length:\n                # Trim if longer\n                audio = audio[:expected_length]\n            \n            # Convert to mel spectrogram\n            mel_spec = audio_to_melspec(audio, self.cfg)\n            \n            # Resize to target dimensions\n            mel_spec = cv2.resize(mel_spec, (self.cfg.img_size, self.cfg.img_size))\n            \n            # Add channel dimension and convert to tensor\n            mel_spec = torch.tensor(mel_spec, dtype=torch.float32).unsqueeze(0)  # Shape: [1, H, W]\n            \n            # Get label index\n            label_idx = self.species_map[row['primary_label']]\n            label = torch.zeros(len(self.species_map), dtype=torch.float32)\n            label[label_idx] = 1.0\n            \n            return mel_spec, label\n            \n        except Exception as e:\n            print(f\"Error loading file {file_path}: {e}\")\n            # Return a zero spectrogram and label if there's an error\n            mel_spec = torch.zeros((1, self.cfg.img_size, self.cfg.img_size), dtype=torch.float32)\n            label = torch.zeros(len(self.species_map), dtype=torch.float32)\n            return mel_spec, label\n\n# RegNet model with automatic feature detection\nclass BirdCLEFModel(nn.Module):\n    def __init__(self, model_name, num_classes, in_channels=1):\n        super().__init__()\n        \n        # Load the RegNet model\n        try:\n            self.backbone = timm.create_model(\n                model_name,\n                pretrained=True,\n                in_chans=in_channels,\n                num_classes=0  # Remove classifier head\n            )\n            \n            # Get the feature dimension automatically\n            with torch.no_grad():\n                dummy_input = torch.zeros(1, in_channels, cfg.img_size, cfg.img_size)\n                features = self.backbone(dummy_input)\n                feature_dim = features.shape[1]\n                print(f\"Feature dimension detected: {feature_dim}\")\n            \n            # Create a new classifier head\n            self.classifier = nn.Sequential(\n                nn.Dropout(0.2),\n                nn.Linear(feature_dim, num_classes)\n            )\n        except Exception as e:\n            print(f\"Error initializing RegNet: {e}\")\n            print(\"Check available models with: print(timm.list_models('regnet*'))\")\n            raise e\n        \n    def forward(self, x):\n        features = self.backbone(x)\n        output = self.classifier(features)\n        return output\n\ndef train_one_epoch(model, dataloader, criterion, optimizer, scheduler, device, use_amp, epoch):\n    model.train()\n    \n    running_loss = 0.0\n    correct_pred = 0\n    total_pred = 0\n    processed_batches = 0\n    \n    scaler = torch.cuda.amp.GradScaler() if use_amp else None\n    \n    pbar = tqdm(enumerate(dataloader), total=len(dataloader), desc=f\"Epoch {epoch+1}/{cfg.epochs}\")\n    \n    for i, (inputs, targets) in pbar:\n        # Print batch shape for debugging (first batch only)\n        if i == 0 and epoch == 0:\n            print(f\"Batch shapes - inputs: {inputs.shape}, targets: {targets.shape}\")\n        \n        inputs = inputs.to(device)\n        targets = targets.to(device)\n        \n        # Zero the parameter gradients\n        optimizer.zero_grad()\n        \n        try:\n            if use_amp:\n                # Forward pass with mixed precision\n                with torch.cuda.amp.autocast():\n                    outputs = model(inputs)\n                    loss = criterion(outputs, targets)\n                \n                # Backward and optimize\n                scaler.scale(loss).backward()\n                scaler.step(optimizer)\n                scaler.update()\n            else:\n                # Standard forward and backward pass\n                outputs = model(inputs)\n                loss = criterion(outputs, targets)\n                loss.backward()\n                optimizer.step()\n            \n            # Calculate accuracy metrics\n            predicted = (outputs > 0.5).float()\n            correct_pred += (predicted == targets).sum().item()\n            total_pred += targets.numel()\n            \n            # Update running loss\n            running_loss += loss.item() * inputs.size(0)\n            processed_batches += 1\n            \n            # Update progress bar\n            pbar.set_postfix({\n                'loss': f\"{loss.item():.4f}\",\n                'acc': f\"{(predicted == targets).sum().item() / targets.numel():.4f}\"\n            })\n        except Exception as e:\n            print(f\"Error in batch {i}: {e}\")\n            continue\n    \n    # Step the scheduler\n    if scheduler is not None:\n        scheduler.step()\n    \n    # Calculate epoch metrics\n    epoch_loss = running_loss / len(dataloader.dataset) if processed_batches > 0 else float('inf')\n    epoch_acc = correct_pred / total_pred if total_pred > 0 else 0\n    \n    print(f\"Epoch {epoch+1} - Loss: {epoch_loss:.4f}, Acc: {epoch_acc:.4f}\")\n    return epoch_loss, epoch_acc\n\ndef train_full_model():\n    # Load data\n    train_df, taxonomy_df, species_map, num_classes = load_data()\n    \n    # Create dataset and dataloader\n    train_dataset = BirdCLEFDataset(train_df, species_map, cfg)\n    \n    train_loader = DataLoader(\n        train_dataset,\n        batch_size=cfg.batch_size,\n        shuffle=True,\n        num_workers=cfg.num_workers,\n        pin_memory=True if torch.cuda.is_available() else False,\n        drop_last=True\n    )\n    \n    # Initialize model\n    print(f\"Initializing model: {cfg.model_name}...\")\n    try:\n        # List available RegNet models for reference\n        available_regnets = [m for m in timm.list_models() if 'regnet' in m.lower()]\n        print(f\"Available RegNet models: {available_regnets[:5]}... (showing first 5)\")\n        \n        # Initialize RegNet model\n        model = BirdCLEFModel(cfg.model_name, num_classes)\n    except Exception as e:\n        print(f\"Error initializing RegNet: {e}\")\n        raise e\n    \n    # Move model to device\n    model = model.to(cfg.device)\n    print(f\"Model moved to {cfg.device}\")\n    \n    # Set up loss, optimizer and scheduler\n    criterion = nn.BCEWithLogitsLoss()\n    optimizer = optim.AdamW(model.parameters(), lr=cfg.learning_rate, weight_decay=cfg.weight_decay)\n    scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=cfg.epochs)\n    \n    # Training loop\n    train_losses = []\n    train_accs = []\n    \n    print(f\"Starting full training for {cfg.epochs} epochs...\")\n    \n    for epoch in range(cfg.epochs):\n        # Train\n        epoch_start_time = time.time()\n        train_loss, train_acc = train_one_epoch(\n            model, train_loader, criterion, optimizer, scheduler, \n            cfg.device, cfg.use_amp, epoch\n        )\n        epoch_time = time.time() - epoch_start_time\n        \n        # Print epoch results\n        print(f\"Epoch {epoch+1} completed in {epoch_time:.1f}s\")\n        print(f\"Train Loss: {train_loss:.4f}, Train Acc: {train_acc:.4f}\")\n        \n        # Track metrics\n        train_losses.append(train_loss)\n        train_accs.append(train_acc)\n        \n        # Save model checkpoint\n        torch.save({\n            'epoch': epoch,\n            'model_state_dict': model.state_dict(),\n            'optimizer_state_dict': optimizer.state_dict(),\n            'scheduler_state_dict': scheduler.state_dict() if scheduler else None,\n            'loss': train_loss,\n            'accuracy': train_acc,\n            'species_map': species_map,  # Save mapping for inference\n        }, os.path.join(cfg.model_save_path, f\"model_epoch_{epoch+1}.pth\"))\n        \n        # Save as best model too (for compatibility with inference code)\n        if epoch == cfg.epochs - 1 or (epoch > 0 and train_loss < min(train_losses[:-1])):\n            torch.save({\n                'epoch': epoch,\n                'model_state_dict': model.state_dict(),\n                'optimizer_state_dict': optimizer.state_dict(),\n                'scheduler_state_dict': scheduler.state_dict() if scheduler else None,\n                'loss': train_loss,\n                'accuracy': train_acc,\n                'species_map': species_map,  # Save mapping for inference\n            }, os.path.join(cfg.model_save_path, \"best_model.pth\"))\n            print(f\"Saved best model at epoch {epoch+1}\")\n        \n        # Clean up memory\n        gc.collect()\n        if torch.cuda.is_available():\n            torch.cuda.empty_cache()\n    \n    # Plot training curves\n    plt.figure(figsize=(12, 5))\n    \n    plt.subplot(1, 2, 1)\n    plt.plot(train_losses, label='Train Loss')\n    plt.xlabel('Epoch')\n    plt.ylabel('Loss')\n    plt.legend()\n    plt.title('Loss Curve')\n    \n    plt.subplot(1, 2, 2)\n    plt.plot(train_accs, label='Train Accuracy')\n    plt.xlabel('Epoch')\n    plt.ylabel('Accuracy')\n    plt.legend()\n    plt.title('Accuracy Curve')\n    \n    plt.tight_layout()\n    plt.savefig('training_curves.png')\n    plt.show()\n    \n    # Save final model\n    torch.save({\n        'epoch': cfg.epochs-1,\n        'model_state_dict': model.state_dict(),\n        'species_map': species_map,  # Save mapping for inference\n    }, os.path.join(cfg.model_save_path, \"final_model.pth\"))\n    \n    print(\"Saved final model.\")\n    \n    return model, train_losses, train_accs\n\nif __name__ == \"__main__\":\n    start_time = time.time()\n    print(f\"Using device: {cfg.device}\")\n    try:\n        model, train_losses, train_accs = train_full_model()\n        print(f\"Training completed in {(time.time() - start_time)/60:.2f} minutes\")\n    except Exception as e:\n        print(f\"Error during training: {e}\")\n        import traceback\n        traceback.print_exc()"}],"metadata":{"kernelspec":{"display_name":"Python 3 (ipykernel)","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.12.7"}},"nbformat":4,"nbformat_minor":5}