{"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"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":112509,"databundleVersionId":14254895,"isSourceIdPinned":false,"sourceType":"competition"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Height_Ave_cm Pytorch Lightning CNN Regressor","metadata":{"papermill":{"duration":0.003895,"end_time":"2023-06-30T09:39:19.33539","exception":false,"start_time":"2023-06-30T09:39:19.331495","status":"completed"},"tags":[]}},{"cell_type":"code","source":"!pip install lightning","metadata":{"papermill":{"duration":0.003048,"end_time":"2023-06-30T09:39:19.341832","exception":false,"start_time":"2023-06-30T09:39:19.338784","status":"completed"},"tags":[],"trusted":true,"_kg_hide-output":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport random\nimport numpy as np\nimport pandas as pd\nfrom tqdm import tqdm\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torch.utils.data import random_split\nfrom torch.utils.data import DataLoader, Dataset, Subset\nfrom torch.utils.data import random_split, SubsetRandomSampler\nfrom torchvision import datasets, transforms, models \nfrom torchvision.datasets import ImageFolder\nfrom torchvision.transforms import ToTensor\nfrom torchvision.utils import make_grid\n\nfrom lightning.pytorch import LightningDataModule\nfrom lightning.pytorch import LightningModule\nfrom lightning.pytorch import Trainer\nimport lightning.pytorch as L\nprint(L.__version__)\n\nimport matplotlib.pyplot as plt\n%matplotlib inline\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import classification_report\nfrom PIL import Image","metadata":{"papermill":{"duration":13.262195,"end_time":"2023-06-30T09:39:32.607264","exception":false,"start_time":"2023-06-30T09:39:19.345069","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-18T11:09:47.353106Z","iopub.execute_input":"2023-10-18T11:09:47.353506Z","iopub.status.idle":"2023-10-18T11:09:47.362615Z","shell.execute_reply.started":"2023-10-18T11:09:47.353477Z","shell.execute_reply":"2023-10-18T11:09:47.361797Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"transform = transforms.Compose([\n            transforms.Resize(224),             # resize shortest side to 224 pixels\n            transforms.CenterCrop(224),         # crop longest side to 224 pixels at center            \n            transforms.ToTensor(),\n            transforms.Normalize([0.485, 0.456, 0.406],\n                                 [0.229, 0.224, 0.225])\n        ])","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train=pd.read_csv('/kaggle/input/csiro-biomass/train.csv')\nfilenames=train['image_path'].apply(lambda x:x.split('/')[-1])\nheight_values=train['Height_Ave_cm']\nndvi_values=train['Pre_GSHH_NDVI']\nheight_mapping=dict(zip(filenames,height_values))\nndvi_mapping=dict(zip(filenames,ndvi_values))","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(height_mapping)","metadata":{"trusted":true,"_kg_hide-output":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dir0='/kaggle/input/csiro-biomass/train'\npath_label=[]\nfor dirname, _, filenames in os.walk(dir0):\n    for filename in filenames:\n        path=(os.path.join(dirname, filename))\n        height=height_mapping.get(filename,None)\n        path_label+=[(path,height)]\n        \n#path_label = random.sample(path_label,1000)\nprint(path_label[0:3])","metadata":{"papermill":{"duration":0.059662,"end_time":"2023-06-30T09:39:32.684499","exception":false,"start_time":"2023-06-30T09:39:32.624837","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-18T11:09:47.364033Z","iopub.execute_input":"2023-10-18T11:09:47.364934Z","iopub.status.idle":"2023-10-18T11:09:47.429669Z","shell.execute_reply.started":"2023-10-18T11:09:47.364897Z","shell.execute_reply":"2023-10-18T11:09:47.4288Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class CustomDataset(torch.utils.data.Dataset):\n    def __init__(self, path_label, transform=None):\n        self.path_label = path_label\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.path_label)\n\n    def __getitem__(self, idx):\n        path, label = self.path_label[idx]\n        img = Image.open(path).convert('RGB')\n\n        if self.transform is not None:\n            img = self.transform(img)\n\n        return img, label","metadata":{"papermill":{"duration":0.012446,"end_time":"2023-06-30T09:39:33.013124","exception":false,"start_time":"2023-06-30T09:39:33.000678","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-18T11:09:48.480989Z","iopub.execute_input":"2023-10-18T11:09:48.481875Z","iopub.status.idle":"2023-10-18T11:09:48.487516Z","shell.execute_reply.started":"2023-10-18T11:09:48.481848Z","shell.execute_reply":"2023-10-18T11:09:48.486717Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class DataModule(LightningDataModule):\n    def __init__(self, path_label=None, root_dir=None, batch_size=32):\n        super().__init__()\n        self.path_label = path_label\n        self.root_dir = root_dir\n        self.batch_size = batch_size\n        \n        # Define your transforms\n        self.transform = transforms.Compose([\n            transforms.Resize(224),             # resize shortest side to 224 pixels\n            transforms.CenterCrop(224),         # crop longest side to 224 pixels at center            \n            transforms.ToTensor(),\n            transforms.Normalize([0.485, 0.456, 0.406],\n                               [0.229, 0.224, 0.225])\n        ])\n        \n        # Initialize datasets\n        self.train_dataset = None\n        self.test_dataset = None\n\n    def setup(self, stage=None):\n        # Create dataset based on what's provided\n        if self.path_label is not None:\n            dataset = CustomDataset(self.path_label, self.transform)\n        elif self.root_dir is not None:\n            dataset = datasets.ImageFolder(root=self.root_dir, transform=self.transform)\n        else:\n            raise ValueError(\"Either path_label or root_dir must be provided\")\n        \n        dataset_size = len(dataset)\n        train_size = int(0.8 * dataset_size) \n        test_size = dataset_size - train_size\n\n        # Split dataset\n        self.train_dataset = Subset(dataset, range(train_size))\n        self.test_dataset = Subset(dataset, range(train_size, dataset_size))\n\n    def train_dataloader(self):\n        return DataLoader(self.train_dataset, batch_size=self.batch_size, shuffle=True)\n\n    def test_dataloader(self):\n        return DataLoader(self.test_dataset, batch_size=self.batch_size)\n\n    def predict_dataloader(self):\n        return DataLoader(self.test_dataset, batch_size=self.batch_size)\n\n    def __len__(self):\n        if self.train_dataset is not None:\n            return len(self.train_dataset)\n        elif self.test_dataset is not None:\n            return len(self.test_dataset)\n        else:\n            return 0\n","metadata":{"papermill":{"duration":0.012953,"end_time":"2023-06-30T09:39:33.049085","exception":false,"start_time":"2023-06-30T09:39:33.036132","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-18T11:09:48.505711Z","iopub.execute_input":"2023-10-18T11:09:48.506179Z","iopub.status.idle":"2023-10-18T11:09:48.521469Z","shell.execute_reply.started":"2023-10-18T11:09:48.506147Z","shell.execute_reply":"2023-10-18T11:09:48.520801Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## ConvolutionalRegressor","metadata":{}},{"cell_type":"code","source":"class ConvolutionalRegressor(LightningModule):\n    \n    def __init__(self):\n        super(ConvolutionalRegressor, self).__init__()\n        self.conv1 = nn.Conv2d(3, 6, 3, 1)\n        self.conv2 = nn.Conv2d(6, 16, 3, 1)\n        self.fc1 = nn.Linear(16 * 54 * 54, 120)\n        self.fc2 = nn.Linear(120, 84)\n        self.fc3 = nn.Linear(84, 20)\n        self.fc4 = nn.Linear(20, 1)  # Regression: output 1 value\n\n    def forward(self, X):\n        X = F.relu(self.conv1(X))\n        X = F.max_pool2d(X, 2, 2)\n        X = F.relu(self.conv2(X))\n        X = F.max_pool2d(X, 2, 2)\n        X = X.view(-1, 16 * 54 * 54)\n        X = F.relu(self.fc1(X))\n        X = F.relu(self.fc2(X))\n        X = F.relu(self.fc3(X))\n        X = self.fc4(X)  # Output a continuous value\n        return X.squeeze(1)  # Output shape: [batch_size]\n\n    def configure_optimizers(self):\n        return torch.optim.Adam(self.parameters(), lr=0.001)\n\n    def training_step(self, batch, batch_idx):\n        X, y = batch\n        y_hat = self(X)\n        loss = F.mse_loss(y_hat, y.float())\n        self.log(\"train_loss\", loss)\n        return loss\n\n    def validation_step(self, batch, batch_idx):\n        X, y = batch\n        y_hat = self(X)\n        loss = F.mse_loss(y_hat, y.float())\n        self.log(\"val_loss\", loss)\n\n    def test_step(self, batch, batch_idx):\n        X, y = batch\n        y_hat = self(X)\n        loss = F.mse_loss(y_hat, y.float())\n        self.log(\"test_loss\", loss)\n","metadata":{"papermill":{"duration":0.01833,"end_time":"2023-06-30T09:39:33.071843","exception":false,"start_time":"2023-06-30T09:39:33.053513","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-18T11:09:48.538279Z","iopub.execute_input":"2023-10-18T11:09:48.538727Z","iopub.status.idle":"2023-10-18T11:09:48.55037Z","shell.execute_reply.started":"2023-10-18T11:09:48.538704Z","shell.execute_reply":"2023-10-18T11:09:48.549482Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"if __name__ == '__main__':\n    datamodule = DataModule(path_label=path_label)\n    datamodule.setup()","metadata":{"execution":{"iopub.status.busy":"2023-10-18T11:09:48.55237Z","iopub.execute_input":"2023-10-18T11:09:48.552792Z","iopub.status.idle":"2023-10-18T11:09:48.565843Z","shell.execute_reply.started":"2023-10-18T11:09:48.552767Z","shell.execute_reply":"2023-10-18T11:09:48.565043Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"    model = ConvolutionalRegressor()\n    trainer = L.Trainer(max_epochs=1000)\n    trainer.fit(model, datamodule)","metadata":{"execution":{"iopub.status.busy":"2023-10-18T11:09:48.566938Z","iopub.execute_input":"2023-10-18T11:09:48.567333Z","iopub.status.idle":"2023-10-18T11:09:53.166799Z","shell.execute_reply.started":"2023-10-18T11:09:48.56731Z","shell.execute_reply":"2023-10-18T11:09:53.165895Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"    datamodule.setup(stage='test')\n    test_loader = datamodule.test_dataloader()\n    trainer.test(dataloaders=test_loader)","metadata":{"papermill":{"duration":959.542695,"end_time":"2023-06-30T09:55:32.61869","exception":false,"start_time":"2023-06-30T09:39:33.075995","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-18T11:09:53.168059Z","iopub.execute_input":"2023-10-18T11:09:53.168871Z","iopub.status.idle":"2023-10-18T11:09:53.384722Z","shell.execute_reply.started":"2023-10-18T11:09:53.168839Z","shell.execute_reply":"2023-10-18T11:09:53.384064Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for images, labels in datamodule.train_dataloader():\n    break\nim=make_grid(images,nrow=16)\n\nplt.figure(figsize=(12,12))\nplt.imshow(np.transpose(im.numpy(),(1,2,0)))\n\ninv_normalize=transforms.Normalize(mean=[-0.485/0.229,-0.456/0.224,-0.406/0.225],\n                                   std=[1/0.229,1/0.224,1/0.225])\nim=inv_normalize(im)\n\nplt.figure(figsize=(12,12))\nplt.imshow(np.transpose(im.numpy(),(1,2,0)))","metadata":{"papermill":{"duration":1.112338,"end_time":"2023-06-30T09:55:33.735591","exception":false,"start_time":"2023-06-30T09:55:32.623253","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-18T11:09:53.385691Z","iopub.execute_input":"2023-10-18T11:09:53.386138Z","iopub.status.idle":"2023-10-18T11:09:54.792648Z","shell.execute_reply.started":"2023-10-18T11:09:53.386114Z","shell.execute_reply":"2023-10-18T11:09:54.791852Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"device = torch.device(\"cpu\")   #\"cuda:0\"\n\nmodel.eval()\ny_true=[]\ny_pred=[]\nwith torch.no_grad():\n    for test_data in datamodule.test_dataloader():\n        test_images, test_labels = test_data[0].to(device), test_data[1].to(device)\n        pred = model(test_images)  ##########\n        for i in range(len(pred)):\n            y_true.append(test_labels[i].item())\n            y_pred.append(pred[i].item())","metadata":{"papermill":{"duration":5.368379,"end_time":"2023-06-30T09:55:39.113208","exception":false,"start_time":"2023-06-30T09:55:33.744829","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-18T11:09:54.794228Z","iopub.execute_input":"2023-10-18T11:09:54.795002Z","iopub.status.idle":"2023-10-18T11:09:54.973919Z","shell.execute_reply.started":"2023-10-18T11:09:54.794968Z","shell.execute_reply":"2023-10-18T11:09:54.973073Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"min(y_pred),max(y_pred)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nplt.figure(figsize=(6, 6))\nplt.scatter(y_true, y_pred, alpha=0.5, color='blue')\nplt.xlabel(\"True Values\")\nplt.ylabel(\"Predicted Values\")\nplt.title(\"Scatter Plot of True vs Predicted (Age)\")\nplt.grid(True)\nplt.show()","metadata":{"papermill":{"duration":0.008862,"end_time":"2023-06-30T09:55:39.131596","exception":false,"start_time":"2023-06-30T09:55:39.122734","status":"completed"},"tags":[]},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"papermill":{"duration":0.009079,"end_time":"2023-06-30T09:55:39.150422","exception":false,"start_time":"2023-06-30T09:55:39.141343","status":"completed"},"tags":[]},"outputs":[],"execution_count":null}]}