{"id":36399,"date":"2024-11-01T09:48:11","date_gmt":"2024-11-01T09:48:11","guid":{"rendered":"http:\/\/atmokpo.com\/w\/?p=36399"},"modified":"2024-11-01T11:00:04","modified_gmt":"2024-11-01T11:00:04","slug":"deep-learning-with-gan-using-pytorch-first-musegan","status":"publish","type":"post","link":"https:\/\/atmokpo.com\/w\/36399\/","title":{"rendered":"Deep Learning with GAN using PyTorch, First MuseGAN"},"content":{"rendered":"<p><body><\/p>\n<p>Generative Adversarial Networks (GANs) are models in which two neural networks compete and learn from each other. The goal of a GAN is to learn the data distribution and generate new data. Recently, various applications utilizing GANs have emerged, among which MuseGAN has garnered attention in the field of music generation. In this article, we will explain the concept, structure, and implementation process of MuseGAN using PyTorch in detail.<\/p>\n<h2>1. Overview of MuseGAN<\/h2>\n<p>MuseGAN is a GAN specialized for music generation, designed particularly for multi-layered music synthesis. MuseGAN supports the simultaneous generation of various instruments and notes, including the following key elements:<\/p>\n<ul>\n<li><strong>Conditional Generation:<\/strong> Music can be generated by setting various conditions. For example, music can be generated to match a specific style or tempo.<\/li>\n<li><strong>Multi-Instrument Support:<\/strong> MuseGAN can generate music for multiple instruments simultaneously, where each instrument refers to the outputs of others to create more natural music.<\/li>\n<\/ul>\n<h2>2. Basic Theory of GAN<\/h2>\n<p>GAN consists of the following two components:<\/p>\n<ul>\n<li><strong>Generator:<\/strong> A neural network that generates data from given random noise.<\/li>\n<li><strong>Discriminator:<\/strong> A neural network that distinguishes between real data and generated data (fake data).<\/li>\n<\/ul>\n<p>These two networks compete with each other and improve over time. The generator continuously generates more sophisticated data to fool the discriminator, while the discriminator becomes better at distinguishing between real and fake data based on improved criteria.<\/p>\n<h3>2.1. Training Process of GAN<\/h3>\n<p>The training process of GAN proceeds as follows:<\/p>\n<ol>\n<li>Sample data from the dataset.<\/li>\n<li>The generator receives random noise as input and generates fake data.<\/li>\n<li>The discriminator takes the real data and generated data, determining whether each data point is real or fake.<\/li>\n<li>Optimize the weights of the discriminator and the generator based on their respective losses.<\/li>\n<\/ol>\n<p>This process is repeated, and both networks gradually improve.<\/p>\n<h2>3. Structure of MuseGAN<\/h2>\n<p>MuseGAN has the following components for music generation:<\/p>\n<ul>\n<li><strong>Generator:<\/strong> Generates the base of the music (rhythm, melody, etc.).<\/li>\n<li><strong>Discriminator:<\/strong> Determines whether the generated music is real music.<\/li>\n<li><strong>Conditional Input:<\/strong> Provides information such as style and tempo that influences music generation.<\/li>\n<\/ul>\n<h3>3.1. Network Design of MuseGAN<\/h3>\n<p>The generator and discriminator of MuseGAN are typically designed based on ResNet or CNN architectures. This structure is suitable for music generation tasks requiring deeper and more complex networks.<\/p>\n<h2>4. Implementing MuseGAN with PyTorch<\/h2>\n<p>Now, let&#8217;s implement MuseGAN using PyTorch. First, we will set up the Python environment required for MuseGAN.<\/p>\n<h3>4.1. Environment Setup<\/h3>\n<pre><code>pip install torch torchvision torchaudio numpy matplotlib<\/code><\/pre>\n<h3>4.2. Setting Up the Basic Dataset<\/h3>\n<p>We will set up the dataset to be used with MuseGAN. Here, we plan to use MIDI files. To process MIDI data with Python, we will install the <code>mido<\/code> library.<\/p>\n<pre><code>pip install mido<\/code><\/pre>\n<h3>4.3. Data Loading<\/h3>\n<p>Now we will set up a function to load and preprocess MIDI data. Here, we will load MIDI files and extract each note.<\/p>\n<pre><code>import mido\nimport numpy as np\n\ndef load_midi(file_path):\n    mid = mido.MidiFile(file_path)\n    notes = []\n    for message in mid.play():\n        if message.type == 'note_on':\n            notes.append(message.note)\n    return np.array(notes)\n<\/code><\/pre>\n<h3>4.4. Defining the Generator<\/h3>\n<p>Let&#8217;s define the generator now. The generator takes random noise as input to generate music.<\/p>\n<pre><code>import torch\nimport torch.nn as nn\n\nclass Generator(nn.Module):\n    def __init__(self):\n        super(Generator, self).__init__()\n        self.layer1 = nn.Linear(100, 256)\n        self.layer2 = nn.Linear(256, 512)\n        self.layer3 = nn.Linear(512, 1024)\n        self.layer4 = nn.Linear(1024, 88)  # 88 is the number of piano keys\n\n    def forward(self, z):\n        z = torch.relu(self.layer1(z))\n        z = torch.relu(self.layer2(z))\n        z = torch.relu(self.layer3(z))\n        return torch.tanh(self.layer4(z))  # Returns values between -1 and 1\n<\/code><\/pre>\n<h3>4.5. Defining the Discriminator<\/h3>\n<p>Let&#8217;s also define the discriminator. The discriminator distinguishes whether the input music signal is real or generated.<\/p>\n<pre><code>class Discriminator(nn.Module):\n    def __init__(self):\n        super(Discriminator, self).__init__()\n        self.layer1 = nn.Linear(88, 1024)  # 88 is the number of piano keys\n        self.layer2 = nn.Linear(1024, 512)\n        self.layer3 = nn.Linear(512, 256)\n        self.layer4 = nn.Linear(256, 1)  # Binary classification\n\n    def forward(self, x):\n        x = torch.relu(self.layer1(x))\n        x = torch.relu(self.layer2(x))\n        x = torch.relu(self.layer3(x))\n        return torch.sigmoid(self.layer4(x))  # Returns probability between 0 and 1\n<\/code><\/pre>\n<h3>4.6. GAN Training Loop<\/h3>\n<p>Now, I will write the main loop to train the GAN. Here, the generator and discriminator train alternately.<\/p>\n<pre><code>def train_gan(generator, discriminator, data_loader, num_epochs=100):\n    criterion = nn.BCELoss()\n    optimizer_g = torch.optim.Adam(generator.parameters(), lr=0.0002)\n    optimizer_d = torch.optim.Adam(discriminator.parameters(), lr=0.0002)\n\n    for epoch in range(num_epochs):\n        for real_data in data_loader:\n            batch_size = real_data.size(0)\n\n            # Generate labels for real and fake data\n            real_labels = torch.ones(batch_size, 1)\n            fake_labels = torch.zeros(batch_size, 1)\n\n            # Train 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            z = torch.randn(batch_size, 100)\n            fake_data = generator(z)\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            # Train generator\n            optimizer_g.zero_grad()\n            outputs = discriminator(fake_data)\n            g_loss = criterion(outputs, real_labels)\n            g_loss.backward()\n            optimizer_g.step()\n\n        print(f'Epoch [{epoch+1}\/{num_epochs}], d_loss: {d_loss_real.item() + d_loss_fake.item()}, g_loss: {g_loss.item()}')\n<\/code><\/pre>\n<h2>5. Saving and Loading PyTorch Models<\/h2>\n<p>After training is complete, the model can be saved and reused later.<\/p>\n<pre><code># Save the model\ntorch.save(generator.state_dict(), 'generator.pth')\ntorch.save(discriminator.state_dict(), 'discriminator.pth')\n\n# Load the model\ngenerator.load_state_dict(torch.load('generator.pth'))\ndiscriminator.load_state_dict(torch.load('discriminator.pth'))\n<\/code><\/pre>\n<h2>6. Generating Results with MuseGAN<\/h2>\n<p>Now, let&#8217;s use the trained GAN to generate new music.<\/p>\n<pre><code>def generate_music(generator, num_samples=5):\n    generator.eval()\n    with torch.no_grad():\n        for _ in range(num_samples):\n            z = torch.randn(1, 100)\n            generated_music = generator(z)\n            print(generated_music.numpy())\n<\/code><\/pre>\n<h3>6.1. Visualizing Results<\/h3>\n<p>The generated music can be visualized for analysis. The generated data can be plotted as a graph or converted to MIDI for playback.<\/p>\n<pre><code>import matplotlib.pyplot as plt\n\ndef plot_generated_music(music):\n    plt.figure(figsize=(10, 4))\n    plt.plot(music.numpy().flatten())\n    plt.xlabel('Time Steps')\n    plt.ylabel('Amplitude')\n    plt.title('Generated Music')\n    plt.show()\n<\/code><\/pre>\n<h2>7. Conclusion<\/h2>\n<p>Using MuseGAN, it is possible to automatically generate music utilizing deep learning techniques. GAN-based models like this enable the learning of various musical styles and structures, allowing for the creation of unique music. Future research may incorporate more complex structures and diverse elements to enable the generation of higher quality music.<\/p>\n<div class=\"note\">\n<strong>Note:<\/strong> This article covered the basic structure and methodology of MuseGAN. In actual projects involving datasets, more components and complexities may be added. Consider expanding MuseGAN using various musical datasets and conditions.\n<\/div>\n<hr\/>\n<p>This blog post explained the basic understanding and implementation of MuseGAN using PyTorch. If deeper learning is needed, it is recommended to refer to relevant papers or to experiment with a wider variety of examples independently.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Generative Adversarial Networks (GANs) are models in which two neural networks compete and learn from each other. The goal of a GAN is to learn the data distribution and generate new data. Recently, various applications utilizing GANs have emerged, among which MuseGAN has garnered attention in the field of music generation. In this article, we &hellip; <a href=\"https:\/\/atmokpo.com\/w\/36399\/\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;Deep Learning with GAN using PyTorch, First MuseGAN&#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-36399","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 GAN using PyTorch, First MuseGAN - \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\/36399\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Deep Learning with GAN using PyTorch, First MuseGAN - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"og:description\" content=\"Generative Adversarial Networks (GANs) are models in which two neural networks compete and learn from each other. The goal of a GAN is to learn the data distribution and generate new data. Recently, various applications utilizing GANs have emerged, among which MuseGAN has garnered attention in the field of music generation. In this article, we &hellip; \ub354 \ubcf4\uae30 &quot;Deep Learning with GAN using PyTorch, First MuseGAN&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/atmokpo.com\/w\/36399\/\" \/>\n<meta property=\"og:site_name\" content=\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"article:published_time\" content=\"2024-11-01T09:48:11+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-01T11:00:04+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=\"6\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/atmokpo.com\/w\/36399\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/36399\/\"},\"author\":{\"name\":\"root\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\"},\"headline\":\"Deep Learning with GAN using PyTorch, First MuseGAN\",\"datePublished\":\"2024-11-01T09:48:11+00:00\",\"dateModified\":\"2024-11-01T11:00:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/atmokpo.com\/w\/36399\/\"},\"wordCount\":696,\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"articleSection\":[\"GAN deep learning course\"],\"inLanguage\":\"ko-KR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/atmokpo.com\/w\/36399\/\",\"url\":\"https:\/\/atmokpo.com\/w\/36399\/\",\"name\":\"Deep Learning with GAN using PyTorch, First MuseGAN - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#website\"},\"datePublished\":\"2024-11-01T09:48:11+00:00\",\"dateModified\":\"2024-11-01T11:00:04+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/atmokpo.com\/w\/36399\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/atmokpo.com\/w\/36399\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/atmokpo.com\/w\/36399\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\ud648\",\"item\":\"https:\/\/atmokpo.com\/w\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Deep Learning with GAN using PyTorch, First MuseGAN\"}]},{\"@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 GAN using PyTorch, First MuseGAN - \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\/36399\/","og_locale":"ko_KR","og_type":"article","og_title":"Deep Learning with GAN using PyTorch, First MuseGAN - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","og_description":"Generative Adversarial Networks (GANs) are models in which two neural networks compete and learn from each other. The goal of a GAN is to learn the data distribution and generate new data. Recently, various applications utilizing GANs have emerged, among which MuseGAN has garnered attention in the field of music generation. In this article, we &hellip; \ub354 \ubcf4\uae30 \"Deep Learning with GAN using PyTorch, First MuseGAN\"","og_url":"https:\/\/atmokpo.com\/w\/36399\/","og_site_name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","article_published_time":"2024-11-01T09:48:11+00:00","article_modified_time":"2024-11-01T11:00:04+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":"6\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/atmokpo.com\/w\/36399\/#article","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/36399\/"},"author":{"name":"root","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7"},"headline":"Deep Learning with GAN using PyTorch, First MuseGAN","datePublished":"2024-11-01T09:48:11+00:00","dateModified":"2024-11-01T11:00:04+00:00","mainEntityOfPage":{"@id":"https:\/\/atmokpo.com\/w\/36399\/"},"wordCount":696,"publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"articleSection":["GAN deep learning course"],"inLanguage":"ko-KR"},{"@type":"WebPage","@id":"https:\/\/atmokpo.com\/w\/36399\/","url":"https:\/\/atmokpo.com\/w\/36399\/","name":"Deep Learning with GAN using PyTorch, First MuseGAN - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/#website"},"datePublished":"2024-11-01T09:48:11+00:00","dateModified":"2024-11-01T11:00:04+00:00","breadcrumb":{"@id":"https:\/\/atmokpo.com\/w\/36399\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/atmokpo.com\/w\/36399\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/atmokpo.com\/w\/36399\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\ud648","item":"https:\/\/atmokpo.com\/w\/en\/"},{"@type":"ListItem","position":2,"name":"Deep Learning with GAN using PyTorch, First MuseGAN"}]},{"@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\/36399","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=36399"}],"version-history":[{"count":1,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/36399\/revisions"}],"predecessor-version":[{"id":36400,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/36399\/revisions\/36400"}],"wp:attachment":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/media?parent=36399"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/categories?post=36399"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/tags?post=36399"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}