{"id":8660,"date":"2020-01-06T10:31:47","date_gmt":"2020-01-06T01:31:47","guid":{"rendered":"http:\/\/www.gisdeveloper.co.kr\/?p=8660"},"modified":"2020-05-28T09:49:24","modified_gmt":"2020-05-28T00:49:24","slug":"dcgan","status":"publish","type":"post","link":"http:\/\/www.gisdeveloper.co.kr\/?p=8660","title":{"rendered":"\uc801\ub300\uc801 \uc0dd\uc131 \uc2e0\uacbd\ub9dd GAN"},"content":{"rendered":"<p>GAN\uc740 Generative Adversarial Network\ub85c \uc801\ub300\uc801 \uc0dd\uc131 \uc2e0\uacbd\ub9dd\uc785\ub2c8\ub2e4. \uc989, \ubb34\uc5b8\uac00\ub97c \uc0dd\uc131\ud558\ub294 \uc2e0\uacbd\ub9dd\uc778\ub370.. \uadf8 \ubb34\uc5b8\uac00\ub97c \uc81c\ub300\ub85c \uc798\uc0dd\uc131\ud558\uae30 \uc704\ud574 \ub204\uad70\uac00\ub97c \uc798\uc18d\uc774\uae30 \uc704\ud55c \uc804\ub7b5\uc744 \ucde8\ud569\ub2c8\ub2e4. \ud754\ud788 GAN\uc5d0 \ub300\ud55c \uc774\ub7ec\ud55c \uc124\uba85\uc744 \uc704\uc870\uc9c0\ud3d0\ubc94\uacfc \uc9c0\ud3d0\ud310\ubcc4\uc0ac\uc758 \uc608\ub97c \ub9ce\uc774 \ub4ed\ub2c8\ub2e4. \uc704\uc870\uc9c0\ud3d0\ubc94\uc740 \uc704\uc870\uc9c0\ud3d0\ub97c \ub9cc\ub4e4\uc5b4 \uc9c0\ud3d0\ud310\ubcc4\uc0ac\uc5d0\uac8c \uc804\ub2ec\ud558\uba74 \ud310\ubcc4\uc0ac\ub294 \uc774\uac8c \uac00\uc9dc\uc778\uc9c0 \uc9c4\uc9dc\uc778\uc9c0\ub97c \ud310\ubcc4\ud574\uc11c \uc9c0\ud3d0\ubc94\uc5d0\uac8c \uc5bc\ub9c8\ub098 \uac00\uc9dc\uac19\uc740\uc9c0\ub97c \uc54c\ub824\uc8fc\uace0, \uc704\uc870\uc9c0\ud3d0\ubc94\uc740 \ud310\ubcc4\uc0ac\uc5d0\uac8c\uc11c \uc5bb\uc740 \ud53c\ub4dc\ubc31\uc744 \ud1b5\ud574 \uc880\ub354 \uc9c4\uc9dc\uac19\uc740 \uc704\uc870\uc9c0\ud3d0\ub97c \ub9cc\ub4e4\uc5b4 \ub2e4\uc2dc \ud310\ubcc4\uc0ac\uc5d0\uac8c \uc804\ub2ec\ud569\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uacfc\uc815\uc744 \ubc18\ubcf5\ud558\ub2e4\ubcf4\uba74 \uc704\uc870\uc9c0\ud3d0\ubc94\uc740 \ub354\uc6b1 \uc9c4\uc9dc \uac19\uc740 \uc704\uc870\uc9c0\ud3d0\ub97c \ub9cc\ub4e4 \uc218 \uc788\uac8c \ub41c\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc124\uba85\uc744 \ub3c4\uc2dd\uc73c\ub85c \ud45c\ud604\ud574 \ubcf4\uba74 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/2020\/01\/GAN_OVERVIEW.png\" alt=\"\" width=\"1361\" height=\"983\" class=\"aligncenter size-full wp-image-8809\" \/><\/p>\n<p>\uc704\uc758 \uadf8\ub9bc\uc5d0\uc11c \uc704\uc870 \uc9c0\ud3d0\ubc94\uacfc \uc9c0\ud3d0 \ud310\ubcc4\uc0ac\ub294 \uac01\uac01 \uc2e0\uacbd\ub9dd \ubaa8\ub378\uc785\ub2c8\ub2e4. \uc774 \ub450 \uc2e0\uacbd\ub9dd \ubaa8\ub378 \ud559\uc2b5\uc744 \uc704\ud574 \ud559\uc2b5\uc2dc \uc5bb\uc5b4\uc9c0\ub294 \uc190\uc2e4\uac12 \ucd5c\uc18c\ud654\ub97c \ud1b5\ud574 \uc2e0\uacbd\ub9dd\uc758 \ub2a5\ub825\uc744 \ud5a5\uc0c1\uc2dc\ucf1c\ub098\uac00\uac8c \ub429\ub2c8\ub2e4. GAN\uc740 \uc704\uc870\uc9c0\ud3d0\ucc98\ub7fc \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\ub294 \uac83\ubfd0\ub9cc \uc544\ub2c8\ub77c \uc785\ub825 \ub370\uc774\ud130\uc5d0 \ub530\ub77c \ud14d\uc2a4\ud2b8\ub098 \uc791\uace1 \ub4f1\ub3c4 \uac00\ub2a5\ud569\ub2c8\ub2e4. \ub610\ud55c GAN\uc740 \ub808\uc774\ube14 \ub370\uc774\ud130\uac00 \ud544\uc694\uc5c6\ub294 \ube44\uc9c0\ub3c4\ud559\uc2b5\uc5d0 \uc18d\ud569\ub2c8\ub2e4. \uc989, GAN\uc744 \ud1b5\ud574 \uc0dd\uc131\ud558\uace0\uc790 \ud558\ub294 \uc885\ub958\uc758 \ub370\uc774\ud130\ub9cc \uc788\uc73c\uba74 \ub429\ub2c8\ub2e4. \ucd08\uae30\uc758 GAN\uc740 \ub2e8\uc21c\ud55c Linear Layer(\uc120\ud615 \ub808\uc774\uc5b4)\ub9cc\uc73c\ub85c \uad6c\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \uc0dd\uc131\ud558\uace0\uc790 \ud558\ub294 \ub370\uc774\ud130\uc5d0 \ub530\ub77c&#8230; \uc989 \uc774\ubbf8\uc9c0\uc758 \uacbd\uc6b0\ub294 Convolutional Layer\ub85c \uad6c\uc131\ud558\ub294 \uac83\uc774 \ud6a8\uacfc\uc801\uc785\ub2c8\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 \uc774 \ub450\uac00\uc9c0 \uacbd\uc6b0 \ubaa8\ub450\ub97c \uc5b8\uae09\ud569\ub2c8\ub2e4.<\/p>\n<p>\uba3c\uc800 \uc120\ud615 \ub808\uc774\uc5b4\ub9cc\uc73c\ub85c \uad6c\uc131\ub41c GAN\uc5d0 \ub300\ud55c \uc2e4\uc81c \uad6c\ud604\uc785\ub2c8\ub2e4.<\/p>\n<p>\ub525\ub7ec\ub2dd\uc744 \uc704\ud55c \ub77c\uc774\ube0c\ub7ec\ub9ac\ub85c PyTorch\ub97c \uc0ac\uc6a9\ud558\ubbc0\ub85c \ub2e4\uc74c\ucc98\ub7fc \ud544\uc694\ud55c \ub77c\uc774\ube0c\ub7ec\ub9ac \ub4f1\uc744 \ubd88\ub7ec\uc635\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">\r\nimport os\r\nimport torch\r\nimport torch.nn as nn\r\nimport torchvision\r\nimport torch.optim as optim\r\nfrom torchvision import transforms, datasets\r\nimport matplotlib.pyplot as plt\r\nimport numpy as np\r\n<\/pre>\n<p>\ub2e4\uc74c\uc73c\ub85c \ubc18\ubcf5 \ud559\uc2b5\uc218\uc640 \ubc30\uce58\uc218, \uadf8\ub9ac\uace0 GPU\ub97c \uc9c0\uc6d0\ud558\ub294\uc9c0\uc758 \uc5ec\ubd80\uc5d0 \ub530\ub978 \uc900\ube44\ub97c \ub2e4\uc74c \ucf54\ub4dc\ub97c \ud1b5\ud574 \uc9c0\uc815\ud569\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">\r\nEPOCHS = 1000\r\nBATCH_SIZE = 128\r\nUSE_CUDA = torch.cuda.is_available()\r\nDEVICE = torch.device(\"cuda\" if USE_CUDA else \"cpu\")\r\n<\/pre>\n<p>\uc6b0\ub9ac\uac00 \uc0dd\uc131\ud560 \uc774\ubbf8\uc9c0 \ub370\uc774\ud130\ub294 MNIST\uc758 \uc22b\uc790 \ub370\uc774\ud130\uc785\ub2c8\ub2e4. \ubcf4\ub2e4 \ubcf5\uc7a1\ud55c \uc774\ubbf8\uc9c0\ub3c4 \uac00\ub2a5\ud558\uc9c0\ub9cc, \uc5ec\uae30\uc11c\ub294 \ube60\ub978 \ud559\uc2b5\uacfc \ubd84\uba85\ud55c \uacb0\uacfc \ud655\uc778\uc744 \uc704\ud574 MNSIT \uc22b\uc790 \ub370\uc774\ud130\ub97c \uc0ac\uc6a9\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class='lang:python'>\r\ntrainset = datasets.MNIST(\".\/data\", train=True, download=True, \r\n    transform=transforms.Compose([\r\n        transforms.ToTensor(),\r\n        transforms.Normalize((0.5,), (0.5,))\r\n    ])\r\n)\r\n\r\ntrain_loader = torch.utils.data.DataLoader(dataset = trainset, batch_size=BATCH_SIZE, shuffle=True, drop_last=True)\r\n<\/pre>\n<p>\uc55e\uc11c \uadf8\ub9bc\uc744 \ubcf4\uba74 \uc704\uc870\uc9c0\ud3d0\ubc94\uc5d0 z \uac12\uc774 \uc785\ub825\ub418\uace0 \uc788\ub294 \uac83\uc744 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 z\ub294 \uc7a0\uc7ac \ubca1\ud130(Latent Vector)\uc778\ub370\uc694. \uc774 \uc7a0\uc7ac \ubca1\ud130\uc758 \uad6c\uc131 \uac12\uc5d0 \ub530\ub77c \uc5b4\ub5a4 \uc774\ubbf8\uc9c0\uac00 \uc0dd\uc131\ub418\ub294\uc9c0 \uacb0\uc815\ub429\ub2c8\ub2e4. \uc774 \uc7a0\uc7ac \ubca1\ud130\ub97c \uad6c\uc131\ud558\ub294 \uac12\uc758 \uac1c\uc218\ub97c \uc544\ub798 \ucf54\ub4dc\ub85c \uc815\uc758\ud569\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">\r\nz_size = 72\r\n<\/pre>\n<p>\uc774\uc81c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\ub294 \uc2e0\uacbd\ub9dd \ubaa8\ub378\uc744 \uc815\uc758\ud569\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">\r\nclass GNet(nn.Module):\r\n    def __init__(self):\r\n        super().__init__()\r\n        self._layers = nn.Sequential(\r\n            nn.Linear(z_size, 128),\r\n            nn.ReLU(),\r\n            nn.Linear(128, 256),\r\n            nn.ReLU(),\r\n            nn.Linear(256, 512),\r\n            nn.ReLU(),    \r\n            nn.Linear(512, 784),\r\n            nn.Tanh()\r\n        )\r\n    def forward(self, x):\r\n        return self._layers(x)\r\n<\/pre>\n<p>\uc7a0\uc7ac \ubca1\ud130\uc758 \ud06c\uae30\uac12\ub9cc\ud07c \uc785\ub825\ubc1b\uc544 \ucd5c\uc885\uc801\uc73c\ub85c \uc774\ubbf8\uc9c0\uc758 \ud06c\uae30\uc778 784(\uc774\ubbf8\uc9c0 \ud06c\uae30: 28&#215;28)\ub85c \ucd9c\ub825\ud569\ub2c8\ub2e4. \uc6d0\ud65c\ud55c \ud559\uc2b5\uc744 \uc704\ud574 \ud65c\uc131\ud654\ud568\uc218\ub85c ReLU\ub97c \uc0ac\uc6a9\ud588\uace0, \ub9c8\uc9c0\ub9c9 \ud65c\uc131\ud654\ud568\uc218\ub294 Tanh\ub97c \uc0ac\uc6a9\ud588\ub294\ub370.. \uc774\ub294 \uc774\ubbf8\uc9c0\ub97c \uad6c\uc131\ud558\ub294 \uac12\ub4e4\uc758 \ubc94\uc704\uac00 -1~1\uc774\uace0, \uc774\ub97c \ub9de\ucdb0\uc8fc\uae30 \uc704\ud574 Tanh\ub97c \uc0ac\uc6a9\ud55c \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\uc74c\uc740 \uc774\ubbf8\uc9c0\uc758 \uc9c4\uc9dc\uc640 \uac00\uc9dc\ub97c \ud310\ubcc4\ud558\ub294 \uc2e0\uacbd\ub9dd \ubaa8\ub378\uc785\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">\r\nclass DNet(nn.Module):\r\n    def __init__(self):\r\n        super().__init__()\r\n        self._layers = nn.Sequential(\r\n            nn.Linear(784, 512),\r\n            nn.LeakyReLU(0.25),\r\n            nn.Linear(512, 256),\r\n            nn.LeakyReLU(0.25),    \r\n            nn.Linear(256, 128),\r\n            nn.LeakyReLU(0.25),\r\n            nn.Linear(128,1),\r\n            nn.Sigmoid()\r\n        )\r\n    def forward(self, x):\r\n        return self._layers(x)\r\n<\/pre>\n<p>\uc774\uc81c \ub450\uac1c\uc758 \uc2e0\uacbd\ub9dd\uc744 \ud559\uc2b5\ud558\uae30 \uc704\ud574 \ub450 \uc2e0\uacbd\ub9dd\uc744 \uc0dd\uc131\ud558\uace0, \uc190\uc2e4\uac12 \uacc4\uc0b0\uc744 \uc704\ud574 Binary Cross Entropy Loss\uc778 BCELoss\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4. \ub610\ud55c \uc190\uc2e4\uac12\uc5d0 \ub300\ud55c \uacbd\uc0ac\ud558\uac15\uc744 \ud1b5\ud574 \uac00\uc911\uce58\ub4e4\uc758 \ucd5c\uc801\ud654\ub97c \uc704\ud55c Adam\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4. \uc0dd\uc131\uc790\uc640 \ud310\ubcc4\uc790 \uac01\uac01\uc744 \ud559\uc2b5\ud574\uc57c \ud558\ubbc0\ub85c \ucd5c\uc801\ud654\ub97c \uc704\ud55c \uac1d\uccb4\ub294 \uac01\uac01\uc744 \uc704\ud574 2\uac1c\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \uadf8\ub9ac\uace0 \uc774\ubbf8\uc9c0\uac00 \uc9c4\uc9dc\uc778\uc9c0, \uac00\uc9dc\uc778\uc9c0\uc5d0 \ub300\ud55c \ub808\uc774\ube14 \ub370\uc774\ud130\ub97c \uc0dd\uc131\ud574 \ub461\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">\r\nD = DNet().to(DEVICE)\r\nG = GNet().to(DEVICE)\r\n\r\ncriterion = nn.BCELoss()\r\n\r\nd_optimizer = optim.Adam(D.parameters(), lr=0.0002)\r\ng_optimizer = optim.Adam(G.parameters(), lr=0.0002)\r\n\r\nreal_labels = torch.ones(BATCH_SIZE, 1).to(DEVICE)\r\nfake_labels = torch.zeros(BATCH_SIZE, 1).to(DEVICE)\r\n<\/pre>\n<p>\uc774\uc81c \uc2e4\uc81c \uc2e0\uacbd\ub9dd\uc758 \ud559\uc2b5 \ucf54\ub4dc\uc785\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">\r\nfig, axes = plt.subplots(4,3)\r\n\r\nfor epoch in range(EPOCHS):\r\n    for i, (images, _) in enumerate(train_loader):\r\n        images = images.reshape(BATCH_SIZE, -1).to(DEVICE)\r\n\r\n        outputs = D(images)\r\n        d_loss_real = criterion(outputs, real_labels)\r\n        real_score = outputs\r\n\r\n        z = torch.randn(BATCH_SIZE, z_size).to(DEVICE)\r\n        fake_images = G(z)\r\n\r\n        outputs = D(fake_images.detach())\r\n        d_loss_fake = criterion(outputs, fake_labels)\r\n        fake_score = outputs\r\n\r\n        d_loss = d_loss_real + d_loss_fake\r\n\r\n        d_optimizer.zero_grad()\r\n        d_loss.backward()\r\n        d_optimizer.step()\r\n\r\n        outputs = D(fake_images)\r\n        g_loss = criterion(outputs, real_labels)\r\n\r\n        g_optimizer.zero_grad()\r\n        g_loss.backward()\r\n        g_optimizer.step()\r\n\r\n    print('Epoch[{:3d}\/{:3d}] d_loss: {:.4f}, g_loss: {:.4f}, D(x): {:.2f}, D(G(z)): {:.2f}'.format(\r\n        epoch, EPOCHS, d_loss.item(), g_loss.item(), real_score.mean().item(), fake_score.mean().item()))\r\n\r\n    z = torch.randn(BATCH_SIZE, z_size).to(DEVICE)\r\n    fake_images = G(z)\r\n\r\n    for row in range(4):\r\n        for col in range(3):\r\n            fake_images_img = np.reshape(fake_images.data.cpu().numpy()[row*4+col],(28,28))\r\n            axis = axes[row][col]\r\n            axis.get_xaxis().set_ticks([])\r\n            axis.get_yaxis().set_ticks([])\r\n            axis.imshow(fake_images_img, cmap='gray')\r\n    \r\n    plt.savefig('.\/data\/DNN_GAN_{:03d}.jpg'.format(epoch))     \r\n<\/pre>\n<p>\ub9e4 \ud559\uc2b5 \ub2e8\uacc4\ub9c8\ub2e4 \ud559\uc2b5\ub41c \uc2e0\uacbd\ub9dd\uc73c\ub85c 12\uac1c\uc758 \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud574 \uc800\uc7a5\ud558\ub3c4\ub85d \ud558\uc600\uc2b5\ub2c8\ub2e4. \uac01 \ud559\uc2b5 \ub2e8\uacc4\uc5d0\uc11c\ub294 \uba3c\uc800 \uc9c4\uc9dc \uc774\ubbf8\uc9c0\uc640 \uac00\uc9dc \uc774\ubbf8\uc9c0\ub97c \ud310\ubcc4\uc790\uc5d0\uac8c \ud310\ubcc4\ud558\ub3c4\ub85d \ud558\uace0 \ud310\ubcc4\uc2dc \uc5bb\uc5b4\uc9c0\ub294 \uc190\uc2e4\uac12\uc744 \ud569\ud558\uc5ec \uc5ed\uc804\ud30c\ud558\uc5ec \ucd5c\uc18c\ud654\uc73c\ub85c\uc368 \ud310\ubcc4\uc790\ub97c \ud559\uc2b5\uc2dc\ud0b5\ub2c8\ub2e4. \uadf8\ub9ac\uace0 \ud310\ubcc4\uc790\ub97c \ud1b5\ud574 \uac00\uc9dc \uc774\ubbf8\uc9c0\ub97c \uc9c4\uc9dc \uc774\ubbf8\uc9c0\ub77c\uace0 \ud310\ubcc4\ud558\ub77c\uace0 \ud588\uc744\ub54c \ubc1c\uc0dd\ud558\ub294 \uc190\uc2e4\uac12\uc744 \uc5ed\uc804\ud30c\ud558\uc5ec \ucd5c\uc18c\ud654\ud568\uc73c\ub85c\uc368 \uc0dd\uc131\uc790\ub97c \ud559\uc2b5\uc2dc\ud0b5\ub2c8\ub2e4.<\/p>\n<p>GAN\uc740 \ub9ce\uc740 \ud559\uc2b5\uc774 \ud544\uc694\ud558\ubbc0\ub85c \uc0c1\ub2f9\ud55c \uc2dc\uac04\uc774 \uc18c\uc694\ub429\ub2c8\ub2e4. \uc544\ub798\ub294 \uac01 \uc5d0\ud3ed \ub2e8\uc704\ubcc4 \uc21c\uc11c\ub300\ub85c \uc0dd\uc131\ub41c \uacb0\uacfc\uc785\ub2c8\ub2e4.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/2020\/01\/DNN_GAN.gif\" alt=\"\" width=\"640\" height=\"480\" class=\"aligncenter size-full wp-image-8803\" \/><\/p>\n<p>\uc120\ud615 \ub808\uc774\uc5b4\ub9cc\uc73c\ub85c GAN\uc744 \uad6c\ud604\ud558\uba74 \ud559\uc2b5\uc774 \ub354\ub514\uac8c \uac78\ub9b0\ub2e4\ub294 \ubb38\uc81c\uc640 \ub192\uc740 \ud488\uc9c8\uc758 \uacb0\uacfc\uc640 \uc880\ub354 \ub2e4\uc591\ud55c \uc774\ubbf8\uc9c0\ub4e4\uc774 \uc0dd\uc131\ub418\uc9c0 \uc54a\ub294\ub2e4\ub294 \ubb38\uc81c\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud574\uc11c\ub294 \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc744 \uc704\ud55c GAN\uc5d0 Convolutional Layer\ub97c \uc801\uc6a9\ud55c DCGAN(Deep Convolutional GAN)\uc5d0 \ub300\ud574 \uc124\ud3b4 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<p>DCGAN\uacfc GAN\uc758 \ucc28\uc774\uc810\uc740 \uc2e0\uacbd\ub9dd\uc758 \uad6c\uc131\ubfd0\uc785\ub2c8\ub2e4. \ubb3c\ub860 \uc2e0\uacbd\ub9dd\uc774 \ubcc0\uacbd\ub418\ubbc0\ub85c \uc785\ub825\ub418\ub294 \ub370\uc774\ud130, \uc989 \ud150\uc11c\ub4e4\uc758 \ucc28\uc6d0\uc774 \ubcc0\uacbd\ub418\ub294 \ubd80\ubd84 \uc5ed\uc2dc \uc2e0\uacbd\uc744 \uc368\uc918\uc57c \ud569\ub2c8\ub2e4. DCGAN\uc758 \uc2e0\uacbd\ub9dd \ucf54\ub4dc\uc640 \uc2e0\uacbd\ub9dd\uc5d0 \uc785\ub825\ub418\ub294 \ud150\uc11c\ub4e4\uc758 \ucc28\uc6d0 \ubcc0\uacbd\uc5d0 \ub530\ub978 \ucf54\ub4dc\ub294 \uc2e0\uacbd\ub9dd \ud559\uc2b5 \ucf54\ub4dc\uc5d0\uc11c \ub098\ud0c0\ub098\ubbc0\ub85c \uc2e0\uacbd\ub9dd \ud559\uc2b5 \ubd80\ubd84\uc5d0 \ub300\ud55c \ucf54\ub4dc\ub9cc\uc744 \uc0b4\ud3b4 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \uba3c\uc800 DCGAN\uc758 \uc0dd\uc131\uc790\uc640 \ud310\ubcc4\uc790\uc5d0 \ub300\ud55c \uc2e0\uacbd\ub9dd \ucf54\ub4dc\uc785\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">\r\nclass GNet(nn.Module):\r\n    def __init__(self):\r\n        super().__init__()\r\n        self._layers = nn.Sequential(\r\n            nn.ConvTranspose2d(z_size, 32, 3, 1, 0, bias=False), # 1 -> 3\r\n            nn.BatchNorm2d(32),\r\n            nn.ReLU(inplace=False),\r\n            nn.ConvTranspose2d(32, 16, 4, 2, 1, bias=False), # 3 -> 6\r\n            nn.BatchNorm2d(16),\r\n            nn.ReLU(inplace=False),\r\n            nn.ConvTranspose2d(16, 8, 4, 2, 0, bias=False), # 6 -> 14\r\n            nn.BatchNorm2d(8),\r\n            nn.ReLU(inplace=False),\r\n            nn.ConvTranspose2d(8, 1, 4, 2, 1, bias=False), # 14 -> 28\r\n            nn.Tanh()\r\n        )\r\n    def forward(self, x):\r\n        return self._layers(x)        \r\n\r\nclass DNet(nn.Module):\r\n    def __init__(self):\r\n        super().__init__()\r\n        self._layers = nn.Sequential(\r\n            nn.Conv2d(1, 8, 4, 2, 1, bias=False), # 28 -> 14\r\n            nn.BatchNorm2d(8),\r\n            nn.LeakyReLU(0.2, inplace=False),\r\n            nn.Conv2d(8, 16, 4, 2, 1, bias=False), # 14 -> 7\r\n            nn.BatchNorm2d(16),\r\n            nn.LeakyReLU(0.2, inplace=False),            \r\n            nn.Conv2d(16, 32, 4, 2, 1, bias=False), # 7 -> 3\r\n            nn.BatchNorm2d(32),\r\n            nn.LeakyReLU(0.2, inplace=False),              \r\n            nn.Conv2d(32, 1, 4, 2, 1, bias=False), # 3 -> 1\r\n            nn.Sigmoid(),\r\n            \r\n        )\r\n    def forward(self, x):\r\n        return self._layers(x).squeeze()\r\n<\/pre>\n<p>Convolution Layer\ub85c\uc368 \uc0dd\uc131\uc790\uc5d0\uc11c\ub294 ConvTranspose2d\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc7a0\uc7ac \ubca1\ud130(z)\ub85c \uc2dc\uc791\ud574 \uc774\ubbf8\uc9c0\ub97c \uc810\ucc28 \ud0a4\uc6cc\ub098\uac00\uba70 \uc0dd\uc131\ud558\uace0, \ud310\ubcc4\uc790\uc5d0\uc11c\ub294 Conv2d\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc774\ubbf8\uc9c0\uc758 \ud2b9\uc131\uc744 \ucd94\ucd9c\ud558\ub2e4\uac00 \ub9c8\uc9c0\ub9c9\uc5d0 Sigmoid \ud568\uc218\ub97c \ud1b5\ud574 0~1\uc0ac\uc774\uc758 \uac12\uc744 \ubf51\uc544\ub0c5\ub2c8\ub2e4. \uc774 \uac12\uc774 \ubc14\ub85c \uc774\ubbf8\uc9c0\uac00 \uac00\uc9dc(0)\uc778\uc9c0 \uc9c4\uc9dc(1)\uc778\uc9c0\uc5d0 \ub300\ud55c \ud310\ubcc4 \uc5ec\ubd80\uc785\ub2c8\ub2e4. Convolutional Layer\ub294 \uc774\ubbf8\uc9c0\ub97c \ub300\uc0c1\uc73c\ub85c \ud558\ubbc0\ub85c \uc785\ub825 \uc774\ubbf8\uc9c0\uc758 \ud06c\uae30\uc640 \ub9c8\uc9c0\ub9c9 \ucd9c\ub825 \uc774\ubbf8\uc9c0\uc758 \ud06c\uae30\ub97c \uc6d0\ud558\ub294 \ud06c\uae30\uc5d0 \ub9de\ucd94\uae30 \uc704\ud574 Filter\uc640 Stride, Padding \ub4f1\uc758 \uac12\uc744 \uc870\uc815\ud574\uc918\uc57c \ud569\ub2c8\ub2e4. \uc544\ub798\ub294 \uc774\ub7f4\ub54c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uc218\uc2dd\uc785\ub2c8\ub2e4.<\/p>\n<p>\uba3c\uc800 nn.ConvTranspose2d \uc5f0\uc0b0\uc744 \ud1b5\ud574 \uc785\ub825 \uc774\ubbf8\uc9c0\uc758 \ud06c\uae30\uac00 \uc5b4\ub5a4 \ud06c\uae30\uc758 \ucd9c\ub825 \uc774\ubbf8\uc9c0\ub85c \ubcc0\uacbd\ub418\ub294\uc9c0\uc5d0 \ub300\ud55c \uc218\uc2dd\uc785\ub2c8\ub2e4.<\/p>\n<p><center><\/p>\n<p class=\"ql-center-displayed-equation\" style=\"line-height: 23px;\"><span class=\"ql-right-eqno\"> &nbsp; <\/span><span class=\"ql-left-eqno\"> &nbsp; <\/span><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/ql-cache\/quicklatex.com-99e52c6543f49b311108b65a679e4191_l3.png\" height=\"23\" width=\"683\" class=\"ql-img-displayed-equation quicklatex-auto-format\" alt=\"&#36;&#36;&#79;&#117;&#116;&#112;&#117;&#116;&#32;&#61;&#32;&#40;&#73;&#110;&#112;&#117;&#116;&#45;&#49;&#41;&#32;&#92;&#116;&#105;&#109;&#101;&#115;&#32;&#83;&#116;&#114;&#105;&#100;&#101;&#32;&#45;&#32;&#50;&#32;&#92;&#116;&#105;&#109;&#101;&#115;&#32;&#80;&#97;&#100;&#100;&#105;&#110;&#103;&#32;&#43;&#32;&#70;&#105;&#108;&#116;&#101;&#114;&#32;&#43;&#32;&#79;&#117;&#116;&#112;&#117;&#116;&#80;&#97;&#100;&#100;&#105;&#110;&#103;&#32;&#36;&#36;\" title=\"Rendered by QuickLaTeX.com\"\/><\/p>\n<p><\/center><\/p>\n<p>\ub2e4\uc74c\uc740 nn.Conv2d \uc5f0\uc0b0\uc744 \ud1b5\ud574 \uc785\ub825 \uc774\ubbf8\uc9c0\uc758 \ud06c\uae30\uac00 \uc5b4\ub5a4 \ud06c\uae30\uc758 \ucd9c\ub825 \uc774\ubbf8\uc9c0\ub85c \ubcc0\uacbd\ub418\ub294\uc9c0\uc5d0 \ub300\ud55c \uc218\uc2dd\uc785\ub2c8\ub2e4. \uacb0\uacfc\uc758 \uc18c\uc218\uc810\uc740 \ubc84\ub9bd\ub2c8\ub2e4.<\/p>\n<p><center><\/p>\n<p class=\"ql-center-displayed-equation\" style=\"line-height: 44px;\"><span class=\"ql-right-eqno\"> &nbsp; <\/span><span class=\"ql-left-eqno\"> &nbsp; <\/span><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/ql-cache\/quicklatex.com-ae46249103cc22f26c672a504be3ca8a_l3.png\" height=\"44\" width=\"413\" class=\"ql-img-displayed-equation quicklatex-auto-format\" alt=\"&#36;&#36;&#79;&#117;&#116;&#112;&#117;&#116;&#32;&#61;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#73;&#110;&#112;&#117;&#116;&#45;&#70;&#105;&#108;&#116;&#101;&#114;&#43;&#50;&#32;&#92;&#116;&#105;&#109;&#101;&#115;&#32;&#80;&#97;&#100;&#100;&#105;&#110;&#103;&#125;&#123;&#83;&#116;&#114;&#105;&#100;&#101;&#125;&#32;&#43;&#32;&#49;&#32;&#36;&#36;\" title=\"Rendered by QuickLaTeX.com\"\/><\/p>\n<p><\/center><\/p>\n<p>\uadf8\ub9ac\uace0 \ub2e4\uc74c\uc740 \ud559\uc2b5 \ucf54\ub4dc\uc785\ub2c8\ub2e4. \uc55e\uc11c \uc5b8\uae09\ud55c \uac83\ucc98\ub7fc \ucf54\ub4dc \uad6c\uc131\uc740 GAN\uacfc \ub3d9\uc77c\ud558\uace0 \uc785\ub825 \ub370\uc774\ud130\uc758 \ucc28\uc6d0 \ud06c\uae30\uc5d0 \uc758\ud55c \ubbf8\uc138\ud55c \ubcc0\ud654\uac00 \uc788\uc744\ubfd0\uc785\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">\r\nfig, axes = plt.subplots(4,3)\r\n\r\nfor epoch in range(EPOCHS):\r\n    for i, (images, _) in enumerate(train_loader):\r\n        images = images.to(DEVICE)\r\n\r\n        outputs = D(images)\r\n        d_loss_real = criterion(outputs, real_labels)\r\n        real_score = outputs\r\n\r\n        z = torch.randn(BATCH_SIZE, z_size, 1, 1).to(DEVICE)\r\n        fake_images = G(z)\r\n\r\n        outputs = D(fake_images.detach())\r\n        d_loss_fake = criterion(outputs, fake_labels)\r\n        fake_score = outputs\r\n\r\n        d_loss = d_loss_real + d_loss_fake\r\n\r\n        d_optimizer.zero_grad()\r\n        d_loss.backward()\r\n        d_optimizer.step()\r\n\r\n        outputs = D(fake_images)\r\n        g_loss = criterion(outputs, real_labels)\r\n\r\n        g_optimizer.zero_grad()\r\n        g_loss.backward()\r\n        g_optimizer.step()\r\n\r\n    print('Epoch[{:3d}\/{:3d}] d_loss: {:.4f}, g_loss: {:.4f}, D(x): {:.2f}, D(G(z)): {:.2f}'.format(\r\n        epoch, EPOCHS, d_loss.item(), g_loss.item(), real_score.mean().item(), fake_score.mean().item()))\r\n\r\n    z = torch.randn(BATCH_SIZE, z_size, 1, 1).to(DEVICE)\r\n    fake_images = G(z)\r\n\r\n    for row in range(4):\r\n        for col in range(3):\r\n            fake_images_img = np.reshape(fake_images.data.cpu().numpy()[row*4+col],(28,28))\r\n            axis = axes[row][col]\r\n            axis.get_xaxis().set_ticks([])\r\n            axis.get_yaxis().set_ticks([])\r\n            axis.imshow(fake_images_img, cmap='gray')\r\n    \r\n    plt.savefig('.\/data\/CNN_GAN_{:03d}.jpg'.format(epoch))\r\n<\/pre>\n<p>\uc2e4\ud589\ud574\ubcf4\uba74 GAN\ubcf4\ub2e4 DCGAN\uc774 \ub354 \ube68\ub9ac \uc758\ubbf8\uc788\ub294 \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud574 \ub0b4\uae30 \uc2dc\uc791\ud569\ub2c8\ub2e4. \ub610\ud55c \ubcf4\ub2e4 \ub354 \ub192\uc740 \ud488\uc9c8\uc758, \ub354 \ub2e4\uc591\ud55c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud574 \ubcf4\ub0b4\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc544\ub798\ub294 DCGAN\uc5d0 \uc758\ud55c \uac01 \uc5d0\ud3ed \ub2e8\uc704\ubcc4 \uc21c\uc11c\ub300\ub85c \uc0dd\uc131\ub41c \uacb0\uacfc\uc785\ub2c8\ub2e4.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/2020\/01\/CNN_GAN.gif\" alt=\"\" width=\"640\" height=\"480\" class=\"aligncenter size-full wp-image-8806\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>GAN\uc740 Generative Adversarial Network\ub85c \uc801\ub300\uc801 \uc0dd\uc131 \uc2e0\uacbd\ub9dd\uc785\ub2c8\ub2e4. \uc989, \ubb34\uc5b8\uac00\ub97c \uc0dd\uc131\ud558\ub294 \uc2e0\uacbd\ub9dd\uc778\ub370.. \uadf8 \ubb34\uc5b8\uac00\ub97c \uc81c\ub300\ub85c \uc798\uc0dd\uc131\ud558\uae30 \uc704\ud574 \ub204\uad70\uac00\ub97c \uc798\uc18d\uc774\uae30 \uc704\ud55c \uc804\ub7b5\uc744 \ucde8\ud569\ub2c8\ub2e4. \ud754\ud788 GAN\uc5d0 \ub300\ud55c \uc774\ub7ec\ud55c \uc124\uba85\uc744 \uc704\uc870\uc9c0\ud3d0\ubc94\uacfc \uc9c0\ud3d0\ud310\ubcc4\uc0ac\uc758 \uc608\ub97c \ub9ce\uc774 \ub4ed\ub2c8\ub2e4. \uc704\uc870\uc9c0\ud3d0\ubc94\uc740 \uc704\uc870\uc9c0\ud3d0\ub97c \ub9cc\ub4e4\uc5b4 \uc9c0\ud3d0\ud310\ubcc4\uc0ac\uc5d0\uac8c \uc804\ub2ec\ud558\uba74 \ud310\ubcc4\uc0ac\ub294 \uc774\uac8c \uac00\uc9dc\uc778\uc9c0 \uc9c4\uc9dc\uc778\uc9c0\ub97c \ud310\ubcc4\ud574\uc11c \uc9c0\ud3d0\ubc94\uc5d0\uac8c \uc5bc\ub9c8\ub098 \uac00\uc9dc\uac19\uc740\uc9c0\ub97c \uc54c\ub824\uc8fc\uace0, \uc704\uc870\uc9c0\ud3d0\ubc94\uc740 \ud310\ubcc4\uc0ac\uc5d0\uac8c\uc11c \uc5bb\uc740 \ud53c\ub4dc\ubc31\uc744 \ud1b5\ud574 \uc880\ub354 \uc9c4\uc9dc\uac19\uc740 \uc704\uc870\uc9c0\ud3d0\ub97c \ub9cc\ub4e4\uc5b4 \ub2e4\uc2dc &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/www.gisdeveloper.co.kr\/?p=8660\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;\uc801\ub300\uc801 \uc0dd\uc131 \uc2e0\uacbd\ub9dd GAN&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[132],"tags":[],"class_list":["post-8660","post","type-post","status-publish","format-standard","hentry","category-deep-machine-learning"],"_links":{"self":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/8660","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=8660"}],"version-history":[{"count":21,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/8660\/revisions"}],"predecessor-version":[{"id":9342,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/8660\/revisions\/9342"}],"wp:attachment":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=8660"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=8660"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=8660"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}