{"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":29193,"databundleVersionId":2318453,"sourceType":"competition"}],"dockerImageVersionId":30918,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport torch\nimport torch.nn as nn\nfrom torch.utils.data import Dataset, DataLoader\nimport pandas as pd\nfrom PIL import Image\nfrom torchvision import transforms\nfrom sklearn.preprocessing import LabelEncoder\nimport torchvision\nfrom torch.utils.data import random_split\nimport torch.optim as optim","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-03-04T04:22:14.004261Z","iopub.execute_input":"2025-03-04T04:22:14.004538Z","iopub.status.idle":"2025-03-04T04:22:14.008800Z","shell.execute_reply.started":"2025-03-04T04:22:14.004516Z","shell.execute_reply":"2025-03-04T04:22:14.007836Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"data = pd.read_csv('/kaggle/input/classify-leaves/train.csv')\n\n\nlabel_encoder = LabelEncoder()\ndata['label'] = label_encoder.fit_transform(data['label'])\n\n\ntransforms_train = torchvision.transforms.Compose([\n    transforms.RandomHorizontalFlip(p=0.5),\n    transforms.RandomVerticalFlip(p=0.5),\n    transforms.ColorJitter(brightness=0.5, contrast=0.5, saturation=0.5, hue=0.5),\n    transforms.RandomResizedCrop(size=(224, 224), scale=(0.5, 1),ratio=(3/4, 4/3)),\n    transforms.ToTensor()\n])\ntransforms_test = torchvision.transforms.Compose([\n    transforms.Resize((224, 224)),\n    transforms.ToTensor()\n])\n\n\nclass CustomDataset(Dataset):\n    def __init__(self, data, transform=None):\n        self.data = data\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.data)\n\n    def __getitem__(self, idx):\n        image_path = self.data.iloc[idx, 0]\n        label = self.data.iloc[idx, 1]\n        image = Image.open(os.path.join(\"/kaggle/input/classify-leaves\", image_path))\n        if self.transform:\n            image = self.transform(image)\n        return image, torch.tensor(label, dtype=torch.long)\n\n# 创建自定义数据集\ndataset = CustomDataset(data, transform=None)\n\ntrain_size = int(0.8 * len(dataset))\ntest_size = len(dataset) - train_size\n# train_dataset, test_dataset = torch.utils.data.random_split(dataset, [train_size, test_size])\n\ntrain_dataset, test_dataset = random_split(dataset, [train_size, test_size], generator=torch.Generator().manual_seed(38))\n\n#  对训练集应用数据增强的transform\ntrain_dataset.dataset.transform = transforms_train\n\n#  对测试集应用测试的transform\ntest_dataset.dataset.transform = transforms_test\n\ntrain_iter = DataLoader(train_dataset, batch_size=64, shuffle=True)\ntest_iter = DataLoader(test_dataset, batch_size=64, shuffle=False)\nfor X,y in train_iter:\n    print(X.shape, y.shape)\n    print(X.dtype, y.dtype)\n    print(y)\n    break","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T04:10:21.604638Z","iopub.execute_input":"2025-03-04T04:10:21.604949Z","iopub.status.idle":"2025-03-04T04:10:22.382975Z","shell.execute_reply.started":"2025-03-04T04:10:21.604925Z","shell.execute_reply":"2025-03-04T04:10:22.382232Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def train(net,train_loader,valid_loader,num_epochs,lr,device):\n    epoch = num_epochs\n    losses = []\n    optimizer = optim.SGD(net.parameters(), lr, weight_decay=1e-3)\n    loss = nn.CrossEntropyLoss(reduction='mean')\n    for i in range(epoch):\n        acc = 0\n        loss_sum = 0\n        for x, y in train_loader:\n            net = net.to(device)\n            x = torch.as_tensor(x, dtype=torch.float)\n            x = x.to(device)\n            y = y.to(device)\n            y_hat = net(x)\n            loss_temp = loss(y_hat, y)\n            loss_sum += loss_temp\n            optimizer.zero_grad()\n            loss_temp.backward()\n            optimizer.step()\n            acc += torch.sum(y_hat.argmax(dim=1).type(y.dtype) == y)\n        losses.append(loss_sum.cpu().detach().numpy() / len(train_loader))\n        print( \"epoch: \", i, \"loss=\", loss_sum.item(), \"训练集准确度=\",(acc/(len(train_loader)*train_loader.batch_size)).item(),end=\"\")\n        test_acc = 0\n        for x, y in valid_loader:\n            x = x.to(device)\n            x = torch.as_tensor(x, dtype=torch.float)\n            y = y.to(device)\n            y_hat = net(x)\n            test_acc += torch.sum(y_hat.argmax(dim=1).type(y.dtype) == y)\n        print(\"验证集准确度\", (test_acc / (len(valid_loader)*valid_loader.batch_size)).item())\n       ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T04:29:05.093728Z","iopub.execute_input":"2025-03-04T04:29:05.094111Z","iopub.status.idle":"2025-03-04T04:29:05.101623Z","shell.execute_reply.started":"2025-03-04T04:29:05.094050Z","shell.execute_reply":"2025-03-04T04:29:05.100832Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"lr, num_epochs = 0.01, 20\nnet = torchvision.models.resnet50(weights = torchvision.models.ResNet50_Weights.IMAGENET1K_V1)\nin_features = net.fc.in_features\nnet.fc = nn.Linear(in_features, 176)\ntrain(net, train_iter, test_iter, num_epochs, lr, device = torch.device(\"cuda:0\"))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T04:29:11.186447Z","iopub.execute_input":"2025-03-04T04:29:11.186734Z","iopub.status.idle":"2025-03-04T04:56:24.836016Z","shell.execute_reply.started":"2025-03-04T04:29:11.186705Z","shell.execute_reply":"2025-03-04T04:56:24.835120Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test = pd.read_csv('/kaggle/input/classify-leaves/test.csv')\nclass testDataset(Dataset):\n    def __init__(self, data, transform=None):\n        self.data = data\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.data)\n\n    def __getitem__(self, idx):\n        image_path = self.data.iloc[idx, 0]\n        image = Image.open(os.path.join(\"/kaggle/input/classify-leaves\", image_path))\n        if self.transform:\n            image = self.transform(image)\n        return image\n\n# 创建自定义数据集\ntest_dataset = testDataset(test, transform=transforms_test)\ntest_iter = DataLoader(test_dataset, batch_size=64, shuffle=False)\n\ndevice = torch.device(\"cuda:0\")\npredict = torch.tensor([]).to(device)\n\nwith torch.no_grad():\n    for x in test_iter:\n        net = net.to(device)\n        x = x.to(device)\n        x = torch.as_tensor(x, dtype=torch.float)\n        y_hat = net(x)\n        predict = torch.cat((y_hat, predict), dim=0)\n    predict = torch.argmax(predict, dim=1).reshape(-1)\npredict_cpu = predict.cpu().numpy()\nresult = pd.read_csv(\"/kaggle/input/classify-leaves/test.csv\")\nresult[\"label\"] = pd.Series(predict_cpu)\nresult[\"label\"] = label_encoder.inverse_transform(result[\"label\"])\nresult.to_csv(\"result.csv\", index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T05:01:15.757746Z","iopub.execute_input":"2025-03-04T05:01:15.758085Z","iopub.status.idle":"2025-03-04T05:02:50.888786Z","shell.execute_reply.started":"2025-03-04T05:01:15.758042Z","shell.execute_reply":"2025-03-04T05:02:50.887840Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(result)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T05:05:01.359432Z","iopub.execute_input":"2025-03-04T05:05:01.359755Z","iopub.status.idle":"2025-03-04T05:05:01.373128Z","shell.execute_reply.started":"2025-03-04T05:05:01.359732Z","shell.execute_reply":"2025-03-04T05:05:01.372244Z"}},"outputs":[],"execution_count":null}]}