{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.7.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":3175,"databundleVersionId":44352,"sourceType":"competition"}],"dockerImageVersionId":30153,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))","metadata":{"_uuid":"89f26780-8ac9-4b4d-8d56-f91287392413","_cell_guid":"e5a69d22-9160-4274-a1c5-c260c86a03b2","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-02-27T21:58:44.988498Z","iopub.execute_input":"2025-02-27T21:58:44.989277Z","iopub.status.idle":"2025-02-27T21:58:45.015633Z","shell.execute_reply.started":"2025-02-27T21:58:44.989163Z","shell.execute_reply":"2025-02-27T21:58:45.015072Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import random\nfrom PIL import Image\nfrom cv2 import imread\nimport matplotlib.pyplot as plt","metadata":{"_uuid":"30622b9e-f6d5-46df-9c9c-164091608669","_cell_guid":"097343f7-6574-4226-adcc-983c080df5f6","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-02-27T21:58:47.574672Z","iopub.execute_input":"2025-02-27T21:58:47.575379Z","iopub.status.idle":"2025-02-27T21:58:47.839024Z","shell.execute_reply.started":"2025-02-27T21:58:47.575345Z","shell.execute_reply":"2025-02-27T21:58:47.838272Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!unzip -q ../input/galaxy-zoo-the-galaxy-challenge/images_training_rev1.zip\n!unzip -q ../input/galaxy-zoo-the-galaxy-challenge/training_solutions_rev1.zip","metadata":{"_uuid":"3d5c7f3b-3882-4388-90b0-256068963610","_cell_guid":"c13d82ca-a109-48c0-a129-4cc268a23e6e","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-02-27T21:58:50.337790Z","iopub.execute_input":"2025-02-27T21:58:50.338034Z","iopub.status.idle":"2025-02-27T21:59:07.448715Z","shell.execute_reply.started":"2025-02-27T21:58:50.338009Z","shell.execute_reply":"2025-02-27T21:59:07.447513Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_set = pd.read_csv('training_solutions_rev1.csv')\nfiles = os.listdir('./images_training_rev1')\n\ntrain_set.head()","metadata":{"_uuid":"fa3c5727-1c31-42cc-902d-da0b5360de11","_cell_guid":"77c481f5-98ec-4740-b5b0-c191aa70224d","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-02-27T21:59:11.757608Z","iopub.execute_input":"2025-02-27T21:59:11.758515Z","iopub.status.idle":"2025-02-27T21:59:12.039952Z","shell.execute_reply.started":"2025-02-27T21:59:11.758454Z","shell.execute_reply":"2025-02-27T21:59:12.039292Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(1, figsize=(9, 9))\nplt.axis('off')\nn = 0\nfor i in range(16):\n  n += 1\n  random_img = './images_training_rev1/'+random.choice(files)\n  imgs = imread(random_img)\n  plt.subplot(4, 4, n)\n  plt.axis('off')\n  plt.imshow(imgs)\n\nplt.show()","metadata":{"_uuid":"ed58a9b2-64a6-489c-83bf-cfd25ce3346f","_cell_guid":"1e3dc68a-c1b7-4f9b-91dd-808af7441369","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-02-27T21:59:14.624036Z","iopub.execute_input":"2025-02-27T21:59:14.624708Z","iopub.status.idle":"2025-02-27T21:59:15.745315Z","shell.execute_reply.started":"2025-02-27T21:59:14.624670Z","shell.execute_reply":"2025-02-27T21:59:15.744561Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install torch torchvision matplotlib scikit-learn","metadata":{"_uuid":"77e3f3fa-ecdb-44d1-8b34-d733305d25b3","_cell_guid":"0ccded97-87dc-4b92-ad04-5b9ca913739c","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-02-27T21:59:55.814045Z","iopub.execute_input":"2025-02-27T21:59:55.814350Z","iopub.status.idle":"2025-02-27T22:00:02.121239Z","shell.execute_reply.started":"2025-02-27T21:59:55.814318Z","shell.execute_reply":"2025-02-27T22:00:02.120355Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Import libraries\nimport torch\nimport numpy as np\nfrom torch import nn, optim\nfrom sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score\nfrom tqdm import tqdm\nimport matplotlib.pyplot as plt\nfrom sklearn.datasets import make_classification\nfrom torch.utils.data import DataLoader, TensorDataset\n\n# Create a simple model (for demonstration purposes)\nclass SimpleNN(nn.Module):\n    def __init__(self):\n        super(SimpleNN, self).__init__()\n        self.layer1 = nn.Linear(20, 64)\n        self.layer2 = nn.Linear(64, 32)\n        self.layer3 = nn.Linear(32, 1)\n    \n    def forward(self, x):\n        x = torch.relu(self.layer1(x))\n        x = torch.relu(self.layer2(x))\n        x = torch.sigmoid(self.layer3(x))\n        return x\n\n# Generate synthetic data\nX, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)\nX = torch.tensor(X, dtype=torch.float32)\ny = torch.tensor(y, dtype=torch.float32).view(-1, 1)\n\n# Split data into training and validation sets\ntrain_size = int(0.8 * len(X))\ntrain_X, val_X = X[:train_size], X[train_size:]\ntrain_y, val_y = y[:train_size], y[train_size:]\n\n# Create DataLoader for train and validation\ntrain_data = TensorDataset(train_X, train_y)\nval_data = TensorDataset(val_X, val_y)\ntrainloader = DataLoader(train_data, batch_size=64, shuffle=True)\nvalloader = DataLoader(val_data, batch_size=64)\n\n# Initialize model, loss function, and optimizer\nmodel = SimpleNN()\ncriterion = nn.BCELoss()  # Binary Cross-Entropy Loss for binary classification\noptimizer = optim.Adam(model.parameters(), lr=0.001)\n\n# Define Training Loop with Performance Metrics\ndef train_model(model, trainloader, valloader, criterion, optimizer, epoch):\n    model.train()\n    for ep in range(epoch):\n        train_loss = 0.0\n        correct, total = 0, 0\n        y_true, y_pred = [], []\n        \n        for data, label in tqdm(trainloader):\n            optimizer.zero_grad()\n            output = model(data)\n            loss = criterion(output, label)\n            loss.backward()\n            optimizer.step()\n            \n            train_loss += loss.item()\n            predicted = (output > 0.5).float()  # Convert predictions to 0 or 1\n            \n            correct += (predicted == label).sum().item()\n            y_true.extend(label.cpu().numpy())\n            y_pred.extend(predicted.cpu().numpy())\n        \n        # Calculate metrics for this epoch\n        accuracy = accuracy_score(y_true, y_pred)\n        precision = precision_score(y_true, y_pred)\n        recall = recall_score(y_true, y_pred)\n        f1 = f1_score(y_true, y_pred)\n        auc = roc_auc_score(y_true, y_pred)\n        \n        print(f\"Epoch {ep+1}/{epoch} - Train Loss: {train_loss/len(trainloader):.4f}, \"\n              f\"Accuracy: {accuracy:.4f}, Precision: {precision:.4f}, \"\n              f\"Recall: {recall:.4f}, F1 Score: {f1:.4f}, AUC: {auc:.4f}\")\n        \n        # Validation phase\n        model.eval()\n        val_loss = 0.0\n        y_true, y_pred = [], []\n        \n        with torch.no_grad():\n            for data, label in valloader:\n                output = model(data)\n                loss = criterion(output, label)\n                val_loss += loss.item()\n                \n                predicted = (output > 0.5).float()\n                y_true.extend(label.cpu().numpy())\n                y_pred.extend(predicted.cpu().numpy())\n        \n        val_accuracy = accuracy_score(y_true, y_pred)\n        val_precision = precision_score(y_true, y_pred)\n        val_recall = recall_score(y_true, y_pred)\n        val_f1 = f1_score(y_true, y_pred)\n        val_auc = roc_auc_score(y_true, y_pred)\n        \n        print(f\"Validation Loss: {val_loss/len(valloader):.4f}, \"\n              f\"Validation Accuracy: {val_accuracy:.4f}, \"\n              f\"Validation Precision: {val_precision:.4f}, \"\n              f\"Validation Recall: {val_recall:.4f}, \"\n              f\"Validation F1 Score: {val_f1:.4f}, Validation AUC: {val_auc:.4f}\")\n\n# Run the training process\ntrain_model(model, trainloader, valloader, criterion, optimizer, epoch=5)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-27T22:01:56.631360Z","iopub.execute_input":"2025-02-27T22:01:56.631934Z","iopub.status.idle":"2025-02-27T22:01:57.090580Z","shell.execute_reply.started":"2025-02-27T22:01:56.631902Z","shell.execute_reply":"2025-02-27T22:01:57.090007Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Import libraries\nimport torch\nimport numpy as np\nfrom torch import nn, optim\nfrom sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score\nfrom tqdm import tqdm\nimport matplotlib.pyplot as plt\nfrom sklearn.datasets import make_classification\nfrom torch.utils.data import DataLoader, TensorDataset\n\n# Create a simple model (for demonstration purposes)\nclass SimpleNN(nn.Module):\n    def __init__(self):\n        super(SimpleNN, self).__init__()\n        self.layer1 = nn.Linear(20, 64)\n        self.layer2 = nn.Linear(64, 32)\n        self.layer3 = nn.Linear(32, 1)\n    \n    def forward(self, x):\n        x = torch.relu(self.layer1(x))\n        x = torch.relu(self.layer2(x))\n        x = torch.sigmoid(self.layer3(x))\n        return x\n\n# Generate synthetic data\nX, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)\nX = torch.tensor(X, dtype=torch.float32)\ny = torch.tensor(y, dtype=torch.float32).view(-1, 1)\n\n# Split data into training and validation sets\ntrain_size = int(0.8 * len(X))\ntrain_X, val_X = X[:train_size], X[train_size:]\ntrain_y, val_y = y[:train_size], y[train_size:]\n\n# Create DataLoader for train and validation\ntrain_data = TensorDataset(train_X, train_y)\nval_data = TensorDataset(val_X, val_y)\ntrainloader = DataLoader(train_data, batch_size=64, shuffle=True)\nvalloader = DataLoader(val_data, batch_size=64)\n\n# Initialize model, loss function, and optimizer\nmodel = SimpleNN()\ncriterion = nn.BCELoss()  # Binary Cross-Entropy Loss for binary classification\noptimizer = optim.Adam(model.parameters(), lr=0.001)\n\n# Define Training Loop with Performance Metrics and Graph Plotting\ndef train_model(model, trainloader, valloader, criterion, optimizer, epoch):\n    # Lists to store metrics for plotting\n    train_losses, val_losses = [], []\n    train_accuracies, val_accuracies = [], []\n    train_precisions, val_precisions = [], []\n    train_recalls, val_recalls = [], []\n    train_f1s, val_f1s = [], []\n    train_aucs, val_aucs = [], []\n    \n    for ep in range(epoch):\n        model.train()\n        train_loss = 0.0\n        correct, total = 0, 0\n        y_true, y_pred = [], []\n        \n        for data, label in tqdm(trainloader):\n            optimizer.zero_grad()\n            output = model(data)\n            loss = criterion(output, label)\n            loss.backward()\n            optimizer.step()\n            \n            train_loss += loss.item()\n            predicted = (output > 0.5).float()  # Convert predictions to 0 or 1\n            \n            correct += (predicted == label).sum().item()\n            y_true.extend(label.cpu().numpy())\n            y_pred.extend(predicted.cpu().numpy())\n        \n        # Calculate metrics for this epoch\n        accuracy = accuracy_score(y_true, y_pred)\n        precision = precision_score(y_true, y_pred)\n        recall = recall_score(y_true, y_pred)\n        f1 = f1_score(y_true, y_pred)\n        auc = roc_auc_score(y_true, y_pred)\n        \n        train_losses.append(train_loss/len(trainloader))\n        train_accuracies.append(accuracy)\n        train_precisions.append(precision)\n        train_recalls.append(recall)\n        train_f1s.append(f1)\n        train_aucs.append(auc)\n        \n        print(f\"Epoch {ep+1}/{epoch} - Train Loss: {train_loss/len(trainloader):.4f}, \"\n              f\"Accuracy: {accuracy:.4f}, Precision: {precision:.4f}, \"\n              f\"Recall: {recall:.4f}, F1 Score: {f1:.4f}, AUC: {auc:.4f}\")\n        \n        # Validation phase\n        model.eval()\n        val_loss = 0.0\n        y_true, y_pred = [], []\n        \n        with torch.no_grad():\n            for data, label in valloader:\n                output = model(data)\n                loss = criterion(output, label)\n                val_loss += loss.item()\n                \n                predicted = (output > 0.5).float()\n                y_true.extend(label.cpu().numpy())\n                y_pred.extend(predicted.cpu().numpy())\n        \n        val_accuracy = accuracy_score(y_true, y_pred)\n        val_precision = precision_score(y_true, y_pred)\n        val_recall = recall_score(y_true, y_pred)\n        val_f1 = f1_score(y_true, y_pred)\n        val_auc = roc_auc_score(y_true, y_pred)\n        \n        val_losses.append(val_loss/len(valloader))\n        val_accuracies.append(val_accuracy)\n        val_precisions.append(val_precision)\n        val_recalls.append(val_recall)\n        val_f1s.append(val_f1)\n        val_aucs.append(val_auc)\n        \n        print(f\"Validation Loss: {val_loss/len(valloader):.4f}, \"\n              f\"Validation Accuracy: {val_accuracy:.4f}, \"\n              f\"Validation Precision: {val_precision:.4f}, \"\n              f\"Validation Recall: {val_recall:.4f}, \"\n              f\"Validation F1 Score: {val_f1:.4f}, Validation AUC: {val_auc:.4f}\")\n    \n    # Plotting the metrics\n    epochs = np.arange(1, epoch+1)\n    \n    # Loss plot\n    plt.figure(figsize=(12, 8))\n    plt.subplot(2, 3, 1)\n    plt.plot(epochs, train_losses, label='Train Loss')\n    plt.plot(epochs, val_losses, label='Validation Loss')\n    plt.title('Loss per Epoch')\n    plt.xlabel('Epochs')\n    plt.ylabel('Loss')\n    plt.legend()\n\n    # Accuracy plot\n    plt.subplot(2, 3, 2)\n    plt.plot(epochs, train_accuracies, label='Train Accuracy')\n    plt.plot(epochs, val_accuracies, label='Validation Accuracy')\n    plt.title('Accuracy per Epoch')\n    plt.xlabel('Epochs')\n    plt.ylabel('Accuracy')\n    plt.legend()\n\n    # Precision plot\n    plt.subplot(2, 3, 3)\n    plt.plot(epochs, train_precisions, label='Train Precision')\n    plt.plot(epochs, val_precisions, label='Validation Precision')\n    plt.title('Precision per Epoch')\n    plt.xlabel('Epochs')\n    plt.ylabel('Precision')\n    plt.legend()\n\n    # Recall plot\n    plt.subplot(2, 3, 4)\n    plt.plot(epochs, train_recalls, label='Train Recall')\n    plt.plot(epochs, val_recalls, label='Validation Recall')\n    plt.title('Recall per Epoch')\n    plt.xlabel('Epochs')\n    plt.ylabel('Recall')\n    plt.legend()\n\n    # F1 Score plot\n    plt.subplot(2, 3, 5)\n    plt.plot(epochs, train_f1s, label='Train F1 Score')\n    plt.plot(epochs, val_f1s, label='Validation F1 Score')\n    plt.title('F1 Score per Epoch')\n    plt.xlabel('Epochs')\n    plt.ylabel('F1 Score')\n    plt.legend()\n\n    # AUC plot\n    plt.subplot(2, 3, 6)\n    plt.plot(epochs, train_aucs, label='Train AUC')\n    plt.plot(epochs, val_aucs, label='Validation AUC')\n    plt.title('AUC per Epoch')\n    plt.xlabel('Epochs')\n    plt.ylabel('AUC')\n    plt.legend()\n\n    # Display the plots\n    plt.tight_layout()\n    plt.show()\n\n# Run the training process and plot graphs\ntrain_model(model, trainloader, valloader, criterion, optimizer, epoch=5)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-27T22:05:51.808081Z","iopub.execute_input":"2025-02-27T22:05:51.808914Z","iopub.status.idle":"2025-02-27T22:05:53.020347Z","shell.execute_reply.started":"2025-02-27T22:05:51.808876Z","shell.execute_reply":"2025-02-27T22:05:53.019634Z"}},"outputs":[],"execution_count":null}]}