{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.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":87323,"databundleVersionId":9934427,"sourceType":"competition"}],"dockerImageVersionId":30823,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport pandas as pd\nimport torch\nfrom torch.utils.data import Dataset, DataLoader\nfrom torchvision import transforms, models\nfrom PIL import Image\nfrom sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score, confusion_matrix\nfrom sklearn.preprocessing import LabelBinarizer\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom torch.utils.data import Dataset, DataLoader, random_split","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-20T13:42:51.817995Z","iopub.execute_input":"2025-01-20T13:42:51.81821Z","iopub.status.idle":"2025-01-20T13:42:57.071886Z","shell.execute_reply.started":"2025-01-20T13:42:51.818189Z","shell.execute_reply":"2025-01-20T13:42:57.070946Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class TrainDataset(Dataset):\n    def __init__(self, csv_file, root_dir, transform=None):\n        self.annotations = pd.read_csv(csv_file)\n        self.root_dir = root_dir\n        self.transform = transform\n        \n        self.label_mapping = {label: idx for idx, label in enumerate(self.annotations['label'].unique())}\n        \n    def __len__(self):\n        return len(self.annotations)\n\n    def __getitem__(self, idx):\n        img_name = os.path.join(self.root_dir, self.annotations.iloc[idx, 0])\n        image = Image.open(img_name).convert(\"RGB\")\n        label_text = self.annotations.iloc[idx, 1]\n        label = self.label_mapping[label_text]\n        \n        if self.transform:\n            image = self.transform(image)\n        \n        return image, label","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-20T13:43:30.22954Z","iopub.execute_input":"2025-01-20T13:43:30.229976Z","iopub.status.idle":"2025-01-20T13:43:30.23971Z","shell.execute_reply.started":"2025-01-20T13:43:30.229942Z","shell.execute_reply":"2025-01-20T13:43:30.238625Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class TestDataset(Dataset):\n    def __init__(self, root_dir, transform=None):\n        self.root_dir = root_dir\n        self.filenames = os.listdir(root_dir)\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.filenames)\n\n    def __getitem__(self, idx):\n        img_name = os.path.join(self.root_dir, self.filenames[idx])\n        image = Image.open(img_name).convert(\"RGB\")\n        \n        if self.transform:\n            image = self.transform(image)\n        \n        return image, self.filenames[idx]\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-20T13:43:35.57166Z","iopub.execute_input":"2025-01-20T13:43:35.572005Z","iopub.status.idle":"2025-01-20T13:43:35.576927Z","shell.execute_reply.started":"2025-01-20T13:43:35.571976Z","shell.execute_reply":"2025-01-20T13:43:35.575931Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"transform = transforms.Compose([\n    transforms.RandomResizedCrop(224),\n    transforms.RandomHorizontalFlip(p=0.5),\n    transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),\n    # transforms.RandomRotation(degrees=15),\n    transforms.ToTensor(),\n    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])\n])\n# transform = transforms.Compose([\n#     transforms.Resize((224,224)),\n#     # transforms.RandomRotation(15),\n#     # transforms.RandomHorizontalFlip(p=0.5),\n#     transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),\n#     transforms.ToTensor(),\n#     transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n# ])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-20T13:43:38.035Z","iopub.execute_input":"2025-01-20T13:43:38.035341Z","iopub.status.idle":"2025-01-20T13:43:38.040004Z","shell.execute_reply.started":"2025-01-20T13:43:38.035313Z","shell.execute_reply":"2025-01-20T13:43:38.039119Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_dataset = TrainDataset(csv_file='/kaggle/input/cidaut-ai-fake-scene-classification-2024/train.csv', root_dir='/kaggle/input/cidaut-ai-fake-scene-classification-2024/Train', transform=transform)\ntest_dataset = TestDataset(root_dir='/kaggle/input/cidaut-ai-fake-scene-classification-2024/Test', transform=transform)\n\ntrain_size = int(0.99 * len(train_dataset))\nval_size = len(train_dataset) - train_size\ntrain_data, val_data = random_split(train_dataset, [train_size, val_size])\n\ntrain_loader = DataLoader(train_data, batch_size=32, shuffle=True)\nval_loader = DataLoader(val_data, batch_size=32, shuffle=False)\ntest_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-20T13:43:50.042242Z","iopub.execute_input":"2025-01-20T13:43:50.042538Z","iopub.status.idle":"2025-01-20T13:43:50.10212Z","shell.execute_reply.started":"2025-01-20T13:43:50.042515Z","shell.execute_reply":"2025-01-20T13:43:50.101424Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"image, label = train_dataset[0]\nprint(\"Label (Numeric):\", label)\nprint(\"Label (Text):\", list(train_dataset.label_mapping.keys())[list(train_dataset.label_mapping.values()).index(label)])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-20T13:43:52.284234Z","iopub.execute_input":"2025-01-20T13:43:52.284537Z","iopub.status.idle":"2025-01-20T13:43:52.402962Z","shell.execute_reply.started":"2025-01-20T13:43:52.284513Z","shell.execute_reply":"2025-01-20T13:43:52.402079Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from collections import Counter\n\ntrain_labels = [train_dataset[idx][1] for idx in train_data.indices]\ntrain_label_counts = Counter(train_labels)\n\nval_labels = [train_dataset[idx][1] for idx in val_data.indices]\nval_label_counts = Counter(val_labels)\n\nprint(\"Training Labels Distribution:\", train_label_counts)\nprint(\"Validation Labels Distribution:\", val_label_counts)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-20T13:43:53.267446Z","iopub.execute_input":"2025-01-20T13:43:53.267774Z","iopub.status.idle":"2025-01-20T13:44:14.131869Z","shell.execute_reply.started":"2025-01-20T13:43:53.267747Z","shell.execute_reply":"2025-01-20T13:44:14.130982Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\ndata_iter = iter(train_loader)\nimages, labels = next(data_iter)\n\nimage = images[0].numpy().transpose((1, 2, 0))\nmean = [0.485, 0.456, 0.406]\nstd = [0.229, 0.224, 0.225]\nimage = std * image + mean\nimage = image.clip(0, 1)\n\nplt.imshow(image)\nplt.title(f\"Label: {labels[0].item()}\")\nplt.axis('off')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-20T13:44:14.133154Z","iopub.execute_input":"2025-01-20T13:44:14.133492Z","iopub.status.idle":"2025-01-20T13:44:15.010066Z","shell.execute_reply.started":"2025-01-20T13:44:14.133448Z","shell.execute_reply":"2025-01-20T13:44:15.009075Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# model = models.densenet121(pretrained=True)\n# num_classes = 2\n# model.classifier = torch.nn.Linear(model.classifier.in_features, num_classes)\n# device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n# model = model.to(device)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-20T13:44:15.011816Z","iopub.execute_input":"2025-01-20T13:44:15.012116Z","iopub.status.idle":"2025-01-20T13:44:15.015447Z","shell.execute_reply.started":"2025-01-20T13:44:15.012093Z","shell.execute_reply":"2025-01-20T13:44:15.014594Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from transformers import (\n    ViTForImageClassification,\n    DeiTForImageClassification,\n    SwinForImageClassification,\n    ConvNextForImageClassification,\n    ResNetForImageClassification,\n    EfficientNetForImageClassification,\n    BeitForImageClassification,\n    AutoFeatureExtractor,\n)\nimport torch\nfrom torchvision import models\n\nmodel_names = {\n    \"vit\": \"google/vit-base-patch16-224-in21k\",\n    \"deit\": \"facebook/deit-base-distilled-patch16-224\",\n    \"swin\": \"microsoft/swin-base-patch4-window7-224\",\n    \"convnext\": \"facebook/convnext-base-224\",\n    \"resnet\": \"microsoft/resnet-50\",\n    \"efficientnet\": \"google/efficientnet-b0\",\n    \"regnet\": \"facebook/regnet-y-8gf\",\n    \"beit\": \"microsoft/beit-base-patch16-224\",\n    \"convnext_large\": \"facebook/convnext-large-224\",\n    \"swin_large\": \"microsoft/swin-large-patch4-window12-384\",\n    \"vit_large\": \"google/vit-large-patch32-384\",\n    \"efficientnet_v2_m\": \"efficientnet_v2_m\",\n    \"alexnet\": \"alexnet\",\n    \"vgg16\": \"vgg16\",\n    \"densenet\": \"densenet121\",\n    \"inception\": \"inception_v3\",\n    \"mobilenet_v2\": \"mobilenet_v2\",\n    \"mobilenet_v3_small\": \"mobilenet_v3_small\",\n    \"mobilenet_v3_large\": \"mobilenet_v3_large\",\n}\n\nselected_model_key = \"swin\"\nselected_model_name = model_names[selected_model_key]\nif selected_model_key == \"vit\":\n    model = ViTForImageClassification.from_pretrained(\n        selected_model_name, \n        num_labels=2, \n        ignore_mismatched_sizes=True\n    )\nelif selected_model_key == \"deit\":\n    model = DeiTForImageClassification.from_pretrained(\n        selected_model_name, \n        num_labels=2, \n        ignore_mismatched_sizes=True\n    )\nelif selected_model_key == \"swin\" or selected_model_key == \"swin_large\":\n    model = SwinForImageClassification.from_pretrained(\n        selected_model_name, \n        num_labels=2, \n        attention_probs_dropout_prob = 0.05,\n        hidden_dropout_prob = 0.05,\n        ignore_mismatched_sizes=True\n    )\nelif selected_model_key == \"convnext\":\n    model = ConvNextForImageClassification.from_pretrained(\n        selected_model_name, \n        num_labels=2, \n        ignore_mismatched_sizes=True\n    )\nelif selected_model_key == \"resnet\":\n    model = ResNetForImageClassification.from_pretrained(\n        selected_model_name, num_labels=2, ignore_mismatched_sizes=True\n    )\nelif selected_model_key == \"efficientnet\":\n    model = EfficientNetForImageClassification.from_pretrained(\n        selected_model_name, num_labels=2, ignore_mismatched_sizes=True\n    )\nelif selected_model_key == \"beit\":\n    model = BeitForImageClassification.from_pretrained(\n        selected_model_name, num_labels=2, ignore_mismatched_sizes=True\n    )\nelif selected_model_key == \"efficientnet_v2_m\":\n    model = models.efficientnet_v2_m(weights=models.EfficientNet_V2_M_Weights.IMAGENET1K_V1)\n    model.classifier[-1] = torch.nn.Linear(model.classifier[-1].in_features, 2) \nelif selected_model_key == \"alexnet\":\n    model = models.alexnet(weights=models.AlexNet_Weights.IMAGENET1K_V1)\n    model.classifier[-1] = torch.nn.Linear(model.classifier[-1].in_features, 2)\nelif selected_model_key == \"vgg16\":\n    model = models.vgg16(weights=models.VGG16_Weights.IMAGENET1K_V1)\n    model.classifier[-1] = torch.nn.Linear(model.classifier[-1].in_features, 2)\nelif selected_model_key == \"densenet\":\n    model = models.densenet121(weights=models.DenseNet121_Weights.IMAGENET1K_V1)\n    model.classifier = torch.nn.Linear(model.classifier.in_features, 2)\nelif selected_model_key == \"inception\":\n    model = models.inception_v3(weights=models.Inception_V3_Weights.IMAGENET1K_V1)\n    model.fc = torch.nn.Linear(model.fc.in_features, 2)\nelif selected_model_key == \"mobilenet_v2\":\n    model = models.mobilenet_v2(weights=models.MobileNet_V2_Weights.IMAGENET1K_V1)\n    model.classifier[-1] = torch.nn.Linear(model.classifier[-1].in_features, 2)\nelif selected_model_key == \"mobilenet_v3_small\":\n    model = models.mobilenet_v3_small(weights=models.MobileNet_V3_Small_Weights.IMAGENET1K_V1)\n    model.classifier[-1] = torch.nn.Linear(model.classifier[-1].in_features, 2)\nelif selected_model_key == \"mobilenet_v3_large\":\n    model = models.mobilenet_v3_large(weights=models.MobileNet_V3_Large_Weights.IMAGENET1K_V1)\n    model.classifier[-1] = torch.nn.Linear(model.classifier[-1].in_features, 2)\nelse:\n    raise ValueError(\"Invalid model key!\")\n# feature_extractor = AutoFeatureExtractor.from_pretrained(selected_model_name)\n\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\nmodel = model.to(device)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-20T14:33:40.557111Z","iopub.execute_input":"2025-01-20T14:33:40.557433Z","iopub.status.idle":"2025-01-20T14:33:41.855433Z","shell.execute_reply.started":"2025-01-20T14:33:40.557406Z","shell.execute_reply":"2025-01-20T14:33:41.85474Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"device","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-20T14:33:41.856396Z","iopub.execute_input":"2025-01-20T14:33:41.856595Z","iopub.status.idle":"2025-01-20T14:33:41.861435Z","shell.execute_reply.started":"2025-01-20T14:33:41.856578Z","shell.execute_reply":"2025-01-20T14:33:41.860647Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"criterion = torch.nn.CrossEntropyLoss()\noptimizer = torch.optim.Adam(model.parameters(), lr=5e-5)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-20T14:33:41.863027Z","iopub.execute_input":"2025-01-20T14:33:41.863235Z","iopub.status.idle":"2025-01-20T14:33:41.880711Z","shell.execute_reply.started":"2025-01-20T14:33:41.863215Z","shell.execute_reply":"2025-01-20T14:33:41.880081Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# num_epochs = 10\n\n# train_losses = []\n# val_losses = []\n# train_accuracies = []\n# val_accuracies = []\n# train_f1_scores = []\n# val_f1_scores = []\n\n# for epoch in range(num_epochs):\n#     model.train()\n#     running_loss = 0.0\n#     true_labels = []\n#     predicted_labels = []\n    \n#     for images, labels in train_loader:\n#         images, labels = images.to(device), labels.to(device)\n        \n#         optimizer.zero_grad()\n#         outputs = model(images)\n#         loss = criterion(outputs, labels)\n#         loss.backward()\n#         optimizer.step()\n        \n#         running_loss += loss.item()\n        \n#         true_labels.extend(labels.cpu().numpy())\n#         _, predicted = torch.max(outputs, 1)\n#         predicted_labels.extend(predicted.cpu().numpy())\n    \n#     accuracy = accuracy_score(true_labels, predicted_labels)\n#     precision = precision_score(true_labels, predicted_labels, average='macro', zero_division=1)\n#     recall = recall_score(true_labels, predicted_labels, average='macro', zero_division=1)\n#     f1 = f1_score(true_labels, predicted_labels, average='macro', zero_division=1)\n    \n#     outputs = torch.tensor(predicted_labels)\n#     auc = roc_auc_score(true_labels, outputs, average='macro', multi_class='ovr')\n    \n#     print(f\"Epoch {epoch+1}, Loss: {running_loss/len(train_loader)}\")\n#     print(f\"Accuracy: {accuracy:.4f}, Precision: {precision:.4f}, Recall: {recall:.4f}, F1: {f1:.4f}, AUC: {auc:.4f}\")\n\n#     train_losses.append(running_loss / len(train_loader))\n#     train_accuracies.append(accuracy)\n#     train_f1_scores.append(f1)\n    \n#     model.eval()\n#     val_running_loss = 0.0\n#     val_true_labels = []\n#     val_predicted_labels = []\n    \n#     with torch.no_grad():\n#         for images, labels in val_loader:\n#             images, labels = images.to(device), labels.to(device)\n            \n#             outputs = model(images)\n#             loss = criterion(outputs, labels)\n#             val_running_loss += loss.item()\n            \n#             val_true_labels.extend(labels.cpu().numpy())\n#             _, predicted = torch.max(outputs, 1)\n#             val_predicted_labels.extend(predicted.cpu().numpy())\n    \n#     val_accuracy = accuracy_score(val_true_labels, val_predicted_labels)\n#     val_precision = precision_score(val_true_labels, val_predicted_labels, average='macro', zero_division=1)\n#     val_recall = recall_score(val_true_labels, val_predicted_labels, average='macro', zero_division=1)\n#     val_f1 = f1_score(val_true_labels, val_predicted_labels, average='macro', zero_division=1)\n    \n#     val_outputs_prob = torch.tensor(val_predicted_labels)\n#     val_auc = roc_auc_score(val_true_labels, val_outputs_prob, average='macro', multi_class='ovr')\n\n#     val_losses.append(val_running_loss / len(val_loader))\n#     val_accuracies.append(val_accuracy)\n#     val_f1_scores.append(val_f1)\n    \n#     print(f\"Validation Loss: {val_running_loss/len(val_loader)}\")\n#     print(f\"Validation Accuracy: {val_accuracy:.4f}, Precision: {val_precision:.4f}, Recall: {val_recall:.4f}, F1: {val_f1:.4f}, AUC: {val_auc:.4f}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-20T14:33:41.882708Z","iopub.execute_input":"2025-01-20T14:33:41.882952Z","iopub.status.idle":"2025-01-20T14:33:41.886748Z","shell.execute_reply.started":"2025-01-20T14:33:41.882932Z","shell.execute_reply":"2025-01-20T14:33:41.886018Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score\n\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nnum_epochs = 50\n\ntrain_losses = []\nval_losses = []\ntrain_accuracies = []\nval_accuracies = []\ntrain_f1_scores = []\nval_f1_scores = []\ntrain_auc_scores = []\nval_auc_scores = []\n\nfor epoch in range(num_epochs):\n    model.train()\n    running_loss = 0.0\n    true_labels = []\n    predicted_labels = []\n    predicted_probs = []\n\n    for images, labels in train_loader:\n        images, labels = images.to(device), labels.to(device)\n\n        optimizer.zero_grad()\n        outputs = model(images)\n\n        logits = outputs.logits if hasattr(outputs, 'logits') else outputs\n\n        loss = criterion(logits, labels)\n        loss.backward()\n        optimizer.step()\n\n        running_loss += loss.item()\n\n        true_labels.extend(labels.cpu().numpy())\n        _, predicted = torch.max(logits, 1)\n        predicted_labels.extend(predicted.cpu().numpy())\n\n        predicted_probs.extend(torch.softmax(logits, dim=1)[:, 1].detach().cpu().numpy())\n\n    accuracy = accuracy_score(true_labels, predicted_labels)\n    precision = precision_score(true_labels, predicted_labels, average='binary', zero_division=1)\n    recall = recall_score(true_labels, predicted_labels, average='binary', zero_division=1)\n    f1 = f1_score(true_labels, predicted_labels, average='binary', zero_division=1)\n    auc = roc_auc_score(true_labels, predicted_probs)\n\n    print(f\"Epoch {epoch+1}, Loss: {running_loss/len(train_loader):.4f}\")\n    print(f\"Train Accuracy: {accuracy:.4f}, Precision: {precision:.4f}, Recall: {recall:.4f}, F1: {f1:.4f}, AUC: {auc:.4f}\")\n\n    train_losses.append(running_loss / len(train_loader))\n    train_accuracies.append(accuracy)\n    train_f1_scores.append(f1)\n    train_auc_scores.append(auc)\n\n    model.eval()\n    val_running_loss = 0.0\n    val_true_labels = []\n    val_predicted_labels = []\n    val_predicted_probs = []\n\n    with torch.no_grad():\n        for images, labels in val_loader:\n            images, labels = images.to(device), labels.to(device)\n\n            outputs = model(images)\n            logits = outputs.logits if hasattr(outputs, 'logits') else outputs\n\n            loss = criterion(logits, labels)\n            val_running_loss += loss.item()\n\n            val_true_labels.extend(labels.cpu().numpy())\n            _, predicted = torch.max(logits, 1)\n            val_predicted_labels.extend(predicted.cpu().numpy())\n\n            val_predicted_probs.extend(torch.softmax(logits, dim=1)[:, 1].detach().cpu().numpy())\n\n    val_accuracy = accuracy_score(val_true_labels, val_predicted_labels)\n    val_precision = precision_score(val_true_labels, val_predicted_labels, average='binary', zero_division=1)\n    val_recall = recall_score(val_true_labels, val_predicted_labels, average='binary', zero_division=1)\n    val_f1 = f1_score(val_true_labels, val_predicted_labels, average='binary', zero_division=1)\n    val_auc = roc_auc_score(val_true_labels, val_predicted_probs)\n\n    print(f\"Validation Loss: {val_running_loss/len(val_loader):.4f}\")\n    print(f\"Validation Accuracy: {val_accuracy:.4f}, Precision: {val_precision:.4f}, Recall: {val_recall:.4f}, F1: {val_f1:.4f}, AUC: {val_auc:.4f}\")\n\n    val_losses.append(val_running_loss / len(val_loader))\n    val_accuracies.append(val_accuracy)\n    val_f1_scores.append(val_f1)\n    val_auc_scores.append(val_auc)\n\nprint(\"Training complete.\")\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"epochs = range(1, num_epochs + 1)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# label_mapping = {label: idx for idx, label in enumerate(train_dataset.annotations['label'].unique())}\n# reverse_label_mapping = {idx: label for label, idx in label_mapping.items()}\n\n# model.eval()\n# predictions = []\n\n# with torch.no_grad():\n#     for images, filenames in test_loader:\n#         images = images.to(device)\n#         outputs = model(images)\n#         _, predicted = torch.max(outputs, 1)\n        \n#         for filename, label in zip(filenames, predicted.cpu().numpy()):\n#             predictions.append({'image': filename, 'label': label})  # استفاده از label به صورت عددی\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.eval()\npredictions = []\n\nwith torch.no_grad():\n    for images, filenames in test_loader:\n        images = images.to(device)\n        outputs = model(images)\n        logits = outputs.logits if hasattr(outputs, 'logits') else outputs\n        _, predicted = torch.max(logits, 1)\n\n        for filename, label in zip(filenames, predicted.cpu().numpy()):\n            predictions.append({'image': filename, 'label': int(label)})","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"output_df = pd.DataFrame(predictions)\noutput_df.to_csv('submission.csv', index=False)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"cm = confusion_matrix(true_labels, predicted_labels)\nplt.figure(figsize=(10, 7))\nplt.imshow(cm, cmap='Blues')\nplt.colorbar()\nplt.title('Confusion Matrix')\nplt.xlabel('Predicted Labels')\nplt.ylabel('True Labels')\nplt.show()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"cm","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(12, 6))\nplt.subplot(1, 2, 1)\nplt.plot(epochs, train_losses, label='Train Loss')\nplt.plot(epochs, val_losses, label='Validation Loss')\nplt.xlabel('Epochs')\nplt.ylabel('Loss')\nplt.legend()\nplt.title('Loss per Epoch')\n\nplt.subplot(1, 2, 2)\nplt.plot(epochs, train_accuracies, label='Train Accuracy')\nplt.plot(epochs, val_accuracies, label='Validation Accuracy')\nplt.xlabel('Epochs')\nplt.ylabel('Accuracy')\nplt.legend()\nplt.title('Accuracy per Epoch')\n\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(6, 6))\nplt.plot(epochs, train_f1_scores, label='Train F1')\nplt.plot(epochs, val_f1_scores, label='Validation F1')\nplt.xlabel('Epochs')\nplt.ylabel('F1 Score')\nplt.legend()\nplt.title('F1 Score per Epoch')\nplt.show()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nimport matplotlib.pyplot as plt\nfrom torchvision.transforms import ToPILImage\n\ndata_iter = iter(train_loader)\nimages, labels = next(data_iter)\n\nto_pil = ToPILImage()\nimage = to_pil(images[3])\nimage_ = images[3].numpy().transpose((1, 2, 0))\nmean = [0.485, 0.456, 0.406]\nstd = [0.229, 0.224, 0.225]\nimage_ = std * image_ + mean\nimage_ = image_.clip(0, 1)\nplt.imshow(image_)\nplt.title(f\"Label: {labels[0].item()}\")\nplt.axis('off')\nplt.show()\n\ninputs = feature_extractor(images=image, return_tensors=\"pt\", do_rescale=False)\ninputs = {k: v.to(device) for k, v in inputs.items()}\n\nmodel.config.output_attentions = True\nwith torch.no_grad():\n    outputs = model(**inputs)\n    attentions = outputs.attentions\n\ndef visualize_attention(image, attentions, layer_idx=-1, head_idx=0):\n    attention_map = attentions[layer_idx][0, head_idx].cpu().numpy()\n\n    if attention_map.ndim == 1:\n        side_len = int(len(attention_map) ** 0.5)\n        attention_map = attention_map.reshape(side_len, side_len)\n\n    attention_map = torch.tensor(attention_map).unsqueeze(0).unsqueeze(0)\n\n    attention_map = torch.nn.functional.interpolate(\n        attention_map,\n        size=(image.size[1], image.size[0]),\n        mode=\"bilinear\",\n        align_corners=False\n    ).squeeze().numpy()\n\n    attention_map = (attention_map - attention_map.min()) / (attention_map.max() - attention_map.min())\n\n    plt.figure(figsize=(10, 10))\n    plt.subplot(1, 2, 1)\n    plt.imshow(image)\n    plt.axis(\"off\")\n    plt.title(\"Original Image\")\n    plt.subplot(1, 2, 2)\n    plt.imshow(image, alpha=0.6)\n    plt.imshow(attention_map, cmap=\"jet\", alpha=0.4)\n    plt.axis(\"off\")\n    plt.title(f\"Attention Map (Layer {layer_idx}, Head {head_idx})\")\n    plt.show()\n\nvisualize_attention(image, attentions, layer_idx=-1, head_idx=12)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-06T19:14:41.938621Z","iopub.execute_input":"2025-01-06T19:14:41.93891Z","iopub.status.idle":"2025-01-06T19:14:42.536168Z","shell.execute_reply.started":"2025-01-06T19:14:41.938882Z","shell.execute_reply":"2025-01-06T19:14:42.535161Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}