简介
DCGAN 通过对各种图像数据集的训练,展示了令人信服的证据,即深度卷积对抗对在生成器和鉴别器中学习了从对象部分到场景的表示层次。将深度卷积神经网络成功地应用在 GAN 方法里。同时展示了隐空间向量可以进行有意义的加减运算。
提出以下几点改进:
-
用 stride 代替池化层
-
使用 Batchnorm,除了生成器的输出层和判别器的输入层
-
移除全连接,但是在噪声输入进生成器时会进行线性映射再 reshape
-
使用 ReLU 在生成器中,最后一层为 Tanh
-
使用 LeakyReLU 在判别器中
超参数:
-
Adam ,
-
lr = 0.0002
生成器:
判别器:
处理流程反过来,最后没有全局池化,而是 reshape 后,接一层全连接输出 1 个标量
code
生成器
class Generator(nn.Module):
def __init__(self):
super(Generator, self).__init__()
self.l1 = nn.Sequential(nn.Linear(100, 1024*4*4))
self.conv_blocks = nn.Sequential(
nn.BatchNorm2d(1024),
nn.ConvTranspose2d(1024, 512, 4, 2, 1, bias=False),
nn.BatchNorm2d(128, 0.8),
nn.ReLU(inplace=True),
nn.ConvTranspose2d(1024, 512, 4, 2, 1, bias=False),
nn.BatchNorm2d(64, 0.8),
nn.ReLU(inplace=True),
nn.ConvTranspose2d(1024, 512, 4, 2, 1, bias=False),
nn.Tanh(),
)
def forward(self, z):
out = self.l1(z)
out = out.view(out.shape[0], 1024, 4, 4)
img = self.conv_blocks(out)
return img
判别器
class Discriminator(nn.Module):
def __init__(self):
super(Discriminator, self).__init__()
def discriminator_block(in_filters, out_filters, bn=True):
block = [nn.Conv2d(in_filters, out_filters, 5, 2, 1), nn.LeakyReLU(0.2, inplace=True), nn.Dropout2d(0.25)]
if bn:
block.append(nn.BatchNorm2d(out_filters, 0.8))
return block
self.model = nn.Sequential(
*discriminator_block(opt.channels, 256, bn=False),
*discriminator_block(256, 512),
*discriminator_block(512, 1024),
)
self.adv_layer = nn.Sequential(nn.Linear(1024, 1), nn.Sigmoid())
def forward(self, img):
out = self.model(img)
out = out.view(out.shape[0], -1)
validity = self.adv_layer(out)
return validity
权重初始化
def _weights_init(m):
classname = m.__class__.__name__
if classname.find('Conv') != -1:
nn.init.normal_(m.weight.data, 0.0, 0.02)
elif classname.find('BatchNorm') != -1:
nn.init.normal_(m.weight.data, 1.0, 0.02)
nn.init.constant_(m.bias.data, 0)
loss 计算
adversarial_loss = torch.nn.BCELoss()
valid = Variable(Tensor(imgs.shape[0], 1).fill_(1.0), requires_grad=False)
fake = Variable(Tensor(imgs.shape[0], 1).fill_(0.0), requires_grad=False)
real_imgs = Variable(imgs.type(Tensor))
optimizer_G.zero_grad()
z = Variable(Tensor(np.random.normal(0, 1, (imgs.shape[0], 100))))
gen_imgs = generator(z)
g_loss = adversarial_loss(discriminator(gen_imgs), valid)
g_loss.backward()
optimizer_G.step()
optimizer_D.zero_grad()
real_loss = adversarial_loss(discriminator(real_imgs), valid)
fake_loss = adversarial_loss(discriminator(gen_imgs.detach()), fake)
d_loss = (real_loss + fake_loss) / 2
d_loss.backward()
optimizer_D.step()
参考链接:
AI众包项目推荐
咪豆AI圈(Meedo)针对当前人工智能领域行业入门成本较高、碎片化信息严重、资源链接不足等痛点问题,致力于打造人工智能领域的全资源、深内容、广链接三位一体的在线科研社区平台,提供AI导航网、AI版知乎,AI知识树和AI圈子等服务,欢迎AI未来儿一起来探索(www.meedo.top/)