summaryrefslogtreecommitdiff
path: root/models
diff options
context:
space:
mode:
Diffstat (limited to 'models')
-rw-r--r--models/networks.py31
1 files changed, 31 insertions, 0 deletions
diff --git a/models/networks.py b/models/networks.py
index 3c54138..568f8c9 100644
--- a/models/networks.py
+++ b/models/networks.py
@@ -135,6 +135,8 @@ def define_D(input_nc, ndf, which_model_netD,
netD = NLayerDiscriminator(input_nc, ndf, n_layers=3, norm_layer=norm_layer, use_sigmoid=use_sigmoid, gpu_ids=gpu_ids)
elif which_model_netD == 'n_layers':
netD = NLayerDiscriminator(input_nc, ndf, n_layers_D, norm_layer=norm_layer, use_sigmoid=use_sigmoid, gpu_ids=gpu_ids)
+ elif which_model_netD == 'pixel':
+ netD = PixelDiscriminator(input_nc, ndf, norm_layer=norm_layer, use_sigmoid=use_sigmoid, gpu_ids=gpu_ids)
else:
raise NotImplementedError('Discriminator model name [%s] is not recognized' %
which_model_netD)
@@ -431,3 +433,32 @@ class NLayerDiscriminator(nn.Module):
return nn.parallel.data_parallel(self.model, input, self.gpu_ids)
else:
return self.model(input)
+
+class PixelDiscriminator(nn.Module):
+ def __init__(self, input_nc, ndf=64, norm_layer=nn.BatchNorm2d, use_sigmoid=False, gpu_ids=[]):
+ super(PixelDiscriminator, self).__init__()
+ self.gpu_ids = gpu_ids
+ if type(norm_layer) == functools.partial:
+ use_bias = norm_layer.func == nn.InstanceNorm2d
+ else:
+ use_bias = norm_layer == nn.InstanceNorm2d
+
+ self.net = [
+ nn.Conv2d(input_nc, ndf, kernel_size=1, stride=1, padding=0),
+ nn.LeakyReLU(0.2, True),
+ nn.Conv2d(ndf, ndf * 2, kernel_size=1, stride=1, padding=0, bias=use_bias),
+ norm_layer(ndf * 2),
+ nn.LeakyReLU(0.2, True),
+ nn.Conv2d(ndf * 2, 1, kernel_size=1, stride=1, padding=0, bias=use_bias)]
+
+ if use_sigmoid:
+ self.net.append(nn.Sigmoid())
+
+ self.net = nn.Sequential(*self.net)
+
+ def forward(self, input):
+ if len(self.gpu_ids) and isinstance(input.data, torch.cuda.FloatTensor):
+ return nn.parallel.data_parallel(self.net, input, self.gpu_ids)
+ else:
+ return self.net(input)
+