GAN Discriminator拒绝生成的模型

时间:2019-12-01 17:49:15

标签: python tensorflow machine-learning generator discriminator

我有GAN网络,应该会生成剑的3D模型。我基于生成数字图像的Tensorflow GAN教程构建了该文档:https://www.tensorflow.org/tutorials/generative/dcgan

我正在将.obj文件(所有模型具有240个面)转换为垫[240;9](其中9是面顶点的坐标)。 所有坐标<= 1.0,并且我的数据集中有3000多个模型。

我混合了3D模型矩阵并开始学习GAN网络。每隔100个周期,我会打印以下鉴别器预测的平均值:用于学习的数据集,用于检查鉴别器的未使用模型的数据集,生成的模型和垃圾(随机生成的矩阵[240,9]

鉴别器的激活函数是线性的:如果结果> 0 =>鉴别器接受的模型,如果结果<0,则表示鉴别器被拒绝的模型。

但是我得到的结果是:

> 1-th epoch:
> Learned Dataset AVG Prediction: ~ 0.002
> Unused Checking Dataset AVG Prediction ~ 0.0018
> Generated Dataset AVG Prediction ~ -0.002
> Garbage Dataset AVG Prediction ~ -1.5
> 
> 6000-th epoch:
> Learned Dataset AVG Prediction: ~ 17.000
> Unused Checking Dataset AVG Prediction ~ 19.000
> Generated Dataset AVG Prediction ~ -3.000
> Garbage Dataset AVG Prediction ~ -20000.000

这意味着鉴别器学习正确,但是生成器无法欺骗鉴别器。而且我得到了像剑一样的3D模型,但是多边形随机旋转并且没有连接:https://imgur.com/FGOVDTT(100.000个历元)

我是对的,我的数据集是好的,鉴别器可以正确学习吗? 我应该改变发电机模型网络的结构吗? 进行此类培训的原因可能是什么?

def make_generator_model():
    model = tf.keras.Sequential()
    model.add(layers.Dense(30 * 9 * 512, use_bias=False, input_shape=(100,)))
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())

    model.add(layers.Reshape((30, 9, 512)))
    assert model.output_shape == (None, 30, 9, 512)  # Note: None is the batch size

    model.add(layers.Conv2DTranspose(128, (5, 5), strides=(2, 1), padding='same', use_bias=False))
    assert model.output_shape == (None, 60, 9, 128)
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())

    model.add(layers.Conv2DTranspose(64, (5, 5), strides=(2, 1), padding='same', use_bias=False))
    assert model.output_shape == (None, 120, 9, 64)
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())

    model.add(layers.Conv2DTranspose(1, (5, 5), strides=(2, 1), padding='same', use_bias=False, activation='tanh'))
    assert model.output_shape == (None, 240, 9, 1)

    return model

我程序中的所有其他代码与TensorFlow网站中的代码相同

1 个答案:

答案 0 :(得分:0)

在这种情况下,有很多原因导致发电机难以产生良好的输出。我想到的第一件事是您使用的表示形式。假设3D模型中没有孔,这意味着相邻面的关节顶点必须完全匹配。 这很难实现,因为您的输出是浮点型的,因此在面之间可能会有很多小缝隙或重叠部分,您可能无法在原始数据集中找到这些特征。这使您的鉴别器很容易区分生成的样本。 (几乎每个顶点都出现多次->原始样本,顶点位置之间的差异很小->生成的样本)

解决此问题的一种方法是更改​​您的表示形式,例如以下选项之一:

  1. 用其中心点表示每个面,只需将每个点与其三个最近的邻居连接起来即可创建3D模型。
  2. 单独保存每个顶点,然后通过将每个顶点与其最接近的三个邻居相连来重建曲面。

选项1)的另一个优点是可以进一步减少您的输入空间,但是可能导致结果略有不同。如上所述,有些边缘外壳表面无法表示,但这是最简单的方法。如果您有无法以这种方式表示的复杂3D模型,则必须提出其他建议,但是有很多选择。