我的目标是用纯黑色和白色创建简单的几何线条图。我不需要灰色调。像这样的东西(训练图像的例子):
但是使用该 GAN 会产生灰色调的图像。例如,这里是生成图像的一些细节。
我使用这个基于 Pytorch 的 Vanilla GAN作为我正在尝试做的事情的基础。我怀疑我的 GAN 在计算所有这些浮点数时做的工作太多了。我很确定在 nn 中使用 -1 和 1 之间的数字是标准化的?我读过由于 tanh 激活层的问题,尝试使用 0 和 1 是个坏主意。那么还有其他想法吗?这是我的鉴别器和生成器的代码。
image_size=248
batch_size = 10
n_noise = 100
class Discriminator(nn.Module):
"""
Simple Discriminator w/ MLP
"""
def __init__(self, input_size=image_size ** 2, num_classes=1):
super(Discriminator, self).__init__()
self.layer = nn.Sequential(
nn.Linear(input_size, 512),
nn.LeakyReLU(0.2),
nn.Linear(512, 256),
nn.LeakyReLU(0.2),
nn.Linear(256, num_classes),
nn.Sigmoid(),
)
def forward(self, x):
y_ = x.view(x.size(0), -1)
y_ = self.layer(y_)
return y_
发电机:
class Generator(nn.Module):
"""
Simple Generator w/ MLP
"""
def __init__(self, input_size=batch_size, num_classes=image_size ** 2):
super(Generator, self).__init__()
self.layer = nn.Sequential(
nn.Linear(input_size, 128),
nn.LeakyReLU(0.2),
nn.Linear(128, 256),
nn.BatchNorm1d(256),
nn.LeakyReLU(0.2),
nn.Linear(256, 512),
nn.BatchNorm1d(512),
nn.LeakyReLU(0.2),
nn.Linear(512, 1024),
nn.BatchNorm1d(1024),
nn.LeakyReLU(0.2),
nn.Linear(1024, num_classes),
nn.Tanh()
)
def forward(self, x):
y_ = self.layer(x)
y_ = y_.view(x.size(0), 1, image_size, image_size)
return y_
到目前为止,我所拥有的几乎消耗了我拥有的所有可用内存,因此简化它和/或加速它都是一个优点。我的输入图像是 248 像素 x 248 像素。如果我比这更小,它们就不再有用了。所以比创建原始 GAN 的 MNIST 数字 (28x28) 大得多。我对这一切也很陌生,因此也感谢任何其他建议。
编辑:到目前为止我已经尝试过什么。我尝试通过使用此类生成输出二进制(-1 或 1)来生成生成器 B&W 的最终输出:
class Binary(nn.Module):
def __init__(self):
super(Binary, self).__init__()
def forward(self, x):
x2 = x.clone()
x2 = x2.sign()
x2[x2==0] = -1.
x = x2
return x
然后我nn.Tanh()
用Binary()
. 它确实生成了黑白图像。但无论多少个 epoch,输出看起来仍然是随机的。使用灰度,nn.Tanh()
我至少看到了不错的结果。