{"id":36479,"date":"2024-11-01T09:48:49","date_gmt":"2024-11-01T09:48:49","guid":{"rendered":"http:\/\/atmokpo.com\/w\/?p=36479"},"modified":"2024-11-01T11:53:01","modified_gmt":"2024-11-01T11:53:01","slug":"dive-into-deep-learning-with-pytorch-cgan","status":"publish","type":"post","link":"https:\/\/atmokpo.com\/w\/36479\/","title":{"rendered":"Dive into Deep Learning with PyTorch, cGAN"},"content":{"rendered":"<p><body><\/p>\n<h2>1. Introduction<\/h2>\n<p>\n        Deep learning is achieving innovative advancements in various fields such as computer vision, natural language processing, and speech recognition. Among these, Generative Adversarial Networks (GANs) have garnered special attention as a technology. GAN consists of two neural networks, namely a Generator and a Discriminator, which compete against each other, enabling it to generate realistic data.\n    <\/p>\n<p>\n        In this article, we will take a detailed look at one of the variants of GAN, the Conditional Generative Adversarial Network (cGAN). cGAN allows for the generation of images of specific classes by providing conditions during the generation process. For example, we will explore how to generate images of specific digits using the MNIST dataset.\n    <\/p>\n<h2>2. Overview of cGAN<\/h2>\n<h3>2.1 Basic Structure of GAN<\/h3>\n<p>\n        A GAN essentially consists of two neural networks. The Generator takes a random noise vector as input to generate fake images, while the Discriminator evaluates whether the input image is real or fake. They interact as follows:\n    <\/p>\n<ul>\n<li>The Generator creates images based on random noise input<\/li>\n<li>The generated images are sent to the Discriminator for comparison with real images<\/li>\n<li>The Discriminator classifies the real image as &#8216;1&#8217; and the fake image as &#8216;0&#8217;<\/li>\n<li>This process repeats, gradually causing the Generator to produce more realistic images<\/li>\n<\/ul>\n<h3>2.2 Structure of cGAN<\/h3>\n<p>\n        cGAN extends the concept of GAN by adding conditional information to both the Generator and the Discriminator, allowing the generation of images for specific classes. For example, when setting the condition to the digit &#8216;3&#8217; in digit image generation, the Generator will produce an image corresponding to &#8216;3&#8217;. The structure of cGAN is as follows:\n    <\/p>\n<ul>\n<li>The Generator takes conditional information as input to generate images<\/li>\n<li>The Discriminator accepts both the input image and the conditional information to determine real or fake<\/li>\n<\/ul>\n<h2>3. Basic Setup for Implementing cGAN in PyTorch<\/h2>\n<h3>3.1 Install Required Libraries<\/h3>\n<p>\n        We will install the necessary Python libraries to implement cGAN. We will primarily use PyTorch, NumPy, and Matplotlib libraries. They can be installed with the following command.\n    <\/p>\n<pre>\n        <code>\n        pip install torch torchvision numpy matplotlib\n        <\/code>\n    <\/pre>\n<h3>3.2 Prepare Dataset<\/h3>\n<p>\n        We will use the MNIST dataset to implement cGAN. MNIST is a dataset consisting of handwritten digit images from 0 to 9. This dataset can be loaded from PyTorch&#8217;s torchvision.\n    <\/p>\n<pre>\n        <code>\nimport torch\nfrom torchvision import datasets, transforms\n\n# Load dataset\ntransform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])\ntrain_dataset = datasets.MNIST(root='.\/data', train=True, download=True, transform=transform)\ntrain_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=64, shuffle=True)\n        <\/code>\n    <\/pre>\n<h2>4. Implementing cGAN Architecture<\/h2>\n<h3>4.1 Generator<\/h3>\n<p>\n        The Generator takes random noise and conditional information as input to create images. The Generator model is generally constructed using multiple linear layers and ReLU activation functions.\n    <\/p>\n<pre>\n        <code>\nimport torch.nn as nn\n\nclass Generator(nn.Module):\n    def __init__(self, z_dim, num_classes):\n        super(Generator, self).__init__()\n        self.label_embedding = nn.Embedding(num_classes, num_classes)\n        self.model = nn.Sequential(\n            nn.Linear(z_dim + num_classes, 128),\n            nn.ReLU(),\n            nn.Linear(128, 256),\n            nn.ReLU(),\n            nn.Linear(256, 512),\n            nn.ReLU(),\n            nn.Linear(512, 1 * 28 * 28),\n            nn.Tanh()\n        )\n\n    def forward(self, noise, labels):\n        label_input = self.label_embedding(labels)\n        input = torch.cat((noise, label_input), dim=1)\n        img = self.model(input)\n        img = img.view(img.size(0), 1, 28, 28)\n        return img\n        <\/code>\n    <\/pre>\n<h3>4.2 Discriminator<\/h3>\n<p>\n        The Discriminator accepts both the image and conditional information to evaluate whether they are real or fake. It can be designed in a structure that starts with a bottom layer and gradually deepens.\n    <\/p>\n<pre>\n        <code>\nclass Discriminator(nn.Module):\n    def __init__(self, num_classes):\n        super(Discriminator, self).__init__()\n        self.label_embedding = nn.Embedding(num_classes, num_classes)\n        self.model = nn.Sequential(\n            nn.Linear(1 * 28 * 28 + num_classes, 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, img, labels):\n        label_input = self.label_embedding(labels)\n        img_flat = img.view(img.size(0), -1)\n        input = torch.cat((img_flat, label_input), dim=1)\n        validity = self.model(input)\n        return validity\n        <\/code>\n    <\/pre>\n<h2>5. Loss Function and Optimization<\/h2>\n<p>\n        The loss function for cGAN evaluates the performance of the Generator and the Discriminator. It mainly uses binary cross-entropy loss, as the Generator and Discriminator have opposing objectives.\n    <\/p>\n<pre>\n        <code>\nimport torch.optim as optim\n\ndef build_optimizers(generator, discriminator, lr=0.0002, beta1=0.5):\n    g_optimizer = optim.Adam(generator.parameters(), lr=lr, betas=(beta1, 0.999))\n    d_optimizer = optim.Adam(discriminator.parameters(), lr=lr, betas=(beta1, 0.999))\n    return g_optimizer, d_optimizer\n        <\/code>\n    <\/pre>\n<h2>6. Training cGAN<\/h2>\n<p>\n        The Generator and Discriminator train by competing against each other. In each iteration, the Discriminator is adjusted to show high confidence on real images while maintaining low confidence for images generated by the Generator. Below is an example of the training loop.\n    <\/p>\n<pre>\n        <code>\nnum_classes = 10\nz_dim = 100\n\ngenerator = Generator(z_dim, num_classes)\ndiscriminator = Discriminator(num_classes)\n\ng_optimizer, d_optimizer = build_optimizers(generator, discriminator)\n\ncriterion = nn.BCELoss()\n\n# Training loop\nnum_epochs = 200\nfor epoch in range(num_epochs):\n    for imgs, labels in train_loader:\n        batch_size = imgs.size(0)\n\n        # Prepare real and fake image labels\n        real_labels = torch.ones(batch_size, 1)\n        fake_labels = torch.zeros(batch_size, 1)\n\n        # Train Discriminator\n        discriminator.zero_grad()\n        outputs = discriminator(imgs, labels)\n        d_loss_real = criterion(outputs, real_labels)\n        d_loss_real.backward()\n\n        noise = torch.randn(batch_size, z_dim)\n        random_labels = torch.randint(0, num_classes, (batch_size,))\n        generated_imgs = generator(noise, random_labels)\n\n        outputs = discriminator(generated_imgs, random_labels)\n        d_loss_fake = criterion(outputs, fake_labels)\n        d_loss_fake.backward()\n\n        d_optimizer.step()\n        d_loss = d_loss_real + d_loss_fake\n        \n        # Train Generator\n        generator.zero_grad()\n        noise = torch.randn(batch_size, z_dim)\n        generated_imgs = generator(noise, random_labels)\n        outputs = discriminator(generated_imgs, random_labels)\n        g_loss = criterion(outputs, real_labels)\n        g_loss.backward()\n        g_optimizer.step()\n\n        print(f'Epoch [{epoch}\/{num_epochs}], d_loss: {d_loss.item()}, g_loss: {g_loss.item()}')\n        <\/code>\n    <\/pre>\n<h2>7. Visualizing Results<\/h2>\n<p>\n        After training is complete, we can visualize the generated images. Using Matplotlib, we can generate and display images of specific classes.\n    <\/p>\n<pre>\n        <code>\nimport matplotlib.pyplot as plt\n\ndef generate_and_show_images(generator, num_images=10):\n    noise = torch.randn(num_images, z_dim)\n    labels = torch.randint(0, num_classes, (num_images,))\n    generated_images = generator(noise, labels)\n\n    for i in range(num_images):\n        img = generated_images[i].detach().numpy().reshape(28, 28)\n        plt.subplot(2, 5, i + 1)\n        plt.imshow(img, cmap='gray')\n        plt.axis('off')\n    plt.show()\n\ngenerate_and_show_images(generator)\n        <\/code>\n    <\/pre>\n<h2>8. Conclusion<\/h2>\n<p>\n        In this article, we explored the concept and implementation of Conditional Generative Adversarial Networks (cGAN). cGAN is a powerful method for generating images based on specific conditions and can be applied in various fields. It can be utilized not only for image generation but also in tasks like image transformation and style transfer. Having discussed in detail how to implement cGAN using PyTorch, we hope for the future development of more advanced models and diverse applications.\n    <\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"<p>1. Introduction Deep learning is achieving innovative advancements in various fields such as computer vision, natural language processing, and speech recognition. Among these, Generative Adversarial Networks (GANs) have garnered special attention as a technology. GAN consists of two neural networks, namely a Generator and a Discriminator, which compete against each other, enabling it to generate &hellip; <a href=\"https:\/\/atmokpo.com\/w\/36479\/\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;Dive into Deep Learning with PyTorch, cGAN&#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":[149],"tags":[],"class_list":["post-36479","post","type-post","status-publish","format-standard","hentry","category-pytorch-study"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Dive into Deep Learning with PyTorch, cGAN - \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\/36479\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Dive into Deep Learning with PyTorch, cGAN - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"og:description\" content=\"1. Introduction Deep learning is achieving innovative advancements in various fields such as computer vision, natural language processing, and speech recognition. Among these, Generative Adversarial Networks (GANs) have garnered special attention as a technology. GAN consists of two neural networks, namely a Generator and a Discriminator, which compete against each other, enabling it to generate &hellip; \ub354 \ubcf4\uae30 &quot;Dive into Deep Learning with PyTorch, cGAN&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/atmokpo.com\/w\/36479\/\" \/>\n<meta property=\"og:site_name\" content=\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"article:published_time\" content=\"2024-11-01T09:48:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-01T11:53:01+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\/36479\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/36479\/\"},\"author\":{\"name\":\"root\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\"},\"headline\":\"Dive into Deep Learning with PyTorch, cGAN\",\"datePublished\":\"2024-11-01T09:48:49+00:00\",\"dateModified\":\"2024-11-01T11:53:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/atmokpo.com\/w\/36479\/\"},\"wordCount\":599,\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"articleSection\":[\"PyTorch Study\"],\"inLanguage\":\"ko-KR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/atmokpo.com\/w\/36479\/\",\"url\":\"https:\/\/atmokpo.com\/w\/36479\/\",\"name\":\"Dive into Deep Learning with PyTorch, cGAN - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#website\"},\"datePublished\":\"2024-11-01T09:48:49+00:00\",\"dateModified\":\"2024-11-01T11:53:01+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/atmokpo.com\/w\/36479\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/atmokpo.com\/w\/36479\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/atmokpo.com\/w\/36479\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\ud648\",\"item\":\"https:\/\/atmokpo.com\/w\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Dive into Deep Learning with PyTorch, cGAN\"}]},{\"@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":"Dive into Deep Learning with PyTorch, cGAN - \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\/36479\/","og_locale":"ko_KR","og_type":"article","og_title":"Dive into Deep Learning with PyTorch, cGAN - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","og_description":"1. Introduction Deep learning is achieving innovative advancements in various fields such as computer vision, natural language processing, and speech recognition. Among these, Generative Adversarial Networks (GANs) have garnered special attention as a technology. GAN consists of two neural networks, namely a Generator and a Discriminator, which compete against each other, enabling it to generate &hellip; \ub354 \ubcf4\uae30 \"Dive into Deep Learning with PyTorch, cGAN\"","og_url":"https:\/\/atmokpo.com\/w\/36479\/","og_site_name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","article_published_time":"2024-11-01T09:48:49+00:00","article_modified_time":"2024-11-01T11:53:01+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\/36479\/#article","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/36479\/"},"author":{"name":"root","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7"},"headline":"Dive into Deep Learning with PyTorch, cGAN","datePublished":"2024-11-01T09:48:49+00:00","dateModified":"2024-11-01T11:53:01+00:00","mainEntityOfPage":{"@id":"https:\/\/atmokpo.com\/w\/36479\/"},"wordCount":599,"publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"articleSection":["PyTorch Study"],"inLanguage":"ko-KR"},{"@type":"WebPage","@id":"https:\/\/atmokpo.com\/w\/36479\/","url":"https:\/\/atmokpo.com\/w\/36479\/","name":"Dive into Deep Learning with PyTorch, cGAN - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/#website"},"datePublished":"2024-11-01T09:48:49+00:00","dateModified":"2024-11-01T11:53:01+00:00","breadcrumb":{"@id":"https:\/\/atmokpo.com\/w\/36479\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/atmokpo.com\/w\/36479\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/atmokpo.com\/w\/36479\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\ud648","item":"https:\/\/atmokpo.com\/w\/en\/"},{"@type":"ListItem","position":2,"name":"Dive into Deep Learning with PyTorch, cGAN"}]},{"@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\/36479","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=36479"}],"version-history":[{"count":1,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/36479\/revisions"}],"predecessor-version":[{"id":36480,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/36479\/revisions\/36480"}],"wp:attachment":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/media?parent=36479"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/categories?post=36479"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/tags?post=36479"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}