{"id":36351,"date":"2024-11-01T09:47:45","date_gmt":"2024-11-01T09:47:45","guid":{"rendered":"http:\/\/atmokpo.com\/w\/?p=36351"},"modified":"2024-11-01T11:00:16","modified_gmt":"2024-11-01T11:00:16","slug":"deep-learning-with-pytorch-gan-wgan-wasserstein-gan","status":"publish","type":"post","link":"https:\/\/atmokpo.com\/w\/36351\/","title":{"rendered":"Deep Learning with PyTorch, GAN, WGAN &#8211; Wasserstein GAN"},"content":{"rendered":"<p><body><\/p>\n<p>With the advancement of deep learning, the use of Generative Adversarial Networks (GANs) is increasing in various fields such as image generation, reinforcement learning, image transformation, and image combination. GANs are used to generate high-resolution images through the competition between two networks: the Generator and the Discriminator. This article will cover the basic concepts of GANs, as well as the structure and operation of WGAN (Wasserstein GAN), along with example PyTorch code for implementation.<\/p>\n<h2>1. Basic Concept of GAN<\/h2>\n<p>GAN is a model proposed by Ian Goodfellow in 2014, composed of two neural networks: the Generator and the Discriminator. The Generator takes a random noise vector as input to generate data similar to real data, while the Discriminator determines whether the input data is real or generated. In this process, both neural networks learn in a competitive manner to generate increasingly perfect data.<\/p>\n<h3>1.1 Structure of GAN<\/h3>\n<ul>\n<li><strong>Generator (G)<\/strong>: A network that takes random noise as input to generate data.<\/li>\n<li><strong>Discriminator (D)<\/strong>: A network that distinguishes between real data and generated data.<\/li>\n<\/ul>\n<h3>1.2 Loss Function of GAN<\/h3>\n<p>The loss function of GAN is as follows:<\/p>\n<pre>\n    L(D) = -E[log(D(x))] - E[log(1 - D(G(z)))],\n    L(G) = -E[log(D(G(z)))]\n    <\/pre>\n<p>Here, <code>D(x)<\/code> is the probability that the Discriminator judges the real data as true, and <code>G(z)<\/code> is the data generated by the Generator.<\/p>\n<h2>2. WGAN &#8211; Wasserstein GAN<\/h2>\n<p>The traditional GAN had the problem of an unstable loss function for the Discriminator and instability in learning. WGAN addresses these issues by using Wasserstein Distance. Wasserstein distance (or Earth Mover&#8217;s Distance) is a method to measure the optimal transportation cost between two probability distributions.<\/p>\n<h3>2.1 Improvements of WGAN<\/h3>\n<ul>\n<li>WGAN uses a &#8216;Critic&#8217;, a non-linear regression model, instead of a Discriminator.<\/li>\n<li>The loss function of WGAN is as follows:\n<pre>\n            L(D) = E[D(x)] - E[D(G(z))],\n            L(G) = -E[D(G(z))]\n            <\/pre>\n<\/li>\n<li>WGAN guarantees the Lipschitz continuity of the Critic through Weight Clipping.<\/li>\n<li>It uses Gradient Penalty techniques to relax Lipschitz constraints.<\/li>\n<\/ul>\n<h3>2.2 Structure of WGAN<\/h3>\n<p>WGAN introduces a Critic into the basic structure of GAN, resulting in a modified form. The following is the network structure of WGAN:<\/p>\n<ul>\n<li>The previous Discriminator is replaced by the current Critic.<\/li>\n<\/ul>\n<h2>3. WGAN Implementation Using PyTorch<\/h2>\n<p>Now we will implement WGAN using PyTorch. This example will build a model to generate handwritten digits using the MNIST dataset.<\/p>\n<h3>3.1 Preparing the Dataset<\/h3>\n<p>First, we load and preprocess the dataset.<\/p>\n<pre><code>\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torchvision import datasets, transforms\nfrom torch.utils.data import DataLoader\n\n# Load and preprocess the dataset.\ntransform = transforms.Compose([\n    transforms.Resize(28),\n    transforms.ToTensor(),\n    transforms.Normalize((0.5,), (0.5,))\n])\n\ntrain_data = datasets.MNIST(root='.\/data', train=True, download=True, transform=transform)\ntrain_loader = DataLoader(train_data, batch_size=64, shuffle=True)\n    <\/code><\/pre>\n<h3>3.2 Defining the WGAN Model<\/h3>\n<p>Now it&#8217;s time to define the Generator and Critic models.<\/p>\n<pre><code>\n# Define Generator model\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, 784),\n            nn.Tanh()\n        )\n        \n    def forward(self, z):\n        return self.model(z).view(-1, 1, 28, 28)  # Reshape to 28x28 image\n\n# Define Critic model\nclass Critic(nn.Module):\n    def __init__(self):\n        super(Critic, self).__init__()\n        self.model = nn.Sequential(\n            nn.Linear(784, 512),\n            nn.LeakyReLU(0.2),\n            nn.Linear(512, 256),\n            nn.LeakyReLU(0.2),\n            nn.Linear(256, 1)\n        )\n    \n    def forward(self, img):\n        return self.model(img.view(-1, 784))  # Reshape to 784 dimensions\n    <\/code><\/pre>\n<h3>3.3 Training Process of WGAN<\/h3>\n<p>Now we define the training process for WGAN.<\/p>\n<pre><code>\ndef train_wgan(num_epochs):\n    generator = Generator()\n    critic = Critic()\n    \n    # Set optimizers\n    optimizer_G = optim.RMSprop(generator.parameters(), lr=0.00005)\n    optimizer_C = optim.RMSprop(critic.parameters(), lr=0.00005)\n\n    for epoch in range(num_epochs):\n        for i, (imgs, _) in enumerate(train_loader):\n            imgs = imgs.to(device)\n\n            # Critic's residual equations\n            optimizer_C.zero_grad()\n            z = torch.randn(imgs.size(0), 100).to(device)\n            fake_imgs = generator(z)\n            c_real = critic(imgs)\n            c_fake = critic(fake_imgs.detach())\n            c_loss = c_fake.mean() - c_real.mean()\n            c_loss.backward()\n            optimizer_C.step()\n\n            # Weight Clipping\n            for p in critic.parameters():\n                p.data.clamp_(-0.01, 0.01)\n\n            # Update Generator\n            if i % 5 == 0:\n                optimizer_G.zero_grad()\n                g_loss = -critic(fake_imgs).mean()\n                g_loss.backward()\n                optimizer_G.step()\n            \n        print(f'Epoch [{epoch}\/{num_epochs}], Loss C: {c_loss.item()}, Loss G: {g_loss.item()}')\n\n# Set GPU usage\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\ntrain_wgan(num_epochs=50)\n    <\/code><\/pre>\n<h3>3.4 Visualizing the Results<\/h3>\n<p>After training is complete, we visualize the generated images to check the results.<\/p>\n<pre><code>\nimport matplotlib.pyplot as plt\n\ndef show_generated_images(num_images):\n    z = torch.randn(num_images, 100).to(device)\n    generated_imgs = generator(z).cpu().detach()\n    \n    fig, axes = plt.subplots(1, num_images, figsize=(15, 15))\n    for i in range(num_images):\n        axes[i].imshow(generated_imgs[i][0], cmap='gray')\n        axes[i].axis('off')\n    plt.show()\n\n# Visualize the results\nshow_generated_images(5)\n    <\/code><\/pre>\n<h2>4. Conclusion<\/h2>\n<p>WGAN provides a more stable training process by utilizing Wasserstein Distance to overcome the issues of traditional GANs. This article introduced the method of implementing WGAN using PyTorch, hoping to enhance the understanding of generative adversarial networks. GANs and their variant models are powerful tools that can yield innovative results in various fields beyond image generation.<\/p>\n<h2>5. References<\/h2>\n<ul>\n<li>Ian J. Goodfellow et al., &#8220;Generative Adversarial Nets&#8221;, 2014.<\/li>\n<li>Martin Arjovsky et al., &#8220;Wasserstein Generative Adversarial Networks&#8221;, 2017.<\/li>\n<li>PyTorch Documentation: <a href=\"https:\/\/pytorch.org\/docs\/stable\/index.html\">https:\/\/pytorch.org\/docs\/stable\/index.html<\/a><\/li>\n<\/ul>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"<p>With the advancement of deep learning, the use of Generative Adversarial Networks (GANs) is increasing in various fields such as image generation, reinforcement learning, image transformation, and image combination. GANs are used to generate high-resolution images through the competition between two networks: the Generator and the Discriminator. This article will cover the basic concepts of &hellip; <a href=\"https:\/\/atmokpo.com\/w\/36351\/\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;Deep Learning with PyTorch, GAN, WGAN &#8211; Wasserstein GAN&#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-36351","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 with PyTorch, GAN, WGAN - Wasserstein GAN - \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\/36351\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Deep Learning with PyTorch, GAN, WGAN - Wasserstein GAN - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"og:description\" content=\"With the advancement of deep learning, the use of Generative Adversarial Networks (GANs) is increasing in various fields such as image generation, reinforcement learning, image transformation, and image combination. GANs are used to generate high-resolution images through the competition between two networks: the Generator and the Discriminator. This article will cover the basic concepts of &hellip; \ub354 \ubcf4\uae30 &quot;Deep Learning with PyTorch, GAN, WGAN &#8211; Wasserstein GAN&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/atmokpo.com\/w\/36351\/\" \/>\n<meta property=\"og:site_name\" content=\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"article:published_time\" content=\"2024-11-01T09:47:45+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-01T11:00:16+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=\"4\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/atmokpo.com\/w\/36351\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/36351\/\"},\"author\":{\"name\":\"root\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\"},\"headline\":\"Deep Learning with PyTorch, GAN, WGAN &#8211; Wasserstein GAN\",\"datePublished\":\"2024-11-01T09:47:45+00:00\",\"dateModified\":\"2024-11-01T11:00:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/atmokpo.com\/w\/36351\/\"},\"wordCount\":500,\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"articleSection\":[\"GAN deep learning course\"],\"inLanguage\":\"ko-KR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/atmokpo.com\/w\/36351\/\",\"url\":\"https:\/\/atmokpo.com\/w\/36351\/\",\"name\":\"Deep Learning with PyTorch, GAN, WGAN - Wasserstein GAN - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#website\"},\"datePublished\":\"2024-11-01T09:47:45+00:00\",\"dateModified\":\"2024-11-01T11:00:16+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/atmokpo.com\/w\/36351\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/atmokpo.com\/w\/36351\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/atmokpo.com\/w\/36351\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\ud648\",\"item\":\"https:\/\/atmokpo.com\/w\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Deep Learning with PyTorch, GAN, WGAN &#8211; Wasserstein GAN\"}]},{\"@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 with PyTorch, GAN, WGAN - Wasserstein GAN - \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\/36351\/","og_locale":"ko_KR","og_type":"article","og_title":"Deep Learning with PyTorch, GAN, WGAN - Wasserstein GAN - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","og_description":"With the advancement of deep learning, the use of Generative Adversarial Networks (GANs) is increasing in various fields such as image generation, reinforcement learning, image transformation, and image combination. GANs are used to generate high-resolution images through the competition between two networks: the Generator and the Discriminator. This article will cover the basic concepts of &hellip; \ub354 \ubcf4\uae30 \"Deep Learning with PyTorch, GAN, WGAN &#8211; Wasserstein GAN\"","og_url":"https:\/\/atmokpo.com\/w\/36351\/","og_site_name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","article_published_time":"2024-11-01T09:47:45+00:00","article_modified_time":"2024-11-01T11:00:16+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":"4\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/atmokpo.com\/w\/36351\/#article","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/36351\/"},"author":{"name":"root","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7"},"headline":"Deep Learning with PyTorch, GAN, WGAN &#8211; Wasserstein GAN","datePublished":"2024-11-01T09:47:45+00:00","dateModified":"2024-11-01T11:00:16+00:00","mainEntityOfPage":{"@id":"https:\/\/atmokpo.com\/w\/36351\/"},"wordCount":500,"publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"articleSection":["GAN deep learning course"],"inLanguage":"ko-KR"},{"@type":"WebPage","@id":"https:\/\/atmokpo.com\/w\/36351\/","url":"https:\/\/atmokpo.com\/w\/36351\/","name":"Deep Learning with PyTorch, GAN, WGAN - Wasserstein GAN - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/#website"},"datePublished":"2024-11-01T09:47:45+00:00","dateModified":"2024-11-01T11:00:16+00:00","breadcrumb":{"@id":"https:\/\/atmokpo.com\/w\/36351\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/atmokpo.com\/w\/36351\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/atmokpo.com\/w\/36351\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\ud648","item":"https:\/\/atmokpo.com\/w\/en\/"},{"@type":"ListItem","position":2,"name":"Deep Learning with PyTorch, GAN, WGAN &#8211; Wasserstein GAN"}]},{"@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\/36351","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=36351"}],"version-history":[{"count":1,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/36351\/revisions"}],"predecessor-version":[{"id":36352,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/36351\/revisions\/36352"}],"wp:attachment":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/media?parent=36351"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/categories?post=36351"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/tags?post=36351"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}