我正在MVTec 榛子数据集上训练tf,我发现了一些困难。问题是,在经历了许多时代之后,生成的图像并不能产生一些高质量的图像。
我的模型如下:
def build_generator(self, noise_dim):
#
# Input shape (None, 100)
# Output shape (None, 64, 64, 3)
#
model = Sequential(name = "Generator")
model.add(Dense(4*4*512, input_dim = noise_dim, activation = "relu", use_bias = False))
model.add(BatchNormalization())
model.add(Reshape((4,4,512)))
model.add(Conv2DTranspose(512, (5, 5), strides = (2, 2), padding = "same", activation = "relu", use_bias = False))
model.add(BatchNormalization())
model.add(Conv2DTranspose(256, (5, 5), strides = (2, 2), padding = "same", activation = "relu", use_bias = False))
model.add(BatchNormalization())
model.add(Conv2DTranspose(128, (5, 5), strides = (2, 2), padding = "same", activation = "relu", use_bias = False))
model.add(BatchNormalization())
model.add(Conv2DTranspose(64, (5, 5), strides = (2, 2), padding = "same", activation = "relu", use_bias = False))
model.add(BatchNormalization())
model.add(Conv2DTranspose(3, (5, 5), activation = "tanh", padding = "same", use_bias = False))
assert model.output_shape == (None, 64, 64, 3)
return model
def build_discriminator(self, image_shape):
model = Sequential(name = "Discriminator")
model.add(Conv2D(64, kernel_size = (5, 5), strides = (2, 2), input_shape = image_shape, padding = "same"))
model.add(BatchNormalization())
model.add(LeakyReLU(0.2))
model.add(Dropout(0.3))
model.add(Conv2D(128, kernel_size = (5, 5), strides = (2, 2), padding = "same"))
model.add(BatchNormalization())
model.add(LeakyReLU(0.2))
model.add(Dropout(0.3))
model.add(Conv2D(256, kernel_size = (5, 5), strides = (2, 2), padding = "same"))
model.add(BatchNormalization())
model.add(LeakyReLU(0.2))
model.add(Dropout(0.3))
model.add(Conv2D(512, kernel_size = (5, 5), strides = (2, 2), padding = "same"))
model.add(BatchNormalization())
model.add(LeakyReLU(0.2))
model.add(Dropout(0.3))
model.add(Flatten())
model.add(Dense(1))
return model我尝试了一些以前的配置,我认为这是最好的,它似乎学习比模型更少的过滤器。
关于训练集,它只有391幅图像,它似乎是一个很差的数据集来训练一个GAN,所以我尝试了一些数据增强来收集更多的图像。特别是我使用了RandomTranslation、RandomRotation和RandomZoom tensorflow的层。在1564幅图像(标准化的介于1和1之间)之后,训练速度似乎又快了一点:在100个年代之后,G_loss的值在1到2之间,D_loss在0.5到1之间。然而,生成的图像似乎并不真实。
有人能帮忙如何使我的GAN收敛吗?提前谢谢。
发布于 2022-08-16 10:33:37
首先,您的鉴别器输出应该使用sigmoid激活(假设您使用二进制交叉熵或wasserstein损失)。我不确定这是否能解决你的问题。我认为,您的模型没有收敛的原因是与您的模型相对较大的复杂性相比,用于培训的样本数量很少。您可以使用MNIST或CelebA数据集(70.000和~200.000图像)尝试相同的体系结构,并查看是否仍然存在问题。
发布于 2022-09-20 11:56:24
如果其他人有类似的问题,我会把我的解决方案发出去。
在这种情况下,GAN没有收敛,因为鉴别器太好了。这是一个常见的问题:如果鉴别器能够区分真实的例子和假的例子,它将永远不会给生成器任何改进数据生成的建议。所以模型会有分歧。
在这种情况下,我从网络中删除了一个隐藏层。
def build_discriminator(self):
model = Sequential(name = "Discriminator")
model.add(Conv2D(64, kernel_size = (5, 5), strides = (2, 2), input_shape = self.image_shape, padding = "same"))
model.add(BatchNormalization())
model.add(LeakyReLU(0.2))
model.add(Dropout(0.3))
model.add(Conv2D(128, kernel_size = (5, 5), strides = (2, 2), padding = "same"))
model.add(BatchNormalization())
model.add(LeakyReLU(0.2))
model.add(Dropout(0.3))
model.add(Conv2D(256, kernel_size = (5, 5), strides = (2, 2), padding = "same"))
model.add(BatchNormalization())
model.add(LeakyReLU(0.2))
model.add(Dropout(0.3))
model.add(Flatten())
model.add(Dense(1))
return modelhttps://datascience.stackexchange.com/questions/113566
复制相似问题