1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| import torch import torch.nn as nn
class Generator(nn.Module): def __init__(self, latent_dim=100, channels=3): super().__init__() self.init_size = 4 self.l1 = nn.Sequential( nn.Linear(latent_dim, 256 * self.init_size ** 2) ) self.conv_blocks = nn.Sequential( nn.BatchNorm2d(256), nn.Upsample(scale_factor=2), nn.Conv2d(256, 256, 3, padding=1), nn.BatchNorm2d(256), nn.ReLU(inplace=True), nn.Upsample(scale_factor=2), nn.Conv2d(256, 128, 3, padding=1), nn.BatchNorm2d(128), nn.ReLU(inplace=True), nn.Upsample(scale_factor=2), nn.Conv2d(128, 64, 3, padding=1), nn.BatchNorm2d(64), nn.ReLU(inplace=True), nn.Upsample(scale_factor=2), nn.Conv2d(64, channels, 3, padding=1), nn.Tanh() ) def forward(self, z): out = self.l1(z).view(z.size(0), 256, self.init_size, self.init_size) img = self.conv_blocks(out) return img
class Discriminator(nn.Module): def __init__(self, channels=3): super().__init__() def discriminator_block(in_filters, out_filters): layers = [ nn.Conv2d(in_filters, out_filters, 3, 2, 1), nn.LeakyReLU(0.2, inplace=True), nn.Dropout2d(0.25) ] return layers self.model = nn.Sequential( *discriminator_block(channels, 32), *discriminator_block(32, 64), *discriminator_block(64, 128), *discriminator_block(128, 256), nn.Flatten(), nn.Linear(256 * 4 * 4, 1), nn.Sigmoid() ) def forward(self, img): return self.model(img)
|