生成自定义图像的 GAN 不起作用

数据挖掘 张量流
2022-02-14 13:30:58

我在云端训练 GAN 已经有一段时间了。我使用谷歌的免费信用。我的带有 CPU 的笔记本电脑似乎无法胜任这项任务。

我要生成的图像是这样的。 在此处输入图像描述

即使时代的数量约为 15000,我也没有得到任何接近原始的东西。

这是主要代码。我并没有声称完全理解深层。写这段代码也花了几天时间。其余代码是训练的样板。

没有编译错误,我使用 TensorBoard 查看图像。

生成器的输出是 (1024,1024) 图像。这应该与我的原始图像相同,即 (299,299) 图像。

我应该使用公式计算每层如何转换图像以更好地理解它吗?

我该如何解决 ?我混合和匹配 API 只是为了创建一个工作示例,假设不会产生任何问题。

X = tf.placeholder(tf.float32, shape=[None, 299, 299, 1], name='X')


Z = tf.placeholder(dtype=tf.float32,
                              shape=(None, 100),
                              name='Z')
is_training = tf.placeholder(dtype=tf.bool,name='is_training')

keep_prob = tf.placeholder(dtype=tf.float32, name='keep_prob')
keep_prob_value = 0.6


def generator(z,reuse=False, keep_prob=keep_prob_value,is_training=is_training):
    with tf.variable_scope('generator',reuse=reuse):
        linear = tf.layers.dense(z, 1024 * 8 * 8)
        linear  = tf.contrib.layers.batch_norm(linear, is_training=is_training,decay=0.88)
        conv = tf.reshape(linear, (-1, 128, 128, 8))
        out = tf.layers.conv2d_transpose(conv, 64,kernel_size=4,strides=2, padding='SAME')
        out = tf.layers.dropout(out, keep_prob)
        out = tf.contrib.layers.batch_norm(out, is_training=is_training,decay=0.88)
        out = tf.nn.leaky_relu(out)
        out = tf.layers.conv2d_transpose(out, 32,kernel_size=4,strides=2, padding='SAME')
        out = tf.layers.dropout(out, keep_prob)
        out = tf.contrib.layers.batch_norm(out, is_training=is_training,decay=0.88)
        out = tf.layers.conv2d_transpose(out, 1,kernel_size=4,strides=2, padding='SAME')
        out = tf.layers.dropout(out, keep_prob)
        out = tf.contrib.layers.batch_norm(out, is_training=is_training,decay=0.88)
        print( out.get_shape())
        out = tf.nn.leaky_relu(out)
        tf.nn.tanh(out)
        return out


def discriminator(x,reuse=False, keep_prob=keep_prob_value):
    with tf.variable_scope('discriminator',reuse=reuse):
        out = tf.layers.conv2d(x, filters=32, kernel_size=[3, 3], padding='SAME')
        out = tf.layers.dropout(out, keep_prob)
        out = tf.nn.leaky_relu(out)
        out = tf.layers.max_pooling2d(out, pool_size=[2, 2],padding='SAME', strides=2)
        out = tf.layers.conv2d(out, filters=64, kernel_size=[3, 3], padding='SAME')
        out = tf.layers.dropout(out, keep_prob)
        out = tf.nn.leaky_relu(out)
        out = tf.layers.max_pooling2d(out, pool_size=[2, 2],padding='SAME', strides=2)
        out = tf.layers.dense(out, units=256, activation=tf.nn.leaky_relu)
        out = tf.layers.dense(out, units=1, activation=tf.nn.sigmoid)
        return out


GeneratedImage = generator(Z)

DxL = discriminator(X)
DgL = discriminator(GeneratedImage, reuse=True)
1个回答

将文本生成为图像非常困难,我从未见过将 GAN 应用于图像空间来生成文本页面。之所以如此困难,是因为人类感知文本的方式以及 GAN 的工作方式。

人类读取任意符号,这些符号沿同一行从左到右排序并组合成行。此外,这些符号被组合成代表单词的组。这是极其复杂的。符号必须是可理解的,文字必须是人类发明的真实的。最后,将单词组合成句子需要符合逻辑并遵循人类语言的指导方针。甚至更进一步,句子的顺序必须连贯一致才能传递信息。

在图像空间中运行的 GAN 将尝试以像素方式学习训练集的分布,因为这是您的输入。像素的分布将无法有效地将字符以逻辑方式组合在一起,单词将不是真实的,句子将是无意义的。您很可能最终会看到模糊的随机符号线条,有点像斑马纹。

另一个问题是您拥有的数据量。即使 GAN 可以解决这个问题,您也需要数万个实例才能有效地训练 GAN。


我的建议

我建议阅读您正在训练的文本,并使用这些数据来训练 LSTM,这已被证明对生成语言非常有效。但是,请注意,即使使用最好的 LSTM,您也很少会收到可以欺骗人类认为其真实存在的文本。

LSTM 将为您提供文本。

然后你可以训练一个 GAN 来生成字母表的字符,你可以使用这个生成器打印出 LSTM 生成的文本。