{"id":1033,"date":"2025-04-23T21:30:43","date_gmt":"2025-04-23T12:30:43","guid":{"rendered":"https:\/\/www.dogrow.net\/nnet\/?p=1033"},"modified":"2025-06-11T22:47:41","modified_gmt":"2025-06-11T13:47:41","slug":"blog38-pytorch%e3%81%a7cifar-10%e3%82%92%e3%82%84%e3%81%a3%e3%81%a6%e3%81%bf%e3%82%8b%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.dogrow.net\/nnet\/blog38-pytorch%e3%81%a7cifar-10%e3%82%92%e3%82%84%e3%81%a3%e3%81%a6%e3%81%bf%e3%82%8b%e3%80%82\/","title":{"rendered":"(38)\u3010PyTorch\u3067CIFAR-10 #1\u3011\u81ea\u52d5\u8a8d\u8b58\u3057\u3066\u307f\u308b\u3002"},"content":{"rendered":"<h1 class=\"my_h\">\u30101\u3011\u3084\u308a\u305f\u3044\u3053\u3068<\/h1>\n<p>PyTorch\u3092\u4f7f\u3044\u3001CIFAR-10\u306e\u81ea\u52d5\u8a8d\u8b58\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u4f5c\u3063\u3066\u52d5\u304b\u3057\u305f\u3044\u3002<br \/>\n\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u306e\u69cb\u9020\u306f\u3001\u524d\u56de <a href=\"https:\/\/www.dogrow.net\/nnet\/blog32-cifar-10%e7%94%bb%e5%83%8f%e3%82%bb%e3%83%83%e3%83%88%e3%82%92%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%8b%ef%bc%88python%e7%89%88%ef%bc%89\/\" target=\"_blank\">(32) CIFAR-10\u753b\u50cf\u30bb\u30c3\u30c8\u3092\u898b\u3066\u307f\u308b\uff08Python\u7248\uff09<\/a>\u3067\u89e3\u6790\u6e08\u307f\u3060\u3002<\/p>\n<p><a href=\"https:\/\/www.cs.utoronto.ca\/~kriz\/cifar.html\" target=\"_blank\">https:\/\/www.cs.utoronto.ca\/~kriz\/cifar.html<br \/>\n<img decoding=\"async\" src=\"https:\/\/www.dogrow.net\/nnet\/wp-content\/uploads\/2025\/04\/Screenshot-from-2025-04-23-10-41-26.png\" alt=\"\"  \/><\/a><\/p>\n<h1 class=\"my_h\">\u30102\u3011\u3084\u3063\u3066\u307f\u308b<\/h1>\n<h2 class=\"my_h\">1) \u30d7\u30ed\u30b0\u30e9\u30e0\u30fb\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9<\/h2>\n<p>MNIST\u306e\u3068\u304d\u3068\u540c\u69d8\u306b\u3001PyTorch\u3067\u306f torchvision.datasets.CIFAR10 \u306a\u308b\u4fbf\u5229\u30af\u30e9\u30b9\u3082\u7528\u610f\u3055\u308c\u3066\u3044\u308b\u3002<\/p>\n<p>\u3067\u3082\u30fb\u30fb\u30fb<br \/>\n<span class=\"my_fc_redBBig\">\u30c7\u30fc\u30bf\u5165\u529b\u90e8\u5206\u3092\u30d6\u30e9\u30c3\u30af\u30dc\u30c3\u30af\u30b9\u306b\u3057\u3066\u3044\u308b\u3068<br \/>\n\u81ea\u4f5c\u306e\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u3092\u4f7f\u3044\u305f\u3044\u3068\u304d\u306b\u56f0\u308b\u306f\u305a\u3002<\/span><\/p>\n<p>\u305d\u3053\u3067\u30fb\u30fb\u30fb<br \/>\n<span class=\"my_fc_blueBBig\">\u4eca\u56de\u306f CIFAR-10\u7528\u306e Dataset\u30af\u30e9\u30b9\u3092\u81ea\u4f5c\u3059\u308b\u3053\u3068\u306b\u3057\u305f\u3002<\/span><br \/>\n\u30af\u30e9\u30b9\u540d\u306f CustomCIFAR10 \u3068\u3059\u308b\u3002<\/p>\n<h3 class=\"my_h\">(1) CIFAR10Dataset.py<\/h3>\n<pre class=\"brush: python; title: CIFAR10Dataset.py; notranslate\" title=\"CIFAR10Dataset.py\">\r\nimport pickle\r\nimport numpy as np\r\nimport torch\r\nfrom torch.utils.data import Dataset\r\nimport os\r\n\r\n#\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n# CIFAR-10 Dataset \u30af\u30e9\u30b9\u5b9a\u7fa9\r\nclass CustomCIFAR10(Dataset):\r\n    #\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n    def __init__(self, data_dir, train=True, transform=None):\r\n        self.transform = transform\r\n        self.data = &#x5B;]\r\n        self.labels = &#x5B;]\r\n        if train:\r\n            files = &#x5B;f&quot;data_batch_{i}&quot; for i in range(1, 6)]\r\n        else:\r\n            files = &#x5B;&quot;test_batch&quot;]\r\n        for file in files:\r\n            filepath = os.path.join(data_dir, file)\r\n            images, labels = self.load_cifar10_batch(filepath)\r\n            self.data.append(images)\r\n            self.labels += labels\r\n        self.data = np.concatenate(self.data)\r\n    #\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n    def __len__(self):\r\n        return len(self.labels)\r\n    #\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n    def __getitem__(self, idx):\r\n        image = self.data&#x5B;idx]\r\n        label = self.labels&#x5B;idx]\r\n        image = torch.tensor(image, dtype=torch.float32)\r\n        if self.transform:\r\n            image = self.transform(image)\r\n        return image, label\r\n    #\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n    def load_cifar10_batch(self, file):\r\n        with open(file, &#039;rb&#039;) as fo:\r\n            dict = pickle.load(fo, encoding=&#039;bytes&#039;)\r\n        data = dict&#x5B;b&#039;data&#039;]\r\n        labels = dict&#x5B;b&#039;labels&#039;]\r\n        data = data.reshape(len(data), 3, 32, 32).astype(&quot;float32&quot;) \/ 255.0\r\n        return data, labels\r\n<\/pre>\n<h3 class=\"my_h\">(2) main.py<\/h3>\n<pre class=\"brush: python; title: main.py; notranslate\" title=\"main.py\">\r\nimport torch\r\nimport torch.nn as nn\r\nimport torch.optim as optim\r\nfrom torch.utils.data import DataLoader\r\nfrom torchvision import transforms\r\nfrom CIFAR10Dataset import CustomCIFAR10\r\n\r\n#\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n# CNN \u30e2\u30c7\u30eb\u5b9a\u7fa9\r\nclass SimpleCNN(nn.Module):\r\n    #\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n    def __init__(self):\r\n        super(SimpleCNN, self).__init__()\r\n        self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1)\r\n        self.pool = nn.MaxPool2d(2, 2)\r\n        self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)\r\n        self.fc1 = nn.Linear(64 * 8 * 8, 256)\r\n        self.fc2 = nn.Linear(256, 10)\r\n    #\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n    def forward(self, x):\r\n        x = self.pool(torch.relu(self.conv1(x)))\r\n        x = self.pool(torch.relu(self.conv2(x)))\r\n        x = x.view(-1, 64 * 8 * 8)\r\n        x = torch.relu(self.fc1(x))\r\n        x = self.fc2(x)\r\n        return x\r\n\r\n#\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n# \u30e1\u30a4\u30f3\u95a2\u6570\r\ndef main():\r\n    # \u8a2d\u5b9a\r\n    data_dir = &#039;..\/data\/cifar-10-batches-py&#039;\r\n    batch_size = 64\r\n    num_epochs = 3\r\n    device = torch.device(&quot;cuda&quot; if torch.cuda.is_available() else &quot;cpu&quot;)\r\n\r\n    # \u30c7\u30fc\u30bf\u5909\u63db\r\n    transform = transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))\r\n\r\n    # \u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u3068\u30ed\u30fc\u30c0\u30fc\r\n    trainset = CustomCIFAR10(data_dir, train=True, transform=transform)\r\n    trainloader = DataLoader(trainset, batch_size=batch_size, shuffle=True)\r\n\r\n    testset = CustomCIFAR10(data_dir, train=False, transform=transform)\r\n    testloader = DataLoader(testset, batch_size=batch_size, shuffle=False)\r\n\r\n    # \u30e2\u30c7\u30eb\u3001\u640d\u5931\u95a2\u6570\u3001\u6700\u9069\u5316\r\n    model = SimpleCNN().to(device)\r\n    criterion = nn.CrossEntropyLoss()      # \u30af\u30e9\u30b9\u5206\u985e\u5411\u3051\u306e\u640d\u5931\u95a2\u6570\r\n    optimizer = optim.Adam(model.parameters(), lr=0.001)\r\n\r\n    # \u5b66\u7fd2\r\n    for epoch in range(num_epochs):\r\n        running_loss = 0.0\r\n        for i, (inputs, labels) in enumerate(trainloader):\r\n            inputs, labels = inputs.to(device), labels.to(device)\r\n            optimizer.zero_grad()\r\n            outputs = model(inputs)\r\n            loss = criterion(outputs, labels)\r\n            loss.backward()\r\n            optimizer.step()\r\n            running_loss += loss.detach().item()\r\n            if i % 100 == 99:\r\n                print(f&quot;&#x5B;{epoch+1}, {i+1:5d}] loss: {running_loss \/ 100:.3f}&quot;)\r\n                running_loss = 0.0\r\n\r\n    # \u30c6\u30b9\u30c8\r\n    correct = 0\r\n    total = 0\r\n    with torch.no_grad():\r\n        for inputs, labels in testloader:\r\n            inputs, labels = inputs.to(device), labels.to(device)\r\n            outputs = model(inputs)\r\n            _, predicted = torch.max(outputs.data, 1)\r\n            total += labels.size(0)\r\n            correct += (predicted == labels).sum().item()\r\n    print(f&quot;Accuracy on test images: {100 * correct \/ total:.2f}%&quot;)\r\n\r\n#\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n# \u5b9f\u884c\r\nif __name__ == &quot;__main__&quot;:\r\n    main()\r\n<\/pre>\n<h2 class=\"my_h\">2) \u30ec\u30a4\u30e4\u30fc\u69cb\u6210<\/h2>\n<p>\u3010\u5165\u529b\u5c64\u3011<br \/>\n\u3000\u2193 [3][32][32]<br \/>\n\u3010CNN\u3011\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000<span class=\"my_fc_crimson\">\u203b\u4e0a\u4e0b\u5de6\u53f3\u7aef\u306b\u30d1\u30c7\u30a3\u30f3\u30b01 \u2192 \u51fa\u529b\u30b5\u30a4\u30ba\u306f\u5909\u308f\u3089\u305a\u3002<\/span><br \/>\n\u3000\u2193 [32[32][32]<br \/>\n\u3010Max Pooling\u3011\u3000\u3000\u3000\u3000<span class=\"my_fc_crimson\">\u203b\u300c\u7a932&#215;2\u300d\u3067\u300c\u30b9\u30c8\u30e9\u30a4\u30c92\u300d\u2192 \u534a\u5206\u306e\u30b5\u30a4\u30ba\u306b\u7e2e\u5c0f\u3055\u308c\u308b\u3002<\/span><br \/>\n\u3000\u2193 [32][16][16]<br \/>\n\u3010CNN\u3011\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000<span class=\"my_fc_crimson\">\u203b\u4e0a\u4e0b\u5de6\u53f3\u7aef\u306b\u30d1\u30c7\u30a3\u30f3\u30b01 \u2192 \u51fa\u529b\u30b5\u30a4\u30ba\u306f\u5909\u308f\u3089\u305a\u3002<\/span><br \/>\n\u3000\u2193 [64[16][16]<br \/>\n\u3010Max Pooling\u3011\u3000\u3000\u3000\u3000<span class=\"my_fc_crimson\">\u203b\u300c\u7a932&#215;2\u300d\u3067\u300c\u30b9\u30c8\u30e9\u30a4\u30c92\u300d\u2192 \u534a\u5206\u306e\u30b5\u30a4\u30ba\u306b\u7e2e\u5c0f\u3055\u308c\u308b\u3002<\/span><br \/>\n\u3000\u2193 [64][8][8]<br \/>\n\u3010Full Connection\u3011<br \/>\n\u3000\u2193 [256]<br \/>\n\u3010Full Connection\u3011<br \/>\n\u3000\u2193 [10]<br \/>\n\u3010\u51fa\u529b\u5c64\u3011<\/p>\n<h2 class=\"my_h\">3) \u5b9f\u884c\u7d50\u679c<\/h2>\n<p>\u3053\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u6b63\u89e3\u7387\u306f\u30013 epochs\u3067 70%\u524d\u5f8c\u3060\u3063\u305f\u3002<\/p>\n<pre class=\"my_pre_bgBlack\">\r\n$ python main.py\r\n[1,   100] loss: 1.806\r\n[1,   200] loss: 1.465\r\n[1,   300] loss: 1.331\r\n[1,   400] loss: 1.291\r\n[1,   500] loss: 1.175\r\n[1,   600] loss: 1.153\r\n[1,   700] loss: 1.083\r\n[2,   100] loss: 0.982\r\n[2,   200] loss: 0.937\r\n[2,   300] loss: 0.939\r\n[2,   400] loss: 0.937\r\n[2,   500] loss: 0.897\r\n[2,   600] loss: 0.901\r\n[2,   700] loss: 0.850\r\n[3,   100] loss: 0.759\r\n[3,   200] loss: 0.767\r\n[3,   300] loss: 0.756\r\n[3,   400] loss: 0.754\r\n[3,   500] loss: 0.759\r\n[3,   600] loss: 0.728\r\n[3,   700] loss: 0.759\r\nFinished Training\r\nAccuracy on test images: 71.40%\r\n<\/pre>\n<hr class=\"my_hr_bottom\">\n","protected":false},"excerpt":{"rendered":"<p>\u30101\u3011\u3084\u308a\u305f\u3044\u3053\u3068 PyTorch\u3092\u4f7f\u3044\u3001CIFAR-10\u306e\u81ea\u52d5\u8a8d\u8b58\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u4f5c\u3063\u3066\u52d5\u304b\u3057\u305f\u3044\u3002 \u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u306e\u69cb\u9020\u306f\u3001\u524d\u56de (32) CIFAR-10\u753b\u50cf\u30bb\u30c3\u30c8\u3092\u898b\u3066\u307f\u308b\uff08Python\u7248\uff09\u3067\u89e3\u6790\u6e08\u307f\u3060\u3002 https:\u2026 <span class=\"read-more\"><a href=\"https:\/\/www.dogrow.net\/nnet\/blog38-pytorch%e3%81%a7cifar-10%e3%82%92%e3%82%84%e3%81%a3%e3%81%a6%e3%81%bf%e3%82%8b%e3%80%82\/\">\u7d9a\u304d\u3092\u8aad\u3080 &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17,16],"tags":[],"class_list":["post-1033","post","type-post","status-publish","format-standard","hentry","category-cifar-10","category-pytorch"],"views":875,"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.dogrow.net\/nnet\/wp-json\/wp\/v2\/posts\/1033","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dogrow.net\/nnet\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dogrow.net\/nnet\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dogrow.net\/nnet\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dogrow.net\/nnet\/wp-json\/wp\/v2\/comments?post=1033"}],"version-history":[{"count":46,"href":"https:\/\/www.dogrow.net\/nnet\/wp-json\/wp\/v2\/posts\/1033\/revisions"}],"predecessor-version":[{"id":2531,"href":"https:\/\/www.dogrow.net\/nnet\/wp-json\/wp\/v2\/posts\/1033\/revisions\/2531"}],"wp:attachment":[{"href":"https:\/\/www.dogrow.net\/nnet\/wp-json\/wp\/v2\/media?parent=1033"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dogrow.net\/nnet\/wp-json\/wp\/v2\/categories?post=1033"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dogrow.net\/nnet\/wp-json\/wp\/v2\/tags?post=1033"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}