{"id":1401,"date":"2025-05-17T02:24:04","date_gmt":"2025-05-16T17:24:04","guid":{"rendered":"https:\/\/www.dogrow.net\/nnet\/?p=1401"},"modified":"2025-05-25T09:49:15","modified_gmt":"2025-05-25T00:49:15","slug":"blog44%e3%80%90pytorch%e3%80%91fashion-mnist%e3%81%ae%e4%b8%8d%e6%ad%a3%e8%a7%a3%e7%94%bb%e5%83%8f%e3%82%92%e7%9c%ba%e3%82%81%e3%82%8b%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.dogrow.net\/nnet\/blog44%e3%80%90pytorch%e3%80%91fashion-mnist%e3%81%ae%e4%b8%8d%e6%ad%a3%e8%a7%a3%e7%94%bb%e5%83%8f%e3%82%92%e7%9c%ba%e3%82%81%e3%82%8b%e3%80%82\/","title":{"rendered":"(44)\u3010PyTorch\u3011Fashion-MNIST\u306e\u4e0d\u6b63\u89e3\u753b\u50cf\u3092\u773a\u3081\u308b\u3002"},"content":{"rendered":"<h1 class=\"my_h\">\u30101\u3011\u3084\u308a\u305f\u3044\u3053\u3068<\/h1>\n<p>MNIST\u3068\u540c\u3058 28&#215;28\u30d4\u30af\u30bb\u30eb\u306e\u30b0\u30ec\u30fc\u30b9\u30b1\u30fc\u30eb\u753b\u50cf\u306e\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u304c\u3042\u308b\u3068\u306e\u3053\u3068\u3002<br \/>\n\u305d\u306e\u540d\u3082 <span class=\"my_fc_deeppinkBBig\">Fashion-MNIST<\/span><br \/>\n\u8863\u985e\u753b\u50cf 10\u7a2e\u985e\u3092\u6301\u3064\u753b\u50cf\u5206\u985e\u7528\u306e\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u3060\u3002<\/p>\n<p><a href=\"https:\/\/github.com\/zalandoresearch\/fashion-mnist\" target=\"_blank\">https:\/\/github.com\/zalandoresearch\/fashion-mnist<br \/>\n<img decoding=\"async\" src=\"https:\/\/www.dogrow.net\/nnet\/wp-content\/uploads\/2025\/05\/i001-1.jpg\" alt=\"\" class=\"my_add_bs1\" \/><\/a><\/p>\n<p>\u4eca\u56de\u306f\u3001\u3053\u308c\u3092 PyTorch\u3092\u4f7f\u3063\u3066\u5b66\u7fd2\u3055\u305b\u3001<br \/>\n<span class=\"my_fc_deeppinkBBig\">\u3069\u3093\u306a\u753b\u50cf\u304c\u82e6\u624b\u306a\u306e\u304b\u3092\u773a\u3081\u3066\u307f\u308b\u3002<\/span><\/p>\n<p>\u4f7f\u7528\u3059\u308b\u30d7\u30ed\u30b0\u30e9\u30e0\u306f <a href=\"https:\/\/www.dogrow.net\/nnet\/35%e3%80%90pytorch%e3%81%a7mnist-6%e3%80%91%e4%b8%8d%e6%ad%a3%e8%a7%a3%e7%94%bb%e5%83%8f%e3%81%a8%e5%88%a4%e5%ae%9a%e7%b5%90%e6%9e%9c%e3%82%92jpeg%e7%94%bb%e5%83%8f%e5%87%ba%e5%8a%9b%e3%81%99\/\" target=\"_blank\">(35)\u3010PyTorch\u3067MNIST #6\u3011\u4e0d\u6b63\u89e3\u753b\u50cf\u3068\u5224\u5b9a\u7d50\u679c\u3092JPEG\u753b\u50cf\u51fa\u529b\u3059\u308b\u3002<\/a> \u3067\u4f5c\u3063\u305f\u3082\u306e\u3092\u6d41\u7528\u3059\u308b\u3002<br \/>\nDataLoader\u3060\u3051\u3092\u4eca\u56de\u7528\u306b\u4f5c\u308a\u66ff\u3048\u308b\u3002<\/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>\u904e\u53bb\u8a18\u4e8b <a href=\"https:\/\/www.dogrow.net\/nnet\/blog33%e3%80%90pytorch%e3%81%a7mnist-4%e3%80%91%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%a0%e3%81%ae%e4%bf%9d%e5%ae%88%e6%80%a7%e3%82%92%e5%90%91%e4%b8%8a%e3%81%95%e3%81%9b%e3%82%8b%e3%80%82\/\" target=\"_blank\">(33)\u3010PyTorch\u3067MNIST #4\u3011\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u4fdd\u5b88\u6027\u3092\u5411\u4e0a\u3055\u305b\u308b\u3002<\/a> \u306b\u66f8\u3044\u305f\u3088\u3046\u306b\u3001\u6a5f\u80fd\u5225\u306b\u5168 5\u30d5\u30a1\u30a4\u30eb\u306b\u5206\u5272\u6e08\u307f\u3060\u3002<\/p>\n<h3 class=\"my_h\">(1) dataset_FMNIST.py<\/h3>\n<p>\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u30d5\u30a1\u30a4\u30eb\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u305f\u3081\u306e\u30af\u30e9\u30b9\u5b9a\u7fa9\u3060\u3002<br \/>\n\u4eca\u56de\u306f PyTorch\u304c\u3042\u3089\u304b\u3058\u3081\u7528\u610f\u3057\u3066\u304f\u308c\u3066\u3044\u308b <span class=\"my_fc_deeppink\">datasets.FashionMNIST<\/span> \u30af\u30e9\u30b9\u3092\u4f7f\u3046\u3002<\/p>\n<p>\u3053\u308c\u3092\u81ea\u4f5c\u3057\u305f\u3044\u5834\u5408\u306f <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\/\" target=\"_blank\">(38)\u3010PyTorch\u3067CIFAR-10 #1\u3011\u81ea\u52d5\u8a8d\u8b58\u3057\u3066\u307f\u308b\u3002<\/a> \u306b\u66f8\u3044\u305f\u3088\u3046\u306b\u3059\u308c\u3070\u3088\u3044\u3002<br \/>\n\u30d6\u30e9\u30c3\u30af\u30dc\u30c3\u30af\u30b9\u5316\u3092\u56de\u907f\u3067\u304d\u308b\u3002<\/p>\n<pre class=\"brush: python; title: dataset_FMNIST.py; notranslate\" title=\"dataset_FMNIST.py\">\r\nfrom torchvision import datasets, transforms\r\n\r\nclass FMNISTDataset:\r\n    def __init__(self, data_dir=&#039;.\/data&#039;):\r\n        self.transform = transforms.Compose(&#x5B;\r\n            transforms.ToTensor(),\r\n            transforms.Normalize((0.1307,), (0.3081,))\r\n        ])\r\n        self.data_dir = data_dir\r\n\r\n    def get_train_dataset(self):\r\n        return datasets.FashionMNIST(self.data_dir, train=True, download=True, transform=self.transform)\r\n\r\n    def get_test_dataset(self):\r\n        return datasets.FashionMNIST(self.data_dir, train=False, download=True, transform=self.transform)\r\n<\/pre>\n<h3 class=\"my_h\">(2) net_model.py<\/h3>\n<p>Neural Network\u3092\u5b9a\u7fa9\u3059\u308b\u30af\u30e9\u30b9\u3060\u3002<br \/>\n\u4eca\u56de\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u69cb\u6210\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3002<\/p>\n<p>[Input[28][28]]<br \/>\n\u3000\u2192 [<span class=\"my_fc_deeppinkB\">CNN<\/span>[16][28][28]] \u2192 ReLU<br \/>\n\u3000\u2192 [<span class=\"my_fc_blueB\">Max.Pool<\/span>[16][14][14]]<br \/>\n\u3000\u2192 [<span class=\"my_fc_deeppinkB\">CNN<\/span>[32][14][14]] \u2192 ReLU<br \/>\n\u3000\u2192 [<span class=\"my_fc_blueB\">Max.Pool<\/span>[32][7][7]]<br \/>\n\u3000\u2192 [Full[256]] \u2192 ReLU<br \/>\n\u3000\u2192 [Output[10]] \u2192 Softmax<\/p>\n<pre class=\"brush: python; title: net_model.py; notranslate\" title=\"net_model.py\">\r\nimport torch.nn as nn\r\nimport torch\r\n\r\nclass Net(nn.Module):\r\n    def __init__(self):\r\n        super(Net, self).__init__()\r\n        # bs : batch_size\r\n        self.conv1 = nn.Conv2d(in_channels=1, out_channels=16, kernel_size=3, padding=1)  # &#x5B;bs]&#x5B;1]&#x5B;28]&#x5B;28] \u2192 &#x5B;bs]&#x5B;16]&#x5B;28]&#x5B;28]\r\n        self.pool  = nn.MaxPool2d(kernel_size=2, stride=2)                                #  \u2192 &#x5B;bs]&#x5B;16]&#x5B;14]&#x5B;14]               \r\n        self.conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, padding=1) #  \u2192 &#x5B;bs]&#x5B;32]&#x5B;14]&#x5B;14] \u2192pool\u2192 &#x5B;bs]&#x5B;32]&#x5B;7]&#x5B;7]\r\n        self.fc1   = nn.Linear(in_features=32 * 7 * 7, out_features=256)                  #  \u2192 &#x5B;bs]&#x5B;32x7x7] \u2192 &#x5B;bs]&#x5B;256]\r\n        self.fc2   = nn.Linear(in_features=256, out_features=10)                          #  \u2192 &#x5B;bs]&#x5B;256] \u2192 &#x5B;bs]&#x5B;10] \r\n\r\n    def forward(self, x):\r\n        x = self.pool(torch.relu(self.conv1(x)))   #   CNN \u2192 ReLU \u2192 Max.pooling\r\n        x = self.pool(torch.relu(self.conv2(x)))   # \u2192 CNN \u2192 ReLU \u2192 Max.pooling\r\n        x = x.view(-1, 32 * 7 * 7)                 # \u2192 &#x5B;bs]&#x5B;32]&#x5B;7]&#x5B;7] \u2192 flatten &#x5B;bs]&#x5B;32x7x7=1568] \u30c6\u30f3\u30bd\u30eb\u306e\u5f62\u5909\u63db\uff08reshape\uff0932\u30c1\u30e3\u30f3\u30cd\u30eb\u30fb\u7e267\u30fb\u6a2a7\u306e\u7279\u5fb4\u30de\u30c3\u30d7\u3092\u300132\u00d77\u00d77=1568\u500b\u306e\u7279\u5fb4\u30d9\u30af\u30c8\u30eb\u306b1\u5217\u306b\u4e26\u3073\u66ff\u3048\u308b\r\n        x = torch.relu(self.fc1(x))                # \u2192 &#x5B;1568] \u2192 FC\u2192 &#x5B;256] \u2192 ReLU\r\n        x = self.fc2(x)                            # \u2192 &#x5B;10]\r\n        return x\r\n<\/pre>\n<h3 class=\"my_h\">(3) trainer.py<\/h3>\n<p>\u30e2\u30c7\u30eb\u306e\u8a13\u7df4\u3068\u30c6\u30b9\u30c8\u3092\u5b9f\u884c\u3059\u308b\u30af\u30e9\u30b9\u3060\u3002<br \/>\n\u5b66\u7fd2\u6e08\u307f\u30d1\u30e9\u30e1\u30fc\u30bf\u306e Save \/ Recall\u306e\u6a5f\u80fd\u3082\u6301\u3064\u3002<\/p>\n<pre class=\"brush: python; title: trainer.py; notranslate\" title=\"trainer.py\">\r\nimport torch\r\nimport torch.nn as nn\r\nimport torch.optim as optim\r\n\r\nclass Trainer:\r\n    #\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n    def __init__(self, model, device, lr=0.001):\r\n        self.model = model.to(device)\r\n        self.device = device\r\n        self.criterion = nn.CrossEntropyLoss()\r\n        self.optimizer = optim.Adam(self.model.parameters(), lr=lr)\r\n\r\n    #\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n    def train(self, train_loader, epochs=3):\r\n        self.model.train()\r\n        for epoch in range(epochs):\r\n            for data, target in train_loader:\r\n                data, target = data.to(self.device), target.to(self.device)\r\n                self.optimizer.zero_grad()\r\n                output = self.model(data)\r\n                loss = self.criterion(output, target)\r\n                loss.backward()\r\n                self.optimizer.step()\r\n            print(f&quot;&#x5B;{epoch+1}\/{epochs}] Epoch complete&quot;)\r\n\r\n    #\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n    def test(self, test_loader):\r\n        self.model.eval()\r\n        correct = 0\r\n        total = 0\r\n        all_images = &#x5B;]      # \u51fa\u529b\u7528\uff1a\u5168\u753b\u50cf\u30c7\u30fc\u30bf\r\n        all_probs  = &#x5B;]      # \u51fa\u529b\u7528\uff1a\u5168\u30c6\u30b9\u30c8\u7d50\u679c\r\n        all_labels = &#x5B;]      # \u51fa\u529b\u7528\uff1a\u5168\u753b\u50cf\u30c7\u30fc\u30bf\u306e\u6b63\u89e3\u30e9\u30d9\u30eb\r\n        #----------------------------------------------------------------------\r\n        with torch.no_grad():\r\n            for data, target in test_loader:\r\n                data, target = data.to(self.device), target.to(self.device)\r\n                outputs = self.model(data)\r\n                _, predicted = torch.max(outputs.data, 1)\r\n                total += target.size(0)\r\n                correct += (predicted == target).sum().item()\r\n                # \u51fa\u529b\u7528\u306b\u4eca\u56de\u30d0\u30c3\u30c1\u306e\u30c6\u30b9\u30c8\u7d50\u679c\u3092\u9000\u907f\u3057\u3066\u304a\u304f\u3002\r\n                probs = torch.softmax(outputs, dim=1)\r\n                all_images.extend(data.cpu())\r\n                all_probs.extend(probs.cpu())\r\n                all_labels.extend(target.cpu())\r\n        #----------------------------------------------------------------------\r\n        acc = 100 * correct \/ total\r\n        print(f&quot;Test Accuracy: {acc:.2f}%&quot;)\r\n        return acc, all_images, all_probs, all_labels\r\n\r\n    #\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n    def save(self, path):\r\n        torch.save(self.model.state_dict(), path)\r\n        print(f&quot;Model saved to {path}&quot;)\r\n\r\n    #\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n    def load(self, path):\r\n        self.model.load_state_dict(torch.load(path, map_location=self.device))\r\n        print(f&quot;Model loaded from {path}&quot;)\r\n<\/pre>\n<h3 class=\"my_h\">(4) control_train.py<\/h3>\n<p>\u30e2\u30c7\u30eb\u306e\u8a13\u7df4\u3092\u5236\u5fa1\u3059\u308b\u30a8\u30f3\u30c8\u30ea\u30fc\u30dd\u30a4\u30f3\u30c8\u3060\u3002<br \/>\n\u5148\u306b\u8a18\u3057\u305f Trainer\u30af\u30e9\u30b9\u3092\u4f7f\u3044\u3001\u5b66\u7fd2\u3092\u5236\u5fa1\u3059\u308b\u3002<br \/>\n\u5b66\u7fd2\u306e\u5b8c\u4e86\u5f8c\u306b\u3001\u5b66\u7fd2\u6e08\u307f\u30d1\u30e9\u30e1\u30fc\u30bf\u30d5\u30a1\u30a4\u30eb\u3092\u51fa\u529b\u3059\u308b\u3002<\/p>\n<pre class=\"brush: python; title: control_train.py; notranslate\" title=\"control_train.py\">\r\nfrom torch.utils.data import DataLoader\r\nfrom net_model import Net\r\nfrom trainer import Trainer\r\nfrom dataset_FMNIST import FMNISTDataset\r\nimport torch\r\nimport argparse\r\nfrom datetime import datetime\r\n\r\n#\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\ndef execTrain( save_path ):\r\n    # \u30c7\u30fc\u30bf\r\n    dataset = FMNISTDataset()\r\n    train_loader = DataLoader(dataset.get_train_dataset(), batch_size=64, shuffle=True)\r\n    test_loader = DataLoader(dataset.get_test_dataset(), batch_size=1000, shuffle=False)\r\n    # \u74b0\u5883\r\n    device = torch.device(&quot;cuda&quot; if torch.cuda.is_available() else &quot;cpu&quot;)\r\n    model = Net()\r\n    trainer = Trainer(model, device)\r\n    # \u5b9f\u884c\r\n    trainer.train(train_loader, epochs=10)\r\n    trainer.test(test_loader)\r\n    trainer.save(save_path)\r\n\r\n#\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\ndef main():\r\n    parser = argparse.ArgumentParser(description=&quot;Train and save model&quot;)\r\n    parser.add_argument(&#039;-p&#039;, type=str, help=&#039;Filename to save trained model&#039;)\r\n    args = parser.parse_args()\r\n    # \u30d5\u30a1\u30a4\u30eb\u540d\u306e\u6c7a\u5b9a\r\n    if args.p:\r\n        save_path = args.p\r\n    else:\r\n        now = datetime.now().strftime(&quot;%Y%m%d_%H%M%S&quot;)\r\n        save_path = f&quot;learned_model_{now}.pth&quot;\r\n    execTrain(save_path=save_path)\r\n\r\n#\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\nif __name__ == &quot;__main__&quot;:\r\n    main()\r\n<\/pre>\n<h3 class=\"my_h\">(5) control_test.py<\/h3>\n<p>\u30e2\u30c7\u30eb\u306e\u30c6\u30b9\u30c8\u3092\u5236\u5fa1\u3059\u308b\u30a8\u30f3\u30c8\u30ea\u30fc\u30dd\u30a4\u30f3\u30c8\u3060\u3002<br \/>\n\u5b66\u7fd2\u6e08\u307f\u30d1\u30e9\u30e1\u30fc\u30bf\u30d5\u30a1\u30a4\u30eb\u306e\u6307\u5b9a\u304c\u5fc5\u9808\u3060\u3002<br \/>\n\u30c6\u30b9\u30c8\u7d50\u679c NG\u306e\u30c6\u30b9\u30c8\u753b\u50cf\u306b\u3064\u3044\u3066\u306e\u30ec\u30dd\u30fc\u30c8\u30d5\u30a1\u30a4\u30eb\u3092\u51fa\u529b\u3059\u308b\u305f\u3081\u3001\u51e6\u7406\u91cf\u304c\u591a\u3044\u3002<\/p>\n<pre class=\"brush: python; title: control_test.py; notranslate\" title=\"control_test.py\">\r\nimport torch\r\nfrom torch.utils.data import DataLoader\r\nfrom net_model import Net\r\nfrom trainer import Trainer\r\nfrom dataset_FMNIST import FMNISTDataset\r\nimport argparse\r\nimport matplotlib.pyplot as plt\r\nimport numpy as np\r\nimport os\r\n\r\n#\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\ndef output_results_image(images, probs_list, labels):\r\n    os.makedirs(&quot;results&quot;, exist_ok=True)  # \u51fa\u529b\u5148\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u4f5c\u6210\r\n    #for idx in range(1000):\r\n    for idx in range(len(images)):\r\n        prob = probs_list&#x5B;idx].numpy()     # prob \u306f\u9577\u305510\u306e\u78ba\u7387\u30d9\u30af\u30c8\u30eb\uff08\u5404\u6570\u5b57\u304c\u6b63\u89e3\u3067\u3042\u308b\u78ba\u7387\uff09\r\n        predicted_label = np.argmax(prob)  # \u78ba\u7387\u30d9\u30af\u30c8\u30eb\u306e\u4e2d\u3067\u6700\u3082\u5024\u304c\u5927\u304d\u3044\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\uff08\u3064\u307e\u308a\u4e88\u6e2c\u30e9\u30d9\u30eb\uff09\u3092\u53d6\u308a\u51fa\u3059\u3002\r\n        true_label = labels&#x5B;idx]           # \u3053\u306e\u753b\u50cf\u306e\u6b63\u89e3\u30e9\u30d9\u30eb\uff08\u6559\u5e2b\u30c7\u30fc\u30bf\uff09\u3092\u53d6\u308a\u51fa\u3059\u3002\r\n        if predicted_label == true_label:  # \u6b63\u89e3\u753b\u50cf\u306e\u5834\u5408\u306f\u30b9\u30ad\u30c3\u30d7\u3059\u308b\u3002\r\n            continue\r\n        nClasses = len(prob)\r\n\r\n        # images&#x5B;idx] \u306f\u5f62\u72b6\u304c (1, 28, 28) \u306e\u30c6\u30f3\u30bd\u30eb\uff081\u30c1\u30e3\u30cd\u30eb\u306e\u753b\u50cf\uff09\u306a\u306e\u3067\u3001\r\n        # .squeeze(0) \u3067\u5148\u982d\u306e\u6b21\u5143\uff081\uff09\u3092\u6d88\u3057\u3066 (28, 28) \u306b\u3057 .numpy() \u3067 NumPy \u914d\u5217\u306b\u5909\u63db\u3059\u308b\u3002\r\n        img = images&#x5B;idx].squeeze(0).numpy()\r\n\r\n        # \u753b\u50cf1\u679a\u3054\u3068\u306b\u65b0\u3057\u3044\u56f3\u3092\u4f5c\u308b\uff08\u30b5\u30a4\u30ba\u306f 4\u30a4\u30f3\u30c1 \u00d7 4\u30a4\u30f3\u30c1\uff09\r\n        # save\u5b9f\u884c\u6642\u306e dpi=150 \u3067\u753b\u50cf\u30b5\u30a4\u30ba\u3092\u66f4\u306b\u8abf\u6574\u53ef\u80fd\r\n        # fig \u306f\u56f3\u5168\u4f53\u3001ax \u306f\u305d\u306e\u4e2d\u306e\u63cf\u753b\u9818\u57df\r\n        fig, ax = plt.subplots(figsize=(3, 3))  # \u753b\u50cf\u3054\u3068\u306b\u65b0\u3057\u3044\u56f3\u3092\u4f5c\u6210\r\n        ax.set_facecolor(&#039;white&#039;)\r\n\r\n        # \u4e0a\u534a\u5206\u306b\u753b\u50cf\r\n        # \u753b\u50cf\u3092\u30b0\u30ec\u30fc\u30b9\u30b1\u30fc\u30eb\u3067\u8868\u793a\u3059\u308b\u3002\r\n        # X\u8ef8\u306f 0\u301c28\uff08matplotlib\u5185\u90e8\u306e\u4eee\u60f3\u7684\u306a\u5ea7\u6a19\u7cfb\u306e\u6570\u5024)\r\n        # Y\u8ef8\u306f 30\u301c56 \u306b\u3057\u3066\u30bb\u30eb\u5185\u306e\u4e0a\u5074(\u4e0a\u534a\u5206)\u306b\u8868\u793a\u3055\u308c\u308b\u3088\u3046\u306b\u3059\u308b\u3002\r\n        ax.imshow(img, cmap=&#039;gray&#039;, extent=&#x5B;0.4, 28.4, 30, 56])\r\n\r\n        # \u4e0b\u534a\u5206\u306b\u68d2\u30b0\u30e9\u30d5\uff08\u6b63\u89e3\u306f\u8d64\u3001\u4ed6\u306f\u7070\u8272\uff09\r\n        bar_colors = &#x5B;&#039;red&#039; if i == true_label else &#039;gray&#039; for i in range(nClasses)]\r\n        # \u68d2\u30b0\u30e9\u30d5\u3092\u63cf\u304f\u3002\r\n        # Bar\u6a2a\u4f4d\u7f6e\uff08X\u5ea7\u6a19\uff09\uff1a 0, 3.2, 6.4, ..., 28.8\uff08\u30e9\u30d9\u30eb0\u301c9\u306e\u4f4d\u7f6e\uff09\r\n        # Bar\u9ad8\u3055\uff1a prob(=\u51fa\u529b\u5c64\u306e\u5024) * 28 \u2192 0\u301c28\u306e\u7bc4\u56f2\u306b\u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\r\n        # Bar\u5e45\uff1a 3\r\n        x_positions = np.arange(nClasses) * 3.2\r\n        ax.bar(x_positions, prob * 28, width=3, bottom=0, color=bar_colors)\r\n\r\n        # \u8ef8\u8a2d\u5b9a\uff08\u6c34\u5e73\u65b9\u5411\u30b0\u30ea\u30c3\u30c9\u4ed8\u304d\uff09\r\n        # X\u8ef8\u306e\u76ee\u76db\u308a\u30920\u301c9\u306e\u30e9\u30d9\u30eb\u306b\u5bfe\u5fdc\u3055\u305b\u3066\u8868\u793a\u3059\u308b\u3002\r\n        \r\n        #ax.set_xticks(x_positions)\r\n        #ax.set_xticklabels(&#x5B;str(i) for i in range(nClasses)], fontsize=8)\r\n\r\n        ax.set_xticks(x_positions)\r\n        # X\u8ef8\u306e\u76ee\u76db\u308a\u30e9\u30d9\u30eb\u306f\u975e\u8868\u793a\u306b\u3057\u3066\u3001\u4ee3\u308f\u308a\u306b\u500b\u5225\u306b\u63cf\u753b\uff08\u8272\u5206\u3051\u3059\u308b\u305f\u3081\uff09\r\n        ax.set_xticklabels(&#x5B;&#039;&#039;] * nClasses)  # \u4e00\u65e6\u30e9\u30d9\u30eb\u3092\u7a7a\u767d\u306b\u3059\u308b\r\n\r\n        for i in range(nClasses):\r\n            label_color = &#039;red&#039; if i == true_label else &#039;black&#039;\r\n            ax.text(x_positions&#x5B;i], -4, str(i),\r\n                    ha=&#039;center&#039;, va=&#039;top&#039;, fontsize=8, color=label_color)\r\n\r\n\r\n\r\n        # Y\u8ef8\u30820.0\u301c1.0\u306e\u7bc4\u56f2\u306b\u76ee\u76db\u308a\u3092\u4ed8\u3051\u308b\u304c\u3001\u8868\u793a\u306f28\u30b9\u30b1\u30fc\u30eb\u306b\u5408\u308f\u305b\u305f\u4f4d\u7f6e\u306b\u306a\u308b\u3002\r\n        y_ticks = np.arange(0.0, 1.01, 0.1) * 28\r\n        ax.set_yticks(y_ticks)\r\n        ax.set_yticklabels(&#x5B;f&quot;{y:.1f}&quot; for y in np.arange(0.0, 1.01, 0.1)], fontsize=7)\r\n        # Y\u8ef8\u306b\u70b9\u7dda\u306e\u30b0\u30ea\u30c3\u30c9\u7dda\u3092\u5f15\u304f\u3002\u7dda\u306e\u8272\u306f\u8584\u3044\u30b0\u30ec\u30fc\u3001\u592a\u30550.5\r\n        ax.yaxis.grid(True, linestyle=&#039;--&#039;, linewidth=0.5, color=&#039;lightgray&#039;)\r\n\r\n        # \u4e0d\u8981\u306a\u4f59\u767d\u3092\u524a\u9664\u3002\u56f3\u5168\u4f53\u306e\u4f59\u767d\u3092\u81ea\u52d5\u3067\u8abf\u6574\u3057\u3066\u3001\u898b\u3084\u3059\u304f\u3059\u308b\u3002\r\n        plt.tight_layout()\r\n\r\n        # JPEG\u3068\u3057\u3066\u4fdd\u5b58\uff08\u4f8b\uff1aresults\/image_00000.jpg\uff09\r\n        filename = f&quot;results\/i_{idx:05}.jpg&quot;\r\n        plt.savefig(filename, dpi=150)\r\n        plt.close(fig)  # \u30e1\u30e2\u30ea\u7bc0\u7d04\u306e\u305f\u3081\u660e\u793a\u7684\u306b\u9589\u3058\u308b\r\n\r\n#\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\ndef execTest( prmfile, visualize ):\r\n    # \u30c7\u30fc\u30bf\r\n    dataset = FMNISTDataset()\r\n    test_loader = DataLoader(dataset.get_test_dataset(), batch_size=1000, shuffle=False)\r\n    # \u74b0\u5883\r\n    device = torch.device(&quot;cuda&quot; if torch.cuda.is_available() else &quot;cpu&quot;)\r\n    model = Net()\r\n    trainer = Trainer(model, device)\r\n    # \u5b9f\u884c\r\n    trainer.load(prmfile)\r\n    acc, images, probs, labels = trainer.test(test_loader)\r\n    # \u7d50\u679c\u8868\u793a\r\n    if visualize:\r\n        #visualize_results(images, probs, labels)\r\n        output_results_image(images, probs, labels)\r\n\r\n#\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\ndef main():\r\n    parser = argparse.ArgumentParser(description=&quot;Load and test trained model.&quot;)\r\n    parser.add_argument(&#039;-p&#039;, type=str, required=True, help=&#039;Filename of trained model to load&#039;)\r\n    parser.add_argument(&#039;-v&#039;, action=&#039;store_true&#039;, help=&#039;Visualize test result samples&#039;)\r\n    args = parser.parse_args()\r\n    execTest(prmfile=args.p, visualize=args.v)\r\n\r\n#\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\nif __name__ == &quot;__main__&quot;:\r\n    main()\r\n<\/pre>\n<h2 class=\"my_h\">2) \u30d7\u30ed\u30b0\u30e9\u30e0\u5b9f\u884c<\/h2>\n<p>\u8a13\u7df4\u5b9f\u884c\u306f control_train.py \u3092\u52d5\u304b\u305b\u3070\u3088\u3044\u3002<br \/>\n<span class=\"my_fc_deeppinkB\">-p<\/span> \u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u6307\u5b9a\u3059\u308c\u3070\u3001\u4efb\u610f\u306e\u5b66\u7fd2\u6e08\u307f\u30d1\u30e9\u30e1\u30fc\u30bf\u30d5\u30a1\u30a4\u30eb\u540d\u306b\u3067\u304d\u308b\u3002<\/p>\n<pre class=\"my_pre_bgBlack\">\r\n$ <span class=\"my_fc_yellow\">python control_train.py -p myParam.pth<\/span>\r\n[1\/10] Epoch complete\r\n[2\/10] Epoch complete\r\n[3\/10] Epoch complete\r\n[4\/10] Epoch complete\r\n[5\/10] Epoch complete\r\n[6\/10] Epoch complete\r\n[7\/10] Epoch complete\r\n[8\/10] Epoch complete\r\n[9\/10] Epoch complete\r\n[10\/10] Epoch complete\r\nTest Accuracy: 91.83%\r\nModel saved to myParam.pth\r\n<\/pre>\n<p>\u4eca\u56de\u306f 10epochs \u3067\u6b63\u89e3\u7387 91.83% \u306e\u30e2\u30c7\u30eb\u304c\u51fa\u6765\u4e0a\u304c\u3063\u305f\u3002<br \/>\n\u3053\u306e\u5b66\u7fd2\u6e08\u307f\u30d1\u30e9\u30e1\u30fc\u30bf\u306f Python pickle \u3067\u30b7\u30ea\u30a2\u30e9\u30a4\u30ba\u3055\u308c\u305f\u30c7\u30fc\u30bf\u3068\u3057\u3066 myParam.pth \u306b\u683c\u7d0d\u3055\u308c\u3066\u3044\u308b\u3002<\/p>\n<p>\u7d9a\u3051\u3066\u3001\u51fa\u529b\u3055\u308c\u305f\u5b66\u7fd2\u6e08\u307f\u30d1\u30e9\u30e1\u30fc\u30bf\u30d5\u30a1\u30a4\u30eb\u3092\u6307\u5b9a\u3057\u3066\u30c6\u30b9\u30c8\u5b9f\u884c\u3059\u308b\u3002<br \/>\n\u5fc5\u305a <span class=\"my_fc_deeppinkB\">-p<\/span> \u30aa\u30d7\u30b7\u30e7\u30f3\u3067\u5b66\u7fd2\u6e08\u307f\u30d1\u30e9\u30e1\u30fc\u30bf\u30d5\u30a1\u30a4\u30eb\u3092\u6307\u5b9a\u3057\u306a\u3051\u308c\u3070\u306a\u3089\u306a\u3044\u3002<br \/>\n\u307e\u305f\u3001\u4e0d\u6b63\u89e3\u30ec\u30dd\u30fc\u30c8\u753b\u50cf\u3092\u51fa\u529b\u3055\u305b\u308b\u306b\u306f <span class=\"my_fc_deeppinkB\">-v<\/span> \u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u6307\u5b9a\u3059\u308b\u3002<\/p>\n<pre class=\"my_pre_bgBlack\">\r\n$ <span class=\"my_fc_yellow\">python control_test.py -v -p myParam.pth<\/span>\r\nModel loaded from myParam.pth\r\nTest Accuracy: 91.83%\r\n<\/pre>\n<p>\u30c6\u30b9\u30c8\u5b9f\u884c\u304c\u5b8c\u4e86\u3059\u308b\u3068\u3001\u672c\u8a18\u4e8b\u306e\u30bf\u30a4\u30c8\u30eb\u3067\u66f8\u3044\u305f\u901a\u308a\u3001\u4e0d\u6b63\u89e3\u3068\u5224\u5b9a\u3055\u308c\u305f\u753b\u50cf\u304c\u30ec\u30dd\u30fc\u30c8\u4ed8\u304d JPEG\u753b\u50cf\u30d5\u30a1\u30a4\u30eb\u3067\u51fa\u529b\u3055\u308c\u308b\u3002<br \/>\n\u4eca\u56de\u306e\u76ee\u7684\u306f\u3053\u306e\u753b\u50cf\u3092\u773a\u3081\u308b\u3053\u3068\u3060\u3002<\/p>\n<h2 class=\"my_h\">3) \u5b9f\u884c\u7d50\u679c<\/h2>\n<p>10epochs\u3067\u6b63\u89e3\u7387 91.83%\u306e\u30e2\u30c7\u30eb\u304c\u51fa\u6765\u4e0a\u304c\u3063\u305f\u3002<br \/>\n\u30c6\u30b9\u30c8\u753b\u50cf\u306e\u679a\u6570\u306f 10,000\u679a\u3082\u3042\u308b\u306e\u3067\u3001\u4e0d\u6b63\u89e3\u753b\u50cf\u3060\u3051\u3067 828\u679a\u3082\u3042\u308b\u3002<\/p>\n<p>\u3059\u3079\u3066\u3092\u8868\u793a\u3067\u304d\u306a\u3044\u306e\u3067\u3001\u30e9\u30f3\u30c0\u30e0\u3067\u672c\u8a18\u4e8b\u306b\u3044\u304f\u3064\u304b\u6dfb\u4ed8\u3059\u308b\u3002<br \/>\n\u3061\u306a\u307f\u306b\u3001Fashion-MNIST\u306e\u30e9\u30d9\u30eb\u306f\u5de6\u4e0b\u306b\u8a18\u3057\u305f\u901a\u308a\u3002<br \/>\n<span class=\"my_fc_red\">\u8d64\u8272\u6587\u5b57\u3001\u8d64\u8272\u30d0\u30fc<\/span> \u306f\u6b63\u89e3\u30e9\u30d9\u30eb\u3060\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.dogrow.net\/nnet\/wp-content\/uploads\/2025\/05\/i_00012.jpg\" alt=\"\" \/> <img decoding=\"async\" src=\"https:\/\/www.dogrow.net\/nnet\/wp-content\/uploads\/2025\/05\/i_00025.jpg\" alt=\"\" \/> <img decoding=\"async\" src=\"https:\/\/www.dogrow.net\/nnet\/wp-content\/uploads\/2025\/05\/i_00067.jpg\" alt=\"\" \/> <img decoding=\"async\" src=\"https:\/\/www.dogrow.net\/nnet\/wp-content\/uploads\/2025\/05\/i_00166.jpg\" alt=\"\" \/> <img decoding=\"async\" src=\"https:\/\/www.dogrow.net\/nnet\/wp-content\/uploads\/2025\/05\/i_00378.jpg\" alt=\"\" \/> <img decoding=\"async\" src=\"https:\/\/www.dogrow.net\/nnet\/wp-content\/uploads\/2025\/05\/i_00437.jpg\" alt=\"\" \/> <img decoding=\"async\" src=\"https:\/\/www.dogrow.net\/nnet\/wp-content\/uploads\/2025\/05\/i_00441.jpg\" alt=\"\" \/> <img decoding=\"async\" src=\"https:\/\/www.dogrow.net\/nnet\/wp-content\/uploads\/2025\/05\/i_00607.jpg\" alt=\"\" \/> <img decoding=\"async\" src=\"https:\/\/www.dogrow.net\/nnet\/wp-content\/uploads\/2025\/05\/i_01142.jpg\" alt=\"\" \/> <img decoding=\"async\" src=\"https:\/\/www.dogrow.net\/nnet\/wp-content\/uploads\/2025\/05\/i_01261.jpg\" alt=\"\" \/> <img decoding=\"async\" src=\"https:\/\/www.dogrow.net\/nnet\/wp-content\/uploads\/2025\/05\/i_02064.jpg\" alt=\"\" \/> <img decoding=\"async\" src=\"https:\/\/www.dogrow.net\/nnet\/wp-content\/uploads\/2025\/05\/i_02326.jpg\" alt=\"\" \/> <img decoding=\"async\" src=\"https:\/\/www.dogrow.net\/nnet\/wp-content\/uploads\/2025\/05\/i_02462.jpg\" alt=\"\" \/> <img decoding=\"async\" src=\"https:\/\/www.dogrow.net\/nnet\/wp-content\/uploads\/2025\/05\/i_02559.jpg\" alt=\"\" \/> <img decoding=\"async\" src=\"https:\/\/www.dogrow.net\/nnet\/wp-content\/uploads\/2025\/05\/i_03241.jpg\" alt=\"\" \/> <img decoding=\"async\" src=\"https:\/\/www.dogrow.net\/nnet\/wp-content\/uploads\/2025\/05\/i_03745.jpg\" alt=\"\" \/> <img decoding=\"async\" src=\"https:\/\/www.dogrow.net\/nnet\/wp-content\/uploads\/2025\/05\/i_03647.jpg\" alt=\"\" \/><\/p>\n<p>\u6b63\u76f4\u306a\u611f\u60f3\u306f\u30fb\u30fb\u30fb<br \/>\n<span class=\"my_fc_redBBig\">\u3053\u308c\u306f\u4eba\u304c\u76ee\u3067\u898b\u3066\u5224\u65ad\u3059\u308b\u306e\u3082\u96e3\u3057\u3044\u306a\u3041<\/span><br \/>\n\u3068\u601d\u3063\u305f\u3002<\/p>\n<p>\u4f4e\u89e3\u50cf\u5ea6\u3067\u30011\u30c1\u30e3\u30f3\u30cd\u30eb\u3067\u3001\u4f3c\u3066\u3044\u308b\u7269\u3070\u304b\u308a\u3067&#8230;<br \/>\n\u9006\u306b\u3088\u304f 91.8% \u3082\u6b63\u89e3\u3057\u305f\u306a\u3068\u9a5a\u304f\u3002<\/p>\n<div style=\"position: fixed; z-index: 9999;background-color:#fff;padding:1rem;border:0.3rem #000 solid;border-radius:0.5rem;box-shadow:2px 2px 2px rgba(0,0,0,0.5);left:2rem;bottom:2rem;\">0 &#8211; T-shirt\/top\tT\u30b7\u30e3\u30c4\uff0f\u30c8\u30c3\u30d7\u30b9<br \/>\n1 &#8211; Trouser\t\u30ba\u30dc\u30f3<br \/>\n2 &#8211; Pullover\t\u30d7\u30eb\u30aa\u30fc\u30d0\u30fc\uff08\u9577\u8896\uff09<br \/>\n3 &#8211; Dress\t\u30c9\u30ec\u30b9\uff08\u30ef\u30f3\u30d4\u30fc\u30b9\uff09<br \/>\n4 &#8211; Coat\t\u30b3\u30fc\u30c8<br \/>\n5 &#8211; Sandal\t\u30b5\u30f3\u30c0\u30eb<br \/>\n6 &#8211; Shirt\t\u30b7\u30e3\u30c4<br \/>\n7 &#8211; Sneaker\t\u30b9\u30cb\u30fc\u30ab\u30fc<br \/>\n8 &#8211; Bag\t\t\u30d0\u30c3\u30b0<br \/>\n9 &#8211; Ankle boot\t\u30a2\u30f3\u30af\u30eb\u30d6\u30fc\u30c4<br \/>\n<\/div>\n<hr class=\"my_hr_bottom\">\n","protected":false},"excerpt":{"rendered":"<p>\u30101\u3011\u3084\u308a\u305f\u3044\u3053\u3068 MNIST\u3068\u540c\u3058 28&#215;28\u30d4\u30af\u30bb\u30eb\u306e\u30b0\u30ec\u30fc\u30b9\u30b1\u30fc\u30eb\u753b\u50cf\u306e\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u304c\u3042\u308b\u3068\u306e\u3053\u3068\u3002 \u305d\u306e\u540d\u3082 Fashion-MNIST \u8863\u985e\u753b\u50cf 10\u7a2e\u985e\u3092\u6301\u3064\u753b\u50cf\u5206\u985e\u7528\u306e\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u3060\u3002 https\u2026 <span class=\"read-more\"><a href=\"https:\/\/www.dogrow.net\/nnet\/blog44%e3%80%90pytorch%e3%80%91fashion-mnist%e3%81%ae%e4%b8%8d%e6%ad%a3%e8%a7%a3%e7%94%bb%e5%83%8f%e3%82%92%e7%9c%ba%e3%82%81%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":[26,18,16,6],"tags":[],"class_list":["post-1401","post","type-post","status-publish","format-standard","hentry","category-fashion-mnist","category-mnist","category-pytorch","category-6"],"views":739,"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.dogrow.net\/nnet\/wp-json\/wp\/v2\/posts\/1401","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=1401"}],"version-history":[{"count":18,"href":"https:\/\/www.dogrow.net\/nnet\/wp-json\/wp\/v2\/posts\/1401\/revisions"}],"predecessor-version":[{"id":1983,"href":"https:\/\/www.dogrow.net\/nnet\/wp-json\/wp\/v2\/posts\/1401\/revisions\/1983"}],"wp:attachment":[{"href":"https:\/\/www.dogrow.net\/nnet\/wp-json\/wp\/v2\/media?parent=1401"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dogrow.net\/nnet\/wp-json\/wp\/v2\/categories?post=1401"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dogrow.net\/nnet\/wp-json\/wp\/v2\/tags?post=1401"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}