-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathdcgan_discriminator.py
47 lines (40 loc) · 1.76 KB
/
dcgan_discriminator.py
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
import torch
# Discriminator model
class Discriminator(torch.nn.Module):
def __init__(self, input_dim, num_filters, output_dim):
super(Discriminator, self).__init__()
print("\n------Initiating Discriminator------\n")
# Hidden layers
self.hidden_layer = torch.nn.Sequential()
for i in range(len(num_filters)):
# Convolutional layer
if i == 0:
conv = torch.nn.Conv2d(input_dim, num_filters[i], kernel_size=4, stride=2, padding=1)
else:
conv = torch.nn.Conv2d(num_filters[i-1], num_filters[i], kernel_size=4, stride=2, padding=1)
conv_name = 'conv' + str(i + 1)
self.hidden_layer.add_module(conv_name, conv)
# Initializer
torch.nn.init.normal_(conv.weight, mean=0.0, std=0.02)
torch.nn.init.constant_(conv.bias, 0.0)
# Batch normalization
if i != 0:
bn_name = 'bn' + str(i + 1)
self.hidden_layer.add_module(bn_name, torch.nn.BatchNorm2d(num_filters[i]))
# Activation
act_name = 'act' + str(i + 1)
self.hidden_layer.add_module(act_name, torch.nn.LeakyReLU(0.2))
# Output layer
self.output_layer = torch.nn.Sequential()
# Convolutional layer
out = torch.nn.Conv2d(num_filters[i], output_dim, kernel_size=4, stride=1, padding=0)
self.output_layer.add_module('out', out)
# Initializer
torch.nn.init.normal_(out.weight, mean=0.0, std=0.02)
torch.nn.init.constant_(out.bias, 0.0)
# Activation
self.output_layer.add_module('act', torch.nn.Sigmoid())
def forward(self, x):
h = self.hidden_layer(x)
out = self.output_layer(h)
return out