{"id":36403,"date":"2024-11-01T09:48:13","date_gmt":"2024-11-01T09:48:13","guid":{"rendered":"http:\/\/atmokpo.com\/w\/?p=36403"},"modified":"2024-11-01T11:00:03","modified_gmt":"2024-11-01T11:00:03","slug":"using-pytorch-for-gan-deep-learning-first-music-generation-rnn","status":"publish","type":"post","link":"https:\/\/atmokpo.com\/w\/36403\/","title":{"rendered":"Using PyTorch for GAN Deep Learning, First Music Generation RNN"},"content":{"rendered":"<p><body><\/p>\n<h2>1. Introduction<\/h2>\n<p>As artificial intelligence (AI) technology advances, various attempts are being made in the field of music generation. In particular, among deep learning models, Generative Adversarial Networks (GANs) show excellent performance in learning patterns from existing data to generate new data. In this article, we will implement an RNN (Recurrent Neural Network) based music generation model using PyTorch. This model focuses on utilizing the principles of GAN to generate natural music.<\/p>\n<h2>2. Overview and Principles of GAN<\/h2>\n<p>A GAN (Generative Adversarial Network) consists of two neural networks, namely a Generator and a Discriminator. The Generator tries to create data similar to the real data, while the Discriminator tries to distinguish whether the generated data is real or fake. These two networks compete and learn from each other.<\/p>\n<h3>2.1 Structure of GAN<\/h3>\n<p>The structure of GAN is as follows:<\/p>\n<ul>\n<li>Generator: Takes random noise as input and generates data.<\/li>\n<li>Discriminator: Responsible for distinguishing between the generated data and actual data.<\/li>\n<\/ul>\n<p>This structure enables GAN to generate highly creative data.<\/p>\n<h3>2.2 GAN Learning Process<\/h3>\n<p>The learning of GAN proceeds in an alternating fashion between the two networks:<\/p>\n<ul>\n<li>First, the Generator takes random noise as input and generates fake data.<\/li>\n<li>Next, the Discriminator receives both fake and real data and assesses the authenticity of each data.<\/li>\n<li>The Generator learns to make the Discriminator incorrectly judge fake data as real.<\/li>\n<li>On the other hand, the Discriminator learns to accurately distinguish fake data.<\/li>\n<\/ul>\n<h2>3. Music Generation Using RNN<\/h2>\n<p>Music is sequential data, and RNN is suitable for handling such sequences. RNN is designed so that outputs from previous time steps can influence the current input, making it well-suited for generating music sequences.<\/p>\n<h3>3.1 Structure of RNN<\/h3>\n<p>RNN mainly consists of the following components:<\/p>\n<ul>\n<li>Input Layer: The data input at each time step.<\/li>\n<li>Hidden Layer: Responsible for retaining information about the previous state.<\/li>\n<li>Output Layer: Provides the final output of the model.<\/li>\n<\/ul>\n<h3>3.2 Learning of RNN<\/h3>\n<p>The learning of RNN is performed through sequential data, utilizing a reference loss function for optimization. The loss is calculated, and weights are updated through backpropagation.<\/p>\n<h2>4. Preparing Music Data<\/h2>\n<p>Music data is needed to train the model. Generally, MIDI file format is used. This data is converted to text format and preprocessed to fit the model.<\/p>\n<h3>4.1 Reading MIDI Files<\/h3>\n<p>MIDI files are read and necessary information is extracted using libraries like <code>mido<\/code> in Python. Now, let\u2019s describe how to extract note information from a MIDI file.<\/p>\n<h3>4.2 Data Preprocessing<\/h3>\n<pre><code>python\nimport mido\n\ndef extract_notes(midi_file):\n    midi = mido.MidiFile(midi_file)\n    notes = []\n    \n    for track in midi.tracks:\n        for message in track:\n            if message.type == 'note_on' and message.velocity > 0:\n                notes.append(message.note)\n    \n    return notes\n\nnotes = extract_notes('example.mid')\nprint(notes)\n<\/code><\/pre>\n<p>The code above is a function that extracts note information from a MIDI file. Each note is represented by a MIDI number.<\/p>\n<h2>5. Model Implementation<\/h2>\n<p>In the model implementation phase, GAN and RNN models are constructed using PyTorch. Next, we design the RNN structure and combine it with the GAN structure to define the final music generation model.<\/p>\n<h3>5.1 Defining the RNN Model<\/h3>\n<pre><code>python\nimport torch\nimport torch.nn as nn\n\nclass RNNModel(nn.Module):\n    def __init__(self, input_size, hidden_size, output_size):\n        super(RNNModel, self).__init__()\n        self.rnn = nn.RNN(input_size, hidden_size, batch_first=True)\n        self.fc = nn.Linear(hidden_size, output_size)\n\n    def forward(self, x):\n        out, _ = self.rnn(x)\n        out = self.fc(out[:, -1, :])\n        return out\n<\/code><\/pre>\n<p>This code defines a class for the RNN model. You can set input size, hidden layer size, and output size.<\/p>\n<h3>5.2 Defining the GAN Structure<\/h3>\n<pre><code>python\nclass GAN(nn.Module):\n    def __init__(self, generator, discriminator):\n        super(GAN, self).__init__()\n        self.generator = generator\n        self.discriminator = discriminator\n\n    def forward(self, noise):\n        generated_data = self.generator(noise)\n        validity = self.discriminator(generated_data)\n        return validity\n<\/code><\/pre>\n<p>Here, we have defined the GAN structure with a generator and a discriminator. The generator takes noise as input to generate data, and the discriminator assesses the validity of this data.<\/p>\n<h2>6. Training Process<\/h2>\n<p>During the training process, the generator and discriminator networks are trained alternately to improve their respective performances. Here is an example of a training loop.<\/p>\n<h3>6.1 Implementing the Training Loop<\/h3>\n<pre><code>python\ndef train_gan(generator, discriminator, gan, dataloader, num_epochs, device):\n    criterion = nn.BCELoss()\n    optimizer_g = torch.optim.Adam(generator.parameters(), lr=0.0002, betas=(0.5, 0.999))\n    optimizer_d = torch.optim.Adam(discriminator.parameters(), lr=0.0002, betas=(0.5, 0.999))\n\n    for epoch in range(num_epochs):\n        for real_data in dataloader:\n            batch_size = real_data.size(0)\n            real_data = real_data.to(device)\n\n            # Discriminator training\n            optimizer_d.zero_grad()\n            noise = torch.randn(batch_size, 100).to(device)\n            fake_data = generator(noise)\n            validity_real = discriminator(real_data)\n            validity_fake = discriminator(fake_data.detach())\n\n            loss_d = criterion(validity_real, torch.ones(batch_size, 1).to(device)) + \\\n                      criterion(validity_fake, torch.zeros(batch_size, 1).to(device))\n            loss_d.backward()\n            optimizer_d.step()\n\n            # Generator training\n            optimizer_g.zero_grad()\n            validity = discriminator(fake_data)\n            loss_g = criterion(validity, torch.ones(batch_size, 1).to(device))\n            loss_g.backward()\n            optimizer_g.step()\n        \n        print(f\"Epoch[{epoch}\/{num_epochs}] Loss D: {loss_d.item()}, Loss G: {loss_g.item()}\")\n<\/code><\/pre>\n<p>This function defines the training process of GAN. It outputs the losses of discriminator and generator for each epoch to monitor the training process.<\/p>\n<h2>7. Result Generation<\/h2>\n<p>After training is complete, the model can be used to generate new music. The generated music can be saved as a MIDI file.<\/p>\n<h3>7.1 Music Generation and Saving<\/h3>\n<pre><code>python\ndef generate_music(generator, num_samples, device):\n    noise = torch.randn(num_samples, 100).to(device)\n    generated_music = generator(noise)\n    \n    # Code to save as MIDI file\n    # ...\n    \n    return generated_music\n<\/code><\/pre>\n<h2>8. Conclusion<\/h2>\n<p>In this article, we explored the process of implementing a GAN-based music generation RNN model using PyTorch. By utilizing the principles of GAN and the characteristics of RNN, we explored new possibilities in music generation. Through such models, it will be possible to experimentally generate music, potentially bringing creative changes to the music industry.<\/p>\n<h2>9. References<\/h2>\n<ul>\n<li>Goodfellow et al., &#8220;Generative Adversarial Nets,&#8221; NeurIPS, 2014.<\/li>\n<li>Hochreiter, S., &#038; Schmidhuber, J. (1997). Long Short-Term Memory. Neural Computation.<\/li>\n<li>PyTorch Documentation: <a href=\"https:\/\/pytorch.org\/docs\/stable\/index.html\">https:\/\/pytorch.org\/docs\/stable\/index.html<\/a><\/li>\n<li>Mido Documentation: <a href=\"https:\/\/mido.readthedocs.io\/en\/latest\/\">https:\/\/mido.readthedocs.io\/en\/latest\/<\/a><\/li>\n<\/ul>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"<p>1. Introduction As artificial intelligence (AI) technology advances, various attempts are being made in the field of music generation. In particular, among deep learning models, Generative Adversarial Networks (GANs) show excellent performance in learning patterns from existing data to generate new data. In this article, we will implement an RNN (Recurrent Neural Network) based music &hellip; <a href=\"https:\/\/atmokpo.com\/w\/36403\/\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;Using PyTorch for GAN Deep Learning, First Music Generation RNN&#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-36403","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>Using PyTorch for GAN Deep Learning, First Music Generation RNN - \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\/36403\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Using PyTorch for GAN Deep Learning, First Music Generation RNN - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"og:description\" content=\"1. Introduction As artificial intelligence (AI) technology advances, various attempts are being made in the field of music generation. In particular, among deep learning models, Generative Adversarial Networks (GANs) show excellent performance in learning patterns from existing data to generate new data. In this article, we will implement an RNN (Recurrent Neural Network) based music &hellip; \ub354 \ubcf4\uae30 &quot;Using PyTorch for GAN Deep Learning, First Music Generation RNN&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/atmokpo.com\/w\/36403\/\" \/>\n<meta property=\"og:site_name\" content=\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"article:published_time\" content=\"2024-11-01T09:48:13+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-01T11:00:03+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\/36403\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/36403\/\"},\"author\":{\"name\":\"root\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\"},\"headline\":\"Using PyTorch for GAN Deep Learning, First Music Generation RNN\",\"datePublished\":\"2024-11-01T09:48:13+00:00\",\"dateModified\":\"2024-11-01T11:00:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/atmokpo.com\/w\/36403\/\"},\"wordCount\":700,\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"articleSection\":[\"GAN deep learning course\"],\"inLanguage\":\"ko-KR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/atmokpo.com\/w\/36403\/\",\"url\":\"https:\/\/atmokpo.com\/w\/36403\/\",\"name\":\"Using PyTorch for GAN Deep Learning, First Music Generation RNN - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#website\"},\"datePublished\":\"2024-11-01T09:48:13+00:00\",\"dateModified\":\"2024-11-01T11:00:03+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/atmokpo.com\/w\/36403\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/atmokpo.com\/w\/36403\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/atmokpo.com\/w\/36403\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\ud648\",\"item\":\"https:\/\/atmokpo.com\/w\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Using PyTorch for GAN Deep Learning, First Music Generation RNN\"}]},{\"@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":"Using PyTorch for GAN Deep Learning, First Music Generation RNN - \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\/36403\/","og_locale":"ko_KR","og_type":"article","og_title":"Using PyTorch for GAN Deep Learning, First Music Generation RNN - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","og_description":"1. Introduction As artificial intelligence (AI) technology advances, various attempts are being made in the field of music generation. In particular, among deep learning models, Generative Adversarial Networks (GANs) show excellent performance in learning patterns from existing data to generate new data. In this article, we will implement an RNN (Recurrent Neural Network) based music &hellip; \ub354 \ubcf4\uae30 \"Using PyTorch for GAN Deep Learning, First Music Generation RNN\"","og_url":"https:\/\/atmokpo.com\/w\/36403\/","og_site_name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","article_published_time":"2024-11-01T09:48:13+00:00","article_modified_time":"2024-11-01T11:00:03+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\/36403\/#article","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/36403\/"},"author":{"name":"root","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7"},"headline":"Using PyTorch for GAN Deep Learning, First Music Generation RNN","datePublished":"2024-11-01T09:48:13+00:00","dateModified":"2024-11-01T11:00:03+00:00","mainEntityOfPage":{"@id":"https:\/\/atmokpo.com\/w\/36403\/"},"wordCount":700,"publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"articleSection":["GAN deep learning course"],"inLanguage":"ko-KR"},{"@type":"WebPage","@id":"https:\/\/atmokpo.com\/w\/36403\/","url":"https:\/\/atmokpo.com\/w\/36403\/","name":"Using PyTorch for GAN Deep Learning, First Music Generation RNN - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/#website"},"datePublished":"2024-11-01T09:48:13+00:00","dateModified":"2024-11-01T11:00:03+00:00","breadcrumb":{"@id":"https:\/\/atmokpo.com\/w\/36403\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/atmokpo.com\/w\/36403\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/atmokpo.com\/w\/36403\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\ud648","item":"https:\/\/atmokpo.com\/w\/en\/"},{"@type":"ListItem","position":2,"name":"Using PyTorch for GAN Deep Learning, First Music Generation RNN"}]},{"@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\/36403","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=36403"}],"version-history":[{"count":1,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/36403\/revisions"}],"predecessor-version":[{"id":36404,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/36403\/revisions\/36404"}],"wp:attachment":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/media?parent=36403"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/categories?post=36403"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/tags?post=36403"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}