{"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":"import os\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\nimport torchvision.datasets \nimport torchvision.transforms as transforms\nimport pandas as pd\nfrom torch.utils.data import Dataset, DataLoader\nfrom PIL import Image","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-06-13T09:55:01.375384Z","iopub.execute_input":"2023-06-13T09:55:01.376071Z","iopub.status.idle":"2023-06-13T09:55:04.593480Z","shell.execute_reply.started":"2023-06-13T09:55:01.376039Z","shell.execute_reply":"2023-06-13T09:55:04.592532Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#标签和类别数进行对应\ntrain = pd.read_csv(\"/kaggle/input/classify-leaves/train.csv\")\nlabels = list(pd.read_csv(\"/kaggle/input/classify-leaves/train.csv\")['label'])\nlabels_unique = list(set(list(labels))) #list index--labels\nlabel_nums = []\nfor i in range(len(labels)):\n    label_nums.append(labels_unique.index(labels[i]))\ntrain['number'] = label_nums\ntrain.to_csv(\"./train_num_label.csv\", index = 0) #记录对应关系","metadata":{"execution":{"iopub.status.busy":"2023-06-13T09:55:04.595394Z","iopub.execute_input":"2023-06-13T09:55:04.595937Z","iopub.status.idle":"2023-06-13T09:55:04.772364Z","shell.execute_reply.started":"2023-06-13T09:55:04.595910Z","shell.execute_reply":"2023-06-13T09:55:04.771368Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Leaf_Train_Dataset(Dataset):\n    '''\n    树叶数据集的训练集 自定义Dataset\n    '''\n    def __init__(self, train_path, transform = None):\n        '''\n        train_path : 传入记录图像路径及其标号的csv文件\n        transform : 对图像进行的变换\n        '''\n        super().__init__()\n        self.train_csv = pd.read_csv(train_path)\n        self.image_path = list(self.train_csv['image']) #图像所在地址记录\n        self.label_nums = list(self.train_csv['number']) #图像的标号记录\n        self.transform = transform\n    def __getitem__(self, idx):\n        '''\n        idx : 所需要获取的图像的索引\n        return : image， label\n        '''\n        image = Image.open(os.path.join(\"/kaggle/input/classify-leaves\", self.image_path[idx]))\n        if(self.transform != None):\n            image = self.transform(image)\n        label = self.label_nums[idx]\n        return image, label\n    def __len__(self):\n        return len(self.image_path)\n\nclass Leaf_Test_Dataset(Dataset):\n    '''\n    树叶数据集的训练集 自定义Dataset\n    '''\n    def __init__(self, test_path, transform = None):\n        '''\n        train_path : 传入记录图像路径及其标号的csv文件\n        transform : 对图像进行的变换\n        '''\n        super().__init__()\n        self.test_csv = pd.read_csv(test_path)\n        self.image_path = list(self.test_csv['image']) #图像所在地址记录\n        self.transform = transform\n    def __getitem__(self, idx):\n        '''\n        idx : 所需要获取的图像的索引\n        return : image\n        '''\n        image = Image.open(os.path.join(\"/kaggle/input/classify-leaves\", self.image_path[idx]))\n        if(self.transform != None):\n            image = self.transform(image)\n        return image\n    def __len__(self):\n        return len(self.image_path)","metadata":{"execution":{"iopub.status.busy":"2023-06-13T09:55:04.773937Z","iopub.execute_input":"2023-06-13T09:55:04.774276Z","iopub.status.idle":"2023-06-13T09:55:04.788957Z","shell.execute_reply.started":"2023-06-13T09:55:04.774244Z","shell.execute_reply":"2023-06-13T09:55:04.787872Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#data agumentation\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])","metadata":{"execution":{"iopub.status.busy":"2023-06-13T09:55:04.793135Z","iopub.execute_input":"2023-06-13T09:55:04.793441Z","iopub.status.idle":"2023-06-13T09:55:04.801187Z","shell.execute_reply.started":"2023-06-13T09:55:04.793416Z","shell.execute_reply":"2023-06-13T09:55:04.800135Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def train(train_loader, valid_loader, device = torch.device(\"cuda:0\")):\n    net = torchvision.models.resnet50(weights = torchvision.models.ResNet50_Weights.IMAGENET1K_V1)\n    in_features = net.fc.in_features\n    net.fc = nn.Linear(in_features, 176)\n    epoch = 5\n    losses = []\n    optimizer = optim.SGD(net.parameters(), lr=0.01, 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\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    torch.save(net.state_dict(), 'resnet50')\n    return net","metadata":{"execution":{"iopub.status.busy":"2023-06-13T10:02:26.861925Z","iopub.execute_input":"2023-06-13T10:02:26.862280Z","iopub.status.idle":"2023-06-13T10:02:26.874231Z","shell.execute_reply.started":"2023-06-13T10:02:26.862250Z","shell.execute_reply":"2023-06-13T10:02:26.873278Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"trainset = Leaf_Train_Dataset(\"/kaggle/working/train_num_label.csv\", transform = transforms_train)\ntestset = Leaf_Test_Dataset(\"/kaggle/input/classify-leaves/test.csv\", transform = transforms_test)\ntrain_loader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True, drop_last=False)\ntest_loader = torch.utils.data.DataLoader(testset, batch_size=64, shuffle=False, drop_last=False)\nnet = train(train_loader, test_loader)","metadata":{"execution":{"iopub.status.busy":"2023-06-13T10:02:29.161404Z","iopub.execute_input":"2023-06-13T10:02:29.161805Z","iopub.status.idle":"2023-06-13T10:14:29.190824Z","shell.execute_reply.started":"2023-06-13T10:02:29.161776Z","shell.execute_reply":"2023-06-13T10:14:29.189788Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = torch.device(\"cuda:0\")\npredict = torch.tensor([]).to(device)\nwith torch.no_grad():\n    for x in test_loader:\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_label = []\nfor i in range(predict.shape[0]):\n    predict_label.append(labels_unique[predict[i]])\n\nsubmission = pd.read_csv(\"/kaggle/input/classify-leaves/test.csv\")\nsubmission[\"label\"] = pd.Series(predict_label)\nsubmission.to_csv(\"result.csv\", index=False)","metadata":{"execution":{"iopub.status.busy":"2023-06-13T10:38:51.167745Z","iopub.execute_input":"2023-06-13T10:38:51.168100Z","iopub.status.idle":"2023-06-13T10:40:23.060000Z","shell.execute_reply.started":"2023-06-13T10:38:51.168072Z","shell.execute_reply":"2023-06-13T10:40:23.058968Z"},"trusted":true},"execution_count":null,"outputs":[]}]}