{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":97984,"databundleVersionId":14096757,"sourceType":"competition"}],"dockerImageVersionId":31193,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.optim as optim\nimport torchvision.models as models\nfrom torchvision import datasets, transforms\nfrom torch.utils.data import DataLoader","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"device=torch.device('cuda' if torch.cuda.is_available() else 'cpu')\nprint(f\"Device: {device}\")\nif torch.cuda.is_available():\n    print(f\"GPU Name: {torch.cuda.get_device_name(0)}\")\n    print(f\"GPU Available: True\")\nelse:\n    print(\"GPU Available: False - Using CPU\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"mobilenet_v3_models=models.mobilenet_v3_large(pretrained=True)\nmobilenet_v3_models.classifier[3]=nn.Linear(\n    mobilenet_v3_models.classifier[3].in_features, \n    1000\n)\nmobilenet_v3_models=mobilenet_v3_models.to(device)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"transform=transforms.Compose([\n    transforms.Resize((224, 224)),\n    transforms.ToTensor(),\n    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])\n])","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_dataset=datasets.ImageFolder(root='/kaggle/input/physionet-ecg-image-digitization/train/', transform=transform)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_loader=DataLoader(train_dataset, batch_size=12, shuffle=True, num_workers=2, pin_memory=True)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"criterion=nn.CrossEntropyLoss()\noptimizer=optim.Adam(mobilenet_v3_models.parameters(), lr=0.0001)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"num_epochs=5\n\nfor epoch in range(num_epochs):\n    print(f\"Epoch {epoch+1}/{num_epochs}\")\n    mobilenet_v3_models.train()\n    running_loss = 0.0\n    \n    for batch_idx, (inputs, labels) in enumerate(train_loader):\n        inputs=inputs.to(device)\n        labels=labels.to(device)\n        \n        optimizer.zero_grad()\n        outputs=mobilenet_v3_models(inputs)\n        loss=criterion(outputs, labels)\n        \n        loss.backward()\n        optimizer.step()\n        \n        running_loss+=loss.item()\n        \n        if (batch_idx + 1) % 10 == 0:\n            avg_loss = running_loss / (batch_idx + 1)\n            print(f\"  Batch [{batch_idx+1}/{len(train_loader)}], Loss: {loss.item():.4f}, Avg Loss: {avg_loss:.4f}\")\n            \n            if torch.cuda.is_available():\n                print(f\"  GPU Memory: {torch.cuda.memory_allocated(0)/1e9:.2f} GB / {torch.cuda.max_memory_allocated(0)/1e9:.2f} GB\")\n    \n    epoch_loss = running_loss / len(train_loader)\n    print(f\"\\nEpoch [{epoch+1}/{num_epochs}] Complete - Average Loss: {epoch_loss:.4f}\")\n    \n    if torch.cuda.is_available():\n        torch.cuda.empty_cache()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"torch.save(mobilenet_v3_models.state_dict(), 'stage0_mobilenet_v3.pth')\nprint(\"Model saved as 'stage0_mobilenet_v3.pth'\")","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}