{"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":"nvidiaTeslaT4","dataSources":[{"sourceId":29193,"databundleVersionId":2318453,"sourceType":"competition"},{"sourceId":8081353,"sourceType":"datasetVersion","datasetId":4769888},{"sourceId":28586,"sourceType":"modelInstanceVersion","isSourceIdPinned":true,"modelInstanceId":24073}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import json\nimport shutil\n\nimport numpy\nimport pandas as pd\nimport os\n\nimport torch\nfrom PIL import Image\nfrom torch.utils.data import DataLoader, Dataset, random_split\nfrom sklearn.preprocessing import LabelEncoder, OneHotEncoder\nimport torchvision\nimport torch.nn as nn\nimport torch\n\n\nclass AlexNet(nn.Module):\n    def __init__(self, num_classes=176):\n        super(AlexNet, self).__init__()\n        self.features = nn.Sequential(\n            nn.Conv2d(3, 96, kernel_size=11, stride=4, padding=2),\n            nn.ReLU(),\n            nn.MaxPool2d(kernel_size=3, stride=2),\n            nn.Conv2d(96, 256, kernel_size=5, padding=2),\n            nn.ReLU(),\n            nn.MaxPool2d(kernel_size=3, stride=2),\n            nn.Conv2d(256, 384, kernel_size=3, padding=1),\n            nn.ReLU(),\n            nn.Conv2d(384, 384, kernel_size=3, padding=1),\n            nn.ReLU(),\n            nn.Conv2d(384, 256, kernel_size=3, padding=1),\n            nn.ReLU(),\n            nn.MaxPool2d(kernel_size=3, stride=2),\n        )\n        self.classifier = nn.Sequential(\n            nn.Linear(256 * 6 * 6, 4096),\n            nn.ReLU(),\n            nn.Dropout(p=0.5),\n            nn.Linear(4096, 4096),\n            nn.ReLU(),\n            nn.Dropout(p=0.5),\n            nn.Linear(4096, num_classes)\n        )\n\n    def forward(self, x):\n        x = self.features(x)\n        x = torch.flatten(x, start_dim=1)\n        x = self.classifier(x)\n        return x\n\n\ntrain_data = pd.read_csv(\"/kaggle/input/classify-leaves/train.csv\")\n\nlabelEncoder = LabelEncoder()\nlabelEncoder.fit(train_data['label'])\ntrain_data['label'] = labelEncoder.transform(train_data['label'])\n# label : id\nlabel_map = dict(zip(labelEncoder.classes_, labelEncoder.transform(labelEncoder.classes_).astype(str)))\n# id: label\nlabel_inv_map = {v: k for k, v in label_map.items()}\n\n\ndef labelMapToJson(label_map__):\n    \"\"\"将labelMap写入到json中 labelMap中的内容是：{“label”:\"id\"}\"\"\"\n    filename = \"classify-leaves/classify_leaves.json\"\n    with open(filename, 'w') as j:\n        j.write(json.dumps(label_map__))\n\n\ndef partData(data, label_inv_map__):\n    \"\"\"将所有图片归类到对应的类别中\"\"\"\n    root_dir = \"/kaggle/input/classify-leaves/\"\n    data_dir = \"/kaggle/working/\"\n    # 获取所有的类名 遍历train如何label存在则将文件加入到对应文件夹如果没有则创建后加入\n    for item in data:\n        img = item[0]\n        label = label_inv_map__.get(str(item[1]))\n        if os.path.exists(os.path.join(data_dir, label)):\n            # 将文件移动到该文件夹\n            shutil.copy(root_dir + f\"{img}\", data_dir + f\"{label}\")\n        else:\n            # 创建文件夹并移入文件\n            os.mkdir(data_dir + f\"{label}\")\n            shutil.copy(root_dir + f\"{img}\", data_dir + f\"{label}\")\n\n\n# # labelMapToJson(label_map)\npartData(train_data.values, label_inv_map)\n\nclass LeafDataSet(Dataset):\n    def __init__(self, transform__, train_csv__, json_dir__, data_dir__):\n        self.transform = transform__\n        self.leafData = pd.read_csv(train_csv__)\n        f = open(json_dir__, \"r\")\n        content = f.read()\n        self.label_map = json.loads(content)\n        self.data_dir = data_dir__\n\n    def __getitem__(self, index):\n        leafData = self.leafData.values\n\n        img = leafData[index][0]\n        label = leafData[index][1]\n\n        img = Image.open(f\"{self.data_dir}/{label}/{img.split('/')[-1]}\")\n        img = self.transform(img)\n\n        label_id = self.label_map.get(label)\n        label_id = torch.as_tensor(int(label_id))\n        return img, label_id\n\n    def __len__(self):\n        return len(self.leafData)\n\n\ntransform = torchvision.transforms.Compose([\n    torchvision.transforms.Resize((224, 224)),  # 将图像大小调整为模型所需的大小\n    torchvision.transforms.RandomHorizontalFlip(p=0.5),\n    torchvision.transforms.RandomVerticalFlip(p=0.5),\n    torchvision.transforms.ToTensor(),  # 将图像转换为张量\n    torchvision.transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])  # 标准化\n])\n\njson_dir = \"/kaggle/input/leafdataset/classify_leaves.json\"\ndata_dir = \"/kaggle/working\"\ntrain_csv = \"/kaggle/input/classify-leaves/train.csv\"\nleafDataSet = LeafDataSet(transform, train_csv, json_dir, data_dir)\n\ntest_size = int(len(leafDataSet) * 0.2)\nvalid_size = test_size\ntrain_size = int(len(leafDataSet)) - test_size - valid_size\ntrain_dataset, valid_dataset, test_dataset = random_split(leafDataSet, [train_size, valid_size, test_size])\n\n\n\nbatch_size = 32\nvalid_iter = DataLoader(dataset=valid_dataset, batch_size=batch_size, shuffle=True, drop_last=False)\n\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nnet = AlexNet()\nnet.load_state_dict(torch.load('/kaggle/input/alexnetpcd/pytorch/pcd/1/alexNet.pth'))\nnet.to(device)\n\nnet.eval()\ncorrect = 0\ntotal = 0\nwith torch.no_grad():\n    for inputs, labels in valid_iter:\n        inputs, labels = inputs.to(device), labels.to(device)\n        outputs = net(inputs)\n        _, predicted = torch.max(outputs, 1)\n        total += labels.size(0)\n        correct += (predicted == labels).sum().item()\n\naccuracy = correct / total\nprint(f\"Test Accuracy:{accuracy:.4f}\")\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]}]}