{"id":25583,"date":"2024-10-13T09:33:16","date_gmt":"2024-10-13T00:33:16","guid":{"rendered":"http:\/\/www.tyosuke20xx.com\/blog\/?p=25583"},"modified":"2025-01-06T17:56:19","modified_gmt":"2025-01-06T08:56:19","slug":"%e4%ba%8c%e6%ac%a1%e5%85%83%e7%94%bb%e5%83%8f%e7%94%9f%e6%88%90ai-python","status":"publish","type":"post","link":"http:\/\/www.tyosuke20xx.com\/blog\/?p=25583","title":{"rendered":"\u4e8c\u6b21\u5143\u753b\u50cf\u751f\u6210AI python"},"content":{"rendered":"\n<pre class=\"wp-block-code\"><code>import torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torch.utils.data import DataLoader\nfrom torchvision import datasets, transforms\nimport matplotlib.pyplot as plt\nfrom tqdm import tqdm\n\n# \u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u306e\u5909\u63db\uff08\u30ea\u30b5\u30a4\u30ba\u3068\u6b63\u898f\u5316\uff09\ntransform = transforms.Compose(&#91;\n    transforms.Resize((64, 64)),\n    transforms.ToTensor(),\n    transforms.Normalize((0.5,), (0.5,))  # \u30d4\u30af\u30bb\u30eb\u5024\u3092&#91;-1, 1]\u306e\u7bc4\u56f2\u306b\u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\n])\n\n# AnimeFaceDataset\u306e\u30ed\u30fc\u30c9\ndataset = datasets.ImageFolder(root='C:\/Users\/tyosu\/projects\/anime_faces',transform=transform)\ndataloader = DataLoader(dataset, batch_size=64, shuffle=True)\n\n# Generator\uff08\u751f\u6210\u30e2\u30c7\u30eb\uff09\nclass Generator(nn.Module):\n    def __init__(self):\n        super(Generator, self).__init__()\n        self.main = nn.Sequential(\n            nn.Linear(100, 256),\n            nn.ReLU(True),\n            nn.Linear(256, 512),\n            nn.ReLU(True),\n            nn.Linear(512, 1024),\n            nn.ReLU(True),\n            nn.Linear(1024, 64 * 64 * 3),\n            nn.Tanh()\n        )\n\n    def forward(self, input):\n        output = self.main(input)\n        return output.view(-1, 3, 64, 64)\n\n# Discriminator\uff08\u5224\u5225\u30e2\u30c7\u30eb\uff09\nclass Discriminator(nn.Module):\n    def __init__(self):\n        super(Discriminator, self).__init__()\n        self.main = nn.Sequential(\n            nn.Linear(64 * 64 * 3, 1024),\n            nn.ReLU(True),\n            nn.Linear(1024, 512),\n            nn.ReLU(True),\n            nn.Linear(512, 256),\n            nn.ReLU(True),\n            nn.Linear(256, 1),\n            nn.Sigmoid()\n        )\n\n    def forward(self, input):\n        input_flat = input.view(-1, 64 * 64 * 3)\n        return self.main(input_flat)\n\n# \u30e2\u30c7\u30eb\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u5316\nG = Generator()\nD = Discriminator()\n\n# \u30ed\u30b9\u95a2\u6570\u3068\u30aa\u30d7\u30c6\u30a3\u30de\u30a4\u30b6\ncriterion = nn.BCELoss()\noptimizerD = optim.Adam(D.parameters(), lr=0.0002)\noptimizerG = optim.Adam(G.parameters(), lr=0.0002)\n\n# \u30e9\u30f3\u30c0\u30e0\u30ce\u30a4\u30ba\u751f\u6210\u95a2\u6570\ndef generate_noise(batch_size):\n    return torch.randn(batch_size, 100)\n\n# \u30c8\u30ec\u30fc\u30cb\u30f3\u30b0\u30eb\u30fc\u30d7\nnum_epochs = 50\nfor epoch in range(num_epochs):\n    for i, (real_images, _) in enumerate(tqdm(dataloader)):\n        batch_size = real_images.size(0)\n\n        # \u672c\u7269\u306e\u753b\u50cf\u306e\u30e9\u30d9\u30eb\u306f1\u3001\u507d\u7269\u306e\u753b\u50cf\u306e\u30e9\u30d9\u30eb\u306f0\n        real_labels = torch.ones(batch_size, 1)\n        fake_labels = torch.zeros(batch_size, 1)\n\n        # Discriminator\u306e\u5b66\u7fd2\n        optimizerD.zero_grad()\n        outputs = D(real_images)\n        real_loss = criterion(outputs, real_labels)\n\n        noise = generate_noise(batch_size)\n        fake_images = G(noise)\n        outputs = D(fake_images.detach())\n        fake_loss = criterion(outputs, fake_labels)\n\n        d_loss = real_loss + fake_loss\n        d_loss.backward()\n        optimizerD.step()\n\n        # Generator\u306e\u5b66\u7fd2\n        optimizerG.zero_grad()\n        outputs = D(fake_images)\n        g_loss = criterion(outputs, real_labels)  # \u751f\u6210\u753b\u50cf\u3092\u672c\u7269\u3068\u8a8d\u8b58\u3055\u305b\u305f\u3044\n        g_loss.backward()\n        optimizerG.step()\n\n    print(f'Epoch &#91;{epoch+1}\/{num_epochs}] | d_loss: {d_loss.item()} | g_loss: {g_loss.item()}')\n\n    # \u751f\u6210\u3055\u308c\u305f\u753b\u50cf\u3092\u8868\u793a\n    if (epoch + 1) % 10 == 0:\n        fake_images = G(generate_noise(64)).detach().cpu()\n        plt.imshow(fake_images&#91;0].permute(1, 2, 0) * 0.5 + 0.5)\n       <\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[55,4,65],"tags":[3,39],"class_list":["post-25583","post","type-post","status-publish","format-standard","hentry","category-ai","category-programming","category-python","tag-programming","tag-python"],"aioseo_notices":[],"jetpack_featured_media_url":"","_links":{"self":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/25583","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=25583"}],"version-history":[{"count":3,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/25583\/revisions"}],"predecessor-version":[{"id":25773,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/25583\/revisions\/25773"}],"wp:attachment":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=25583"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=25583"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=25583"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}