gan_loss = criterion_adv(discriminator(gen_parts), real);real = torch.FloatTensor(batch_size, *patch).fill_(1.0).requires_grad_(False).to(device);# 判别器 class Discriminator(nn.Module): def __init__(self, channels=3): super(Discriminator, self).__init__() # def discriminator_block(in_filters, out_filters, stride, normalize, dropout, spectral): # 谱范数正则化,提高泛化能力 """Returns layers of each discriminator block""" # if spectral: layers = [nn.utils.spectral_norm(nn.Conv2d(in_filters, out_filters, 3, stride, 1), n_power_iterations=2)] else: layers = [nn.Conv2d(in_filters, out_filters, 3, stride, 1)] if normalize: layers.append(nn.InstanceNorm2d(out_filters)) layers.append(nn.LeakyReLU(0.2, inplace=True)) if dropout: layers.append(nn.Dropout(p=0.5)) return layers layers = [] in_filters = channels # 总共有四次卷积操作,因为没有设置dropout(随机设置一些值为0避免过拟合)和spectral所以此处并没有进行 for out_filters, stride, normalize, dropout, spectral in [(64, 2, False, 0, 0), (128, 2, True, 0, 0), (256, 2, True, 0, 0), (512, 1, True, 0, 0)]: layers.extend(discriminator_block(in_filters, out_filters, stride, normalize, dropout, spectral)) in_filters = out_filters layers.append(nn.Conv2d(out_filters, 1, 3, 1, 1)) self.model = nn.Sequential(*layers) def forward(self, img): return self.model(img)