{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"\nimport numpy as np\nimport pandas as pd \nfrom pathlib import Path\nfrom typing import Any, Callable, List, Tuple\nimport json\nimport multiprocessing as mp\nfrom tqdm.auto import tqdm\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd\nfrom PIL import Image\nimport pytorch_lightning as pl\n\nfrom sklearn.model_selection import train_test_split\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torch.utils.data import Dataset, DataLoader\nfrom torchvision import io, models, transforms\nimport torchvision.transforms.functional as TF\n\n\ndevice = torch.device(\"cuda\") if torch.cuda.is_available() else torch.device(\"cpu\")\n\n%matplotlib inline\nprint(torch.__version__, pl.__version__)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ROOT_PATH = Path(\"/kaggle/input/cassava-leaf-disease-classification/\")\nIMAGE_SIZE = (128, 128)\nBATCH_SIZE = 32\nLR = 1e-3\nEPOCHS = 3\n\nlabels = {\n0:\"Cassava Bacterial Blight (CBB)\",\n1:\"Cassava Brown Streak Disease (CBSD)\",\n2:\"Cassava Green Mottle (CGM)\",\n3:\"Cassava Mosaic Disease (CMD)\",\n4:\"Healthy\",\n}","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.read_csv(ROOT_PATH / \"train.csv\")\ndf.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n\ntrain_df, valid_df = train_test_split(df, stratify=df[\"label\"].values)\n    \nplt.figure(figsize=(12, 5))\nprint(df[\"label\"].map(labels).value_counts())\ndf.sample(5)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"valid_df","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"class Data(Dataset):\n    def __init__(self, df: pd.DataFrame, transforms=None):\n        self.files = [ROOT_PATH / \"train_images\" / file for file in df[\"image_id\"].values]\n        self.y = df[\"label\"].values.tolist()\n        self.transforms = transforms\n        \n    def __len__(self):\n        return len(self.y)\n    \n    def __getitem__(self, i):\n        img = Image.open(self.files[i])\n        label = self.y[i]\n        if self.transforms is not None:\n            img = self.transforms(img)\n            \n        return img, label","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_tfms = transforms.Compose(\n    [\n        transforms.Resize(IMAGE_SIZE),\n        transforms.RandomHorizontalFlip(),\n        transforms.RandomRotation(10),\n        transforms.ToTensor(),\n        transforms.Normalize([0.4766, 0.4527, 0.3926], [0.2275, 0.2224, 0.2210])\n    ]\n)\n\nvalid_tfms = transforms.Compose(\n    [\n        transforms.Resize(IMAGE_SIZE),\n        transforms.ToTensor(),\n        transforms.Normalize([0.4766, 0.4527, 0.3926], [0.2275, 0.2224, 0.2210])\n    ]\n)\n\ntrain_ds = Data(train_df, train_tfms)\nvalid_ds = Data(valid_df, valid_tfms)\n\ntrain_dl = DataLoader(\n    train_ds,\n    BATCH_SIZE, \n    shuffle=True, \n    drop_last=True, \n    num_workers=4,\n    pin_memory=True,\n)\n\nvalid_dl = DataLoader(\n    valid_ds, \n    BATCH_SIZE*2, \n    shuffle=False, \n    drop_last=False, \n    num_workers=4,\n    pin_memory=True,\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x, y = next(iter(train_dl))\nx.shape, y.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"label_counts = train_df[\"label\"].value_counts().sort_index()\nclass_weights = max(label_counts) / label_counts.values\nlabel_counts, class_weights","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# ROOT_PATH = Path(\"/kaggle/input/cassava-leaf-disease-classification/\")\nIMAGE_SIZE = (128, 128)\nBATCH_SIZE = 32\nLR = 1e-3\nEPOCHS = 3\nimport torch\nimport torch.nn as nn\nimport torchvision.models as models\nimport pytorch_lightning as pl\nfrom torch.utils.data import DataLoader\n\nclass MyModel(pl.LightningModule):\n    def __init__(self, num_classes=5, learning_rate=0.001):\n        super().__init__()\n        self.learning_rate = learning_rate\n        self.num_classes = num_classes\n        \n        # Load the pre-trained ResNet-50 model\n        self.resnet = models.resnet50(pretrained=True)\n        \n        # Resize the input layer to match the image size and RGB channels\n        self.resnet.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3, bias=False)\n        \n        # Freeze the weights of the ResNet-50 model\n        for param in self.resnet.parameters():\n            param.requires_grad = False\n        \n        # Replace the fully connected layer with a new one for the given number of classes\n        self.fc = nn.Sequential(\n            nn.Dropout(0.5),\n            nn.Linear(self.resnet.fc.out_features, 256),\n            nn.ReLU(inplace=True),\n            nn.Dropout(0.5),\n            nn.Linear(256, 128),\n            nn.ReLU(inplace=True),\n            nn.Dropout(0.5),\n            nn.Linear(128, num_classes)\n        )\n        \n        # Loss function\n        self.criterion = nn.CrossEntropyLoss()\n    \n    def forward(self, x):\n        features = self.resnet(x)\n        features = torch.flatten(features, 1)  # Flatten the tensor\n        x = self.fc(features)\n        return x\n    \n    def configure_optimizers(self):\n        optimizer = torch.optim.Adam(self.parameters(), lr=self.learning_rate)\n        return optimizer\n    \n    def training_step(self, batch, batch_idx):\n        images, labels = batch\n        outputs = self(images)\n        loss = self.criterion(outputs, labels)\n        acc = (outputs.argmax(dim=1) == labels).float().mean()\n        self.log('train_loss', loss, on_epoch=True, prog_bar=True)\n        self.log('train_acc', acc, on_epoch=True, prog_bar=True)\n        return loss\n    \n    def validation_step(self, batch, batch_idx):\n        images, labels = batch\n        outputs = self(images)\n        loss = self.criterion(outputs, labels)\n        acc = (outputs.argmax(dim=1) == labels).float().mean()\n        self.log('val_loss', loss, on_epoch=True, prog_bar=True)\n        self.log('val_acc', acc, on_epoch=True, prog_bar=True)\n        return loss\n\n\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = MyModel()\n#model = model.to(device)\ntrainer = pl.Trainer(precision=16, max_epochs=10)\ntrainer.fit(model, train_dl, valid_dl)","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}