{"id":36407,"date":"2024-11-01T09:48:15","date_gmt":"2024-11-01T09:48:15","guid":{"rendered":"http:\/\/atmokpo.com\/w\/?p=36407"},"modified":"2024-11-01T11:00:02","modified_gmt":"2024-11-01T11:00:02","slug":"deep-learning-gan-training-with-pytorch-controller-training","status":"publish","type":"post","link":"https:\/\/atmokpo.com\/w\/36407\/","title":{"rendered":"Deep Learning GAN Training with PyTorch, Controller Training"},"content":{"rendered":"<p><body><\/p>\n<p>Hello! In this post, we will implement GAN (Generative Adversarial Networks) using PyTorch and explore the training of a controller in detail. GAN consists of two neural networks, the Generator and the Discriminator, that compete against each other to generate realistic data.<\/p>\n<h2>1. Basic Structure of GAN<\/h2>\n<p>The basic structure of GAN is as follows:<\/p>\n<ul>\n<li><strong>Generator<\/strong>: Takes random noise as input and generates fake data.<\/li>\n<li><strong>Discriminator<\/strong>: Classifies input data into real and fake data.<\/li>\n<\/ul>\n<p>The two networks are trained through competition, resulting in the generator creating increasingly realistic data and the discriminator making more accurate classifications.<\/p>\n<h2>2. Training Process of GAN<\/h2>\n<p>The training process of GAN progresses through the following steps:<\/p>\n<ol>\n<li>Generate fake data by inputting a random noise vector into the generator.<\/li>\n<li>Input the fake data and real data into the discriminator to compute real\/fake probabilities.<\/li>\n<li>Train the discriminator based on the loss of the discriminator.<\/li>\n<li>Train the generator based on the loss of the generator.<\/li>\n<li>Repeat steps 1 to 4.<\/li>\n<\/ol>\n<h2>3. Implementing GAN with PyTorch<\/h2>\n<p>Now let&#8217;s implement GAN using PyTorch. Below is an example of the implementation of the basic GAN structure.<\/p>\n<h3>Installing PyTorch<\/h3>\n<p>First, we need to install PyTorch. It can be installed in an environment where Python is installed with the following command:<\/p>\n<pre><code>pip install torch torchvision<\/code><\/pre>\n<h3>Defining the Model<\/h3>\n<p>First, we will define the generator and the discriminator.<\/p>\n<pre><code>\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\n\n# Generator\nclass Generator(nn.Module):\n    def __init__(self):\n        super(Generator, self).__init__()\n        self.model = nn.Sequential(\n            nn.Linear(100, 256),\n            nn.ReLU(),\n            nn.Linear(256, 512),\n            nn.ReLU(),\n            nn.Linear(512, 1024),\n            nn.ReLU(),\n            nn.Linear(1024, 28 * 28),\n            nn.Tanh()\n        )\n\n    def forward(self, x):\n        return self.model(x).view(-1, 1, 28, 28)\n\n# Discriminator\nclass Discriminator(nn.Module):\n    def __init__(self):\n        super(Discriminator, self).__init__()\n        self.model = nn.Sequential(\n            nn.Flatten(),\n            nn.Linear(28 * 28, 512),\n            nn.LeakyReLU(0.2),\n            nn.Linear(512, 256),\n            nn.LeakyReLU(0.2),\n            nn.Linear(256, 1),\n            nn.Sigmoid()\n        )\n\n    def forward(self, x):\n        return self.model(x)\n<\/code><\/pre>\n<h3>Defining the Training Function<\/h3>\n<p>A function to define the training process is also needed:<\/p>\n<pre><code>\ndef train_gan(generator, discriminator, data_loader, num_epochs=100, learning_rate=0.0002):\n    criterion = nn.BCELoss()\n    optimizer_g = optim.Adam(generator.parameters(), lr=learning_rate)\n    optimizer_d = optim.Adam(discriminator.parameters(), lr=learning_rate)\n\n    for epoch in range(num_epochs):\n        for real_data, _ in data_loader:\n            batch_size = real_data.size(0)\n            real_labels = torch.ones(batch_size, 1)\n            fake_labels = torch.zeros(batch_size, 1)\n\n            # Training Discriminator\n            optimizer_d.zero_grad()\n            outputs = discriminator(real_data)\n            d_loss_real = criterion(outputs, real_labels)\n            d_loss_real.backward()\n\n            noise = torch.randn(batch_size, 100)\n            fake_data = generator(noise)\n            outputs = discriminator(fake_data.detach())\n            d_loss_fake = criterion(outputs, fake_labels)\n            d_loss_fake.backward()\n\n            optimizer_d.step()\n\n            # Training Generator\n            optimizer_g.zero_grad()\n            outputs = discriminator(fake_data)\n            g_loss = criterion(outputs, real_labels)\n            g_loss.backward()\n\n            optimizer_g.step()\n\n        print(f'Epoch [{epoch}\/{num_epochs}], d_loss: {d_loss_real.item() + d_loss_fake.item()}, g_loss: {g_loss.item()}')\n<\/code><\/pre>\n<h3>Preparing the Dataset<\/h3>\n<p>We will use the MNIST dataset. Let&#8217;s write the code to load the data.<\/p>\n<pre><code>\nfrom torchvision import datasets, transforms\nfrom torch.utils.data import DataLoader\n\ntransform = transforms.Compose([\n    transforms.ToTensor(),\n    transforms.Normalize((0.5,), (0.5,))\n])\n\ndataset = datasets.MNIST(root='.\/data', train=True, download=True, transform=transform)\ndata_loader = DataLoader(dataset, batch_size=64, shuffle=True)\n<\/code><\/pre>\n<h2>4. Training the GAN<\/h2>\n<p>Now that the model and data loader are ready, let&#8217;s train the GAN.<\/p>\n<pre><code>\ngenerator = Generator()\ndiscriminator = Discriminator()\n\ntrain_gan(generator, discriminator, data_loader, num_epochs=50)\n<\/code><\/pre>\n<h2>5. Visualizing Results<\/h2>\n<p>After training is complete, let&#8217;s visualize the generated images.<\/p>\n<pre><code>\nimport matplotlib.pyplot as plt\n\ndef show_generated_images(generator, num_images=25):\n    noise = torch.randn(num_images, 100)\n    generated_images = generator(noise).detach().cpu().numpy()\n    \n    plt.figure(figsize=(5, 5))\n    for i in range(num_images):\n        plt.subplot(5, 5, i + 1)\n        plt.imshow(generated_images[i][0], cmap='gray')\n        plt.axis('off')\n    plt.show()\n\nshow_generated_images(generator)\n<\/code><\/pre>\n<h2>6. Training the Controller<\/h2>\n<p>Now we will proceed with the training of the controller using GAN. Controller training is the process of learning the optimal actions to achieve specific goals in a given environment. Here, we will explore how this process can be carried out using GAN.<\/p>\n<p>The use of GAN in controller training is an interesting approach. The generator of GAN plays a role in generating actions for various scenarios, while the discriminator evaluates how well these actions meet the goals.<\/p>\n<p>Below is an example code to train a simple controller using GAN.<\/p>\n<pre><code>\n# Define the controller network\nclass Controller(nn.Module):\n    def __init__(self):\n        super(Controller, self).__init__()\n        self.model = nn.Sequential(\n            nn.Linear(100, 256),\n            nn.ReLU(),\n            nn.Linear(256, 3)  # For example, the dimension of actions (3D actions)\n        )\n\n    def forward(self, x):\n        return self.model(x)\n\n# Define the training process\ndef train_controller(gan, controller, num_epochs=100):\n    optimizer_c = optim.Adam(controller.parameters(), lr=0.001)\n\n    for epoch in range(num_epochs):\n        noise = torch.randn(64, 100)\n        actions = controller(noise)\n        \n        # Generate actions using GAN's generator\n        generated_data = gan.generator(noise)\n        \n        # Evaluate actions and compute loss\n        loss = calculate_loss(generated_data, actions)  # Loss function needs to be user-defined\n        optimizer_c.zero_grad()\n        loss.backward()\n        optimizer_c.step()\n\n        if epoch % 10 == 0:\n            print(f'Epoch [{epoch}\/{num_epochs}], Controller Loss: {loss.item()}')\n\n# Start training the controller\ncontroller = Controller()\ntrain_controller(generator, controller)\n<\/code><\/pre>\n<h2>7. Conclusion<\/h2>\n<p>In this post, we explored the process of implementing GAN with PyTorch and training a simple controller based on it. GAN is highly useful for generating data similar to real data and has various potential applications. We have shown that the scope of GAN can be extended through controller training.<\/p>\n<p>Furthermore, GAN can be utilized in various fields beyond image generation, including text and video generation, so consider using this concept to challenge yourself with your own projects!<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hello! In this post, we will implement GAN (Generative Adversarial Networks) using PyTorch and explore the training of a controller in detail. GAN consists of two neural networks, the Generator and the Discriminator, that compete against each other to generate realistic data. 1. Basic Structure of GAN The basic structure of GAN is as follows: &hellip; <a href=\"https:\/\/atmokpo.com\/w\/36407\/\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;Deep Learning GAN Training with PyTorch, Controller Training&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[113],"tags":[],"class_list":["post-36407","post","type-post","status-publish","format-standard","hentry","category-gan-deep-learning-course"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Deep Learning GAN Training with PyTorch, Controller Training - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/atmokpo.com\/w\/36407\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Deep Learning GAN Training with PyTorch, Controller Training - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"og:description\" content=\"Hello! In this post, we will implement GAN (Generative Adversarial Networks) using PyTorch and explore the training of a controller in detail. GAN consists of two neural networks, the Generator and the Discriminator, that compete against each other to generate realistic data. 1. Basic Structure of GAN The basic structure of GAN is as follows: &hellip; \ub354 \ubcf4\uae30 &quot;Deep Learning GAN Training with PyTorch, Controller Training&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/atmokpo.com\/w\/36407\/\" \/>\n<meta property=\"og:site_name\" content=\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"article:published_time\" content=\"2024-11-01T09:48:15+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-01T11:00:02+00:00\" \/>\n<meta name=\"author\" content=\"root\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@bebubo4\" \/>\n<meta name=\"twitter:site\" content=\"@bebubo4\" \/>\n<meta name=\"twitter:label1\" content=\"\uae00\uc4f4\uc774\" \/>\n\t<meta name=\"twitter:data1\" content=\"root\" \/>\n\t<meta name=\"twitter:label2\" content=\"\uc608\uc0c1 \ub418\ub294 \ud310\ub3c5 \uc2dc\uac04\" \/>\n\t<meta name=\"twitter:data2\" content=\"5\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/atmokpo.com\/w\/36407\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/36407\/\"},\"author\":{\"name\":\"root\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\"},\"headline\":\"Deep Learning GAN Training with PyTorch, Controller Training\",\"datePublished\":\"2024-11-01T09:48:15+00:00\",\"dateModified\":\"2024-11-01T11:00:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/atmokpo.com\/w\/36407\/\"},\"wordCount\":458,\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"articleSection\":[\"GAN deep learning course\"],\"inLanguage\":\"ko-KR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/atmokpo.com\/w\/36407\/\",\"url\":\"https:\/\/atmokpo.com\/w\/36407\/\",\"name\":\"Deep Learning GAN Training with PyTorch, Controller Training - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#website\"},\"datePublished\":\"2024-11-01T09:48:15+00:00\",\"dateModified\":\"2024-11-01T11:00:02+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/atmokpo.com\/w\/36407\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/atmokpo.com\/w\/36407\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/atmokpo.com\/w\/36407\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\ud648\",\"item\":\"https:\/\/atmokpo.com\/w\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Deep Learning GAN Training with PyTorch, Controller Training\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/atmokpo.com\/w\/#website\",\"url\":\"https:\/\/atmokpo.com\/w\/\",\"name\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/atmokpo.com\/w\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\",\"name\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"url\":\"https:\/\/atmokpo.com\/w\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png\",\"contentUrl\":\"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png\",\"width\":400,\"height\":400,\"caption\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\"},\"image\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/bebubo4\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\",\"name\":\"root\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g\",\"caption\":\"root\"},\"sameAs\":[\"http:\/\/atmokpo.com\/w\"],\"url\":\"https:\/\/atmokpo.com\/w\/author\/root\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Deep Learning GAN Training with PyTorch, Controller Training - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/atmokpo.com\/w\/36407\/","og_locale":"ko_KR","og_type":"article","og_title":"Deep Learning GAN Training with PyTorch, Controller Training - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","og_description":"Hello! In this post, we will implement GAN (Generative Adversarial Networks) using PyTorch and explore the training of a controller in detail. GAN consists of two neural networks, the Generator and the Discriminator, that compete against each other to generate realistic data. 1. Basic Structure of GAN The basic structure of GAN is as follows: &hellip; \ub354 \ubcf4\uae30 \"Deep Learning GAN Training with PyTorch, Controller Training\"","og_url":"https:\/\/atmokpo.com\/w\/36407\/","og_site_name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","article_published_time":"2024-11-01T09:48:15+00:00","article_modified_time":"2024-11-01T11:00:02+00:00","author":"root","twitter_card":"summary_large_image","twitter_creator":"@bebubo4","twitter_site":"@bebubo4","twitter_misc":{"\uae00\uc4f4\uc774":"root","\uc608\uc0c1 \ub418\ub294 \ud310\ub3c5 \uc2dc\uac04":"5\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/atmokpo.com\/w\/36407\/#article","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/36407\/"},"author":{"name":"root","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7"},"headline":"Deep Learning GAN Training with PyTorch, Controller Training","datePublished":"2024-11-01T09:48:15+00:00","dateModified":"2024-11-01T11:00:02+00:00","mainEntityOfPage":{"@id":"https:\/\/atmokpo.com\/w\/36407\/"},"wordCount":458,"publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"articleSection":["GAN deep learning course"],"inLanguage":"ko-KR"},{"@type":"WebPage","@id":"https:\/\/atmokpo.com\/w\/36407\/","url":"https:\/\/atmokpo.com\/w\/36407\/","name":"Deep Learning GAN Training with PyTorch, Controller Training - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/#website"},"datePublished":"2024-11-01T09:48:15+00:00","dateModified":"2024-11-01T11:00:02+00:00","breadcrumb":{"@id":"https:\/\/atmokpo.com\/w\/36407\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/atmokpo.com\/w\/36407\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/atmokpo.com\/w\/36407\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\ud648","item":"https:\/\/atmokpo.com\/w\/en\/"},{"@type":"ListItem","position":2,"name":"Deep Learning GAN Training with PyTorch, Controller Training"}]},{"@type":"WebSite","@id":"https:\/\/atmokpo.com\/w\/#website","url":"https:\/\/atmokpo.com\/w\/","name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","description":"","publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/atmokpo.com\/w\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ko-KR"},{"@type":"Organization","@id":"https:\/\/atmokpo.com\/w\/#organization","name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","url":"https:\/\/atmokpo.com\/w\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/","url":"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png","contentUrl":"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png","width":400,"height":400,"caption":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8"},"image":{"@id":"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/bebubo4"]},{"@type":"Person","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7","name":"root","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g","caption":"root"},"sameAs":["http:\/\/atmokpo.com\/w"],"url":"https:\/\/atmokpo.com\/w\/author\/root\/"}]}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/36407","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/comments?post=36407"}],"version-history":[{"count":1,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/36407\/revisions"}],"predecessor-version":[{"id":36408,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/36407\/revisions\/36408"}],"wp:attachment":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/media?parent=36407"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/categories?post=36407"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/tags?post=36407"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}