{"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":"gpu","dataSources":[{"sourceId":112509,"databundleVersionId":14254895,"sourceType":"competition"},{"sourceId":13930580,"sourceType":"datasetVersion","datasetId":8877373}],"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# ","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport torch\nimport numpy as np\nimport torch.nn as nn\nfrom torch.utils.data import Dataset,DataLoader\nfrom torchvision import transforms\nfrom os import path\nfrom PIL import Image\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import r2_score,mean_absolute_error\n#from torchvision.models import resnet18, ResNet18_Weights\nfrom torchvision.transforms.functional import adjust_sharpness\nimport timm\nimport matplotlib.pyplot as plt\n#import sys\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-30T11:36:40.139147Z","iopub.execute_input":"2025-11-30T11:36:40.139451Z","iopub.status.idle":"2025-11-30T11:36:45.622340Z","shell.execute_reply.started":"2025-11-30T11:36:40.139429Z","shell.execute_reply":"2025-11-30T11:36:45.621605Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nmodel = timm.create_model('vit_base_patch14_dinov2.lvd142m', pretrained=False)\nstate_dict = torch.load('/kaggle/input/my-dinov2/pytorch_model.bin')\nmodel.load_state_dict(state_dict, strict=False)\nmodel.eval()\nmodel.to(device)\nprint()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-30T11:57:37.655429Z","iopub.execute_input":"2025-11-30T11:57:37.656042Z","iopub.status.idle":"2025-11-30T11:57:39.303090Z","shell.execute_reply.started":"2025-11-30T11:57:37.656018Z","shell.execute_reply":"2025-11-30T11:57:39.302373Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"data = pd.read_csv(\"/kaggle/input/csiro-biomass/train.csv\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-30T11:36:47.459567Z","iopub.execute_input":"2025-11-30T11:36:47.459759Z","iopub.status.idle":"2025-11-30T11:36:47.689710Z","shell.execute_reply.started":"2025-11-30T11:36:47.459742Z","shell.execute_reply":"2025-11-30T11:36:47.689085Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"target_names = data.target_name.unique()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-30T11:36:47.690472Z","iopub.execute_input":"2025-11-30T11:36:47.690735Z","iopub.status.idle":"2025-11-30T11:36:47.695249Z","shell.execute_reply.started":"2025-11-30T11:36:47.690716Z","shell.execute_reply":"2025-11-30T11:36:47.694453Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"preprocess = transforms.Compose([\n    transforms.Resize(518),\n    transforms.CenterCrop(518),\n    transforms.ToTensor(),\n    #transforms.Lambda(lambda x: adjust_sharpness(x, 2.0)),\n    \n])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-30T11:57:40.895907Z","iopub.execute_input":"2025-11-30T11:57:40.896608Z","iopub.status.idle":"2025-11-30T11:57:40.900087Z","shell.execute_reply.started":"2025-11-30T11:57:40.896584Z","shell.execute_reply":"2025-11-30T11:57:40.899406Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def get_embedding(img_path):\n    img = Image.open(img_path).convert(\"RGB\")\n    x = preprocess(img).unsqueeze(0).to(device)\n    with torch.no_grad():\n        feat = model(x)\n    return feat.squeeze(0)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-30T11:57:41.240428Z","iopub.execute_input":"2025-11-30T11:57:41.240890Z","iopub.status.idle":"2025-11-30T11:57:41.244868Z","shell.execute_reply.started":"2025-11-30T11:57:41.240867Z","shell.execute_reply":"2025-11-30T11:57:41.244062Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class BiomassDataset(Dataset):\n    def __init__(self,data,target_name):\n        np.random.seed(42)\n        torch.manual_seed(42)\n        self.data = data[data.target_name == target_name].reset_index(drop=True)\n    def __len__(self):\n        return len(self.data)\n    def __getitem__(self,idx):\n        row = self.data.iloc[idx]\n        image_path = path.join(\"/kaggle\",\"input\",\"csiro-biomass\",row.image_path)\n        img = get_embedding(image_path)\n        return img,row.target","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-30T11:36:47.978634Z","iopub.execute_input":"2025-11-30T11:36:47.978847Z","iopub.status.idle":"2025-11-30T11:36:47.983937Z","shell.execute_reply.started":"2025-11-30T11:36:47.978831Z","shell.execute_reply":"2025-11-30T11:36:47.983111Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class NeuralNet(nn.Module):\n    def __init__(self,sizes):\n        super(NeuralNet, self).__init__()\n        linear_layers = [nn.Linear(in_features=sizes[i],out_features=sizes[i+1])\n                         for i in range(len(sizes)-1)]\n        relues = [nn.ReLU() for _ in range(len(sizes) - 2)]\n        layers = []\n        for i in range(len(linear_layers)):\n            layers.append(linear_layers[i])\n            if i < len(relues):\n                layers.append(relues[i])\n        \n        self.net = nn.Sequential(*layers)\n        \n        \n    def forward(self, x):\n        x = self.net(x)\n        return x","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-30T11:36:47.984670Z","iopub.execute_input":"2025-11-30T11:36:47.984957Z","iopub.status.idle":"2025-11-30T11:36:47.998649Z","shell.execute_reply.started":"2025-11-30T11:36:47.984940Z","shell.execute_reply":"2025-11-30T11:36:47.997847Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"datasets = {name : BiomassDataset(data,name) for name in target_names}\nloaders = {name:DataLoader(dataset,shuffle=True,batch_size=128) \n                 for (name,dataset) in datasets.items()}\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-30T11:37:02.177445Z","iopub.execute_input":"2025-11-30T11:37:02.178005Z","iopub.status.idle":"2025-11-30T11:37:02.190536Z","shell.execute_reply.started":"2025-11-30T11:37:02.177979Z","shell.execute_reply":"2025-11-30T11:37:02.189845Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"models = {name : NeuralNet([768,256,1]) for name in target_names}\n#models[\"Dry_Clover_g\"] = NeuralNet([768,256,128,64,1])\n#models[\"Dry_Dead_g\"] = NeuralNet([768,16,1])\n#models[\"GDM_g\"] = NeuralNet([768,10,1])\n\nfor n in models.values():\n    n.to(device)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-30T11:37:04.891491Z","iopub.execute_input":"2025-11-30T11:37:04.892070Z","iopub.status.idle":"2025-11-30T11:37:04.909643Z","shell.execute_reply.started":"2025-11-30T11:37:04.892045Z","shell.execute_reply":"2025-11-30T11:37:04.909043Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"np.random.seed(42)\ntorch.manual_seed(42)\nfor name in target_names:\n    criterion = nn.MSELoss()\n    optimizer = torch.optim.Adam(models[name].parameters(), lr=0.01)\n    num_epochs = 5\n    \n    for epoch in range(num_epochs):\n        models[name].train()\n    \n        for i, (images, labels) in enumerate(loaders[name]):\n            images = images.to(device)\n            labels = labels.to(device)\n            outputs = models[name](images)\n            loss = criterion(outputs, labels.unsqueeze(1).to(torch.float32))\n    \n            optimizer.zero_grad()\n            loss.backward()\n            optimizer.step()\n            print('\\r' +name+\" \" + str(loss.item()), end='')\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-30T11:37:14.888001Z","iopub.execute_input":"2025-11-30T11:37:14.888830Z","iopub.status.idle":"2025-11-30T11:47:22.960553Z","shell.execute_reply.started":"2025-11-30T11:37:14.888803Z","shell.execute_reply":"2025-11-30T11:47:22.959801Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test = pd.read_csv(\"/kaggle/input/csiro-biomass/test.csv\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-30T11:47:22.962715Z","iopub.execute_input":"2025-11-30T11:47:22.963262Z","iopub.status.idle":"2025-11-30T11:47:22.968482Z","shell.execute_reply.started":"2025-11-30T11:47:22.963217Z","shell.execute_reply":"2025-11-30T11:47:22.967911Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-30T11:47:22.969274Z","iopub.execute_input":"2025-11-30T11:47:22.969515Z","iopub.status.idle":"2025-11-30T11:47:22.984928Z","shell.execute_reply.started":"2025-11-30T11:47:22.969495Z","shell.execute_reply":"2025-11-30T11:47:22.984199Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class BiomassDatasetTest(Dataset):\n    def __init__(self,data,target_name):\n        np.random.seed(42)\n        torch.manual_seed(42)\n        self.data = data[data.target_name == target_name].reset_index(drop=True)\n    def __len__(self):\n        return len(self.data)\n    def __getitem__(self,idx):\n        row = self.data.iloc[idx]\n        image_path = path.join(\"/kaggle\",\"input\",\"csiro-biomass\",row.image_path)\n        img = get_embedding(image_path)\n        return row.sample_id,img","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-30T11:51:35.550949Z","iopub.execute_input":"2025-11-30T11:51:35.551259Z","iopub.status.idle":"2025-11-30T11:51:35.556425Z","shell.execute_reply.started":"2025-11-30T11:51:35.551212Z","shell.execute_reply":"2025-11-30T11:51:35.555643Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_ds ={name :  BiomassDatasetTest(test,name) for name in target_names}\ntest_loaders = {name : DataLoader(ds) for name,ds in test_ds.items()}","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-30T11:51:35.860823Z","iopub.execute_input":"2025-11-30T11:51:35.861614Z","iopub.status.idle":"2025-11-30T11:51:35.870649Z","shell.execute_reply.started":"2025-11-30T11:51:35.861587Z","shell.execute_reply":"2025-11-30T11:51:35.869962Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-30T11:53:48.028388Z","iopub.execute_input":"2025-11-30T11:53:48.028923Z","iopub.status.idle":"2025-11-30T11:53:48.032961Z","shell.execute_reply.started":"2025-11-30T11:53:48.028899Z","shell.execute_reply":"2025-11-30T11:53:48.032085Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"preds = []\nfor name in target_names:\n    with torch.no_grad():\n        for i,data in test_loaders[name]:\n            data = data.to(device)\n            preds.append((i[0], models[name](data).item()))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-30T11:59:43.792841Z","iopub.execute_input":"2025-11-30T11:59:43.793349Z","iopub.status.idle":"2025-11-30T11:59:44.419530Z","shell.execute_reply.started":"2025-11-30T11:59:43.793297Z","shell.execute_reply":"2025-11-30T11:59:44.418928Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"res=pd.DataFrame(preds,columns=[\"sample_id\",\"target\"])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-30T12:00:26.431644Z","iopub.execute_input":"2025-11-30T12:00:26.432314Z","iopub.status.idle":"2025-11-30T12:00:26.435953Z","shell.execute_reply.started":"2025-11-30T12:00:26.432292Z","shell.execute_reply":"2025-11-30T12:00:26.435207Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"res.to_csv(\"submission.csv\",index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-30T12:00:40.867212Z","iopub.execute_input":"2025-11-30T12:00:40.867509Z","iopub.status.idle":"2025-11-30T12:00:40.876009Z","shell.execute_reply.started":"2025-11-30T12:00:40.867490Z","shell.execute_reply":"2025-11-30T12:00:40.875276Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}