我有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网站中的代码相同
答案 0 :(得分:0)
在这种情况下,有很多原因导致发电机难以产生良好的输出。我想到的第一件事是您使用的表示形式。假设3D模型中没有孔,这意味着相邻面的关节顶点必须完全匹配。 这很难实现,因为您的输出是浮点型的,因此在面之间可能会有很多小缝隙或重叠部分,您可能无法在原始数据集中找到这些特征。这使您的鉴别器很容易区分生成的样本。 (几乎每个顶点都出现多次->原始样本,顶点位置之间的差异很小->生成的样本)
解决此问题的一种方法是更改您的表示形式,例如以下选项之一:
选项1)的另一个优点是可以进一步减少您的输入空间,但是可能导致结果略有不同。如上所述,有些边缘外壳表面无法表示,但这是最简单的方法。如果您有无法以这种方式表示的复杂3D模型,则必须提出其他建议,但是有很多选择。