【发布时间】:2018-04-26 18:55:22
【问题描述】:
我正在学习 GAN 我已经完成了一门课程,该课程为我提供了一个基于输入示例生成图像的程序示例。
示例可以在这里找到:
https://github.com/davidsonmizael/gan
所以我决定使用它来基于面部正面照片数据集生成新图像,但我没有取得任何成功。与上例不同的是,代码只产生噪声,而输入有实际图像。
实际上,我不知道应该更改什么以使代码指向正确的方向并从图像中学习。我没有更改示例中提供的代码的单个值,但它不起作用。
如果有人能帮助我理解这一点并指出正确的方向,那将非常有帮助。提前致谢。
我的鉴别器:
class D(nn.Module):
def __init__(self):
super(D, self).__init__()
self.main = nn.Sequential(
nn.Conv2d(3, 64, 4, 2, 1, bias = False),
nn.LeakyReLU(0.2, inplace = True),
nn.Conv2d(64, 128, 4, 2, 1, bias = False),
nn.BatchNorm2d(128),
nn.LeakyReLU(0.2, inplace = True),
nn.Conv2d(128, 256, 4, 2, 1, bias = False),
nn.BatchNorm2d(256),
nn.LeakyReLU(0.2, inplace = True),
nn.Conv2d(256, 512, 4, 2, 1, bias = False),
nn.BatchNorm2d(512),
nn.LeakyReLU(0.2, inplace = True),
nn.Conv2d(512, 1, 4, 1, 0, bias = False),
nn.Sigmoid()
)
def forward(self, input):
return self.main(input).view(-1)
我的发电机:
class G(nn.Module):
def __init__(self):
super(G, self).__init__()
self.main = nn.Sequential(
nn.ConvTranspose2d(100, 512, 4, 1, 0, bias = False),
nn.BatchNorm2d(512),
nn.ReLU(True),
nn.ConvTranspose2d(512, 256, 4, 2, 1, bias = False),
nn.BatchNorm2d(256),
nn.ReLU(True),
nn.ConvTranspose2d(256, 128, 4, 2, 1, bias = False),
nn.BatchNorm2d(128),
nn.ReLU(True),
nn.ConvTranspose2d(128, 64, 4, 2, 1, bias = False),
nn.BatchNorm2d(64),
nn.ReLU(True),
nn.ConvTranspose2d(64, 3, 4, 2, 1, bias = False),
nn.Tanh()
)
def forward(self, input):
return self.main(input)
我开始权重的功能:
def weights_init(m):
classname = m.__class__.__name__
if classname.find('Conv') != -1:
m.weight.data.normal_(0.0, 0.02)
elif classname.find('BatchNorm') != -1:
m.weight.data.normal_(1.0, 0.02)
m.bias.data.fill_(0)
完整代码可以看这里:
https://github.com/davidsonmizael/criminal-gan
【问题讨论】:
-
我现在没有时间下载你的代码和数据来尝试它,但我已经尝试通过代码和你的 gan.py 的第 80 行你有
target = Variable(torch.ones(input.size()[0])).cuda()-就像总是调用 cuda(),即使不一定使用(因此其他变量不是 cuda())。 -
也许它需要超过 25 个 epoch 才能开始生成有意义的东西?
-
@KenSyme 是的,忘记 cuda。我已经在一切之后添加了它,我还没有机会测试它,但我想添加支持。这不是问题:/
-
@vasia 使用我自己的代码,我可以看到自第一个时期以来出现的一些结果,通过反向传播,每个时期的输出应该至少有点不同
-
@davis 并没有忘记 cuda - 在大多数情况下,您正确地检查了您的标志并将变量移动到 cuda,前提是它已设置。在这种情况下,您总是在变量上调用 cuda(您随后也进行检查) - 看起来像复制和粘贴错误。如果该变量在 cuda 上而其余的不是,我无法想象事情会顺利进行。
标签: python neural-network pytorch