深度卷積式 GAN

使用 PyTorch 進行影像深度學習

Michal Oleszak

Machine Learning Engineer

Deep Convolutional GAN 直覺

  • 在判別器以卷積層取代線性層
  • 在生成器可使用反卷積(轉置卷積)
  • 訓練 GAN 常不穩定,需更多調整
使用 PyTorch 進行影像深度學習

DCGAN 準則

  • 深度卷積式 GAN(DCGAN)
  • DCGAN 準則:
    • 只用具步幅的卷積
    • 不用任何線性層或池化層
    • 使用批次正規化
    • 生成器用 ReLU(最後一層用 tanh)
    • 判別器用 Leaky ReLU

啟用函式圖

使用 PyTorch 進行影像深度學習

具步幅的卷積

步幅為 1 的卷積:

無步幅卷積的動畫。

nn.Conv2d(..., stride=1)

步幅為 2 的卷積:

具步幅卷積的動畫。

nn.Conv2d(..., stride=2)
使用 PyTorch 進行影像深度學習

卷積式生成器區塊

def dc_gen_block(
    in_dim, out_dim, kernel_size, stride
):

return nn.Sequential( nn.ConvTranspose2d( in_dim, out_dim, kernel_size, stride=stride, ),
nn.BatchNorm2d(out_dim),
nn.ReLU() )

生成器區塊包含:

  • 具步幅的反卷積
  • 批次正規化
  • ReLU 啟用
使用 PyTorch 進行影像深度學習

深度卷積式生成器

class DCGenerator(nn.Module):
    def __init__(self, in_dim, kernel_size=4, stride=2):
        super(Generator, self).__init__()
        self.in_dim = in_dim

self.gen = nn.Sequential( dc_gen_block(in_dim, 1024, kernel_size, stride), dc_gen_block(1024, 512, kernel_size, stride), dc_gen_block(512, 256, kernel_size, stride),
nn.ConvTranspose2d(256, 3, kernel_size, stride=stride),
nn.Tanh() )
def forward(self, x): x = x.view(len(x), self.in_dim, 1, 1) return self.gen(x)
使用 PyTorch 進行影像深度學習

卷積式判別器區塊

def dc_disc_block(
    in_dim, out_dim, kernel_size, stride
):

return nn.Sequential( nn.Conv2d( in_dim, out_dim, kernel_size, stride=stride, ),
nn.BatchNorm2d(out_dim),
nn.LeakyReLU(0.2), )

判別器區塊包含:

  • 具步幅的卷積
  • 批次正規化
  • Leaky ReLU 啟用
使用 PyTorch 進行影像深度學習

深度卷積式判別器

class Discriminator(nn.Module):
    def __init__(self, kernel_size=4, stride=2):
        super(Discriminator, self).__init__()

self.disc = nn.Sequential( dc_disc_block(3, 512, kernel_size, stride), dc_disc_block(512, 1024, kernel_size, stride), nn.Conv2d(1024, 1, kernel_size, stride=stride), )
def forward(self, x): x = self.disc(x) return x.view(len(x), -1)
使用 PyTorch 進行影像深度學習

一起來練習吧!

使用 PyTorch 進行影像深度學習

Preparing Video For Download...