【问题标题】:GAN Discriminator denies generated modelsGAN Discriminator 拒绝生成模型
【发布时间】:2019-12-01 17:49:15
【问题描述】:

我有 GAN 网络,可以生成剑的 3d 模型。我基于 Tensorflow GAN 生成数字图像教程:https://www.tensorflow.org/tutorials/generative/dcgan 构建它。

我正在将 .obj 文件(所有模型都有 240 个面)转换为 mat [240;9](其中 9 是面顶点的坐标)。 所有坐标

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

激活的判别器函数是线性的:如果结果是> 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 epoch)

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

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 站点中的代码相同

【问题讨论】:

    标签: python tensorflow machine-learning generator discriminator


    【解决方案1】:

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

    此问题的一种解决方案可能是更改您的表示,例如以下选项之一:

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

    选项 1) 具有进一步减少输入空间的额外优势,但可能会导致略有不同的结果。有一些边缘情况表面不能如上面描述的那样表示,但这些是最简单的方法。如果您有无法像这样表示的复杂 3D 模型,您必须想出其他东西,但有很多选项可供选择。

    【讨论】:

    • 我没有将 3d 模型存储在这样的结构中,担心在模型恢复过程中出现错误合并。好吧,显然,你正确建议的主要方向,我需要想出如何存储 3d 模型然后成功部署它。那么问题来了,理论上,这样的存储结构 3d 模型将在大量迭代下工作,或者不是事实,我需要对生成器的层进行试验?到目前为止,我将寻找有关如何存储 3d 模型的信息。使用 www.DeepL.com/Translator 翻译(免费版)
    • 是的,您可能需要进一步试验模型的架构,但现在我建议专注于手头的问题(3d 模型的表示)。我明白你为什么犹豫使用其中一种建议的方法,但我建议先尝试其中一种,然后再考虑更复杂的方法。实施这些简单的方法应该很快,然后您可以决定是否需要更复杂的方法。
    • 我刚刚想到的另一个想法:您可以调整损失函数,而不是更改表示。计算人脸的中心是一个可微函数,因此您可以将表示和模型保持原样,但将损失计算为中心的函数而不是顶点的函数。旧的:loss = mse(y_true-y_pred) 新的:loss = mse(compute_centers(y_true)-compute_centers(y_pred)) 确保在编写 compute_centers 方法时只使用 tf 可以区分的方法。让我更新,听起来是个有趣的项目;)
    • 我认为,我的损失计算对我在 mat 中保存模型的方式非常不利。我将尝试使用多中心来计算损失,但我认为这还不足以获得正确的旋转。我将尝试弄清楚如何将表面旋转添加到损失中。例如,我可以想到具有法线表面的东西。我尝试了2个简单的方法,但在所有方面如果我有4个影响深远的点,它就会连接在一起形成一个金字塔。我可以像几何任务一样解决它,但首先我需要知道如何使用 ML。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    相关资源
    最近更新 更多