gpt4 book ai didi

python - GAN 判别器否认生成的模型

转载 作者:行者123 更新时间:2023-11-30 10:00:46 24 4
gpt4 key购买 nike

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

我正在将 .obj 文件(所有模型都有 240 个面)转换为 mat [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 网站中的代码相同

最佳答案

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

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

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

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

关于python - GAN 判别器否认生成的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59128265/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com