VAE在Keras中显示3类图像上的潜在空间

VAE在Keras中显示3类图像上的潜在空间,keras,neural-network,autoencoder,Keras,Neural Network,Autoencoder,我正在训练一个带有未标记输入图像的可变自动编码器(VAE)。我的兴趣是在潜在空间中可视化3类未标记的数据。 我将潜在维度设置为128,并进一步使用PCA在2D中可视化 我对这一点还不熟悉,并希望对此有所澄清。 首先,当我训练网络时,我看到了显示的准确性和验证准确性。由于网络的输入图像没有标记,我想知道准确度的计算依据是什么。(根据我的阅读,准确度=正确预测的样本数/样本总数) 其次,我的培训代码如下所示: vae.compile(optimizer='rmsprop', loss=kl_

我正在训练一个带有未标记输入图像的可变自动编码器(VAE)。我的兴趣是在潜在空间中可视化3类未标记的数据。 我将潜在维度设置为128,并进一步使用PCA在2D中可视化

我对这一点还不熟悉,并希望对此有所澄清。 首先,当我训练网络时,我看到了显示的准确性和验证准确性。由于网络的输入图像没有标记,我想知道准确度的计算依据是什么。(根据我的阅读,准确度=正确预测的样本数/样本总数)

其次,我的培训代码如下所示:

    vae.compile(optimizer='rmsprop', loss=kl_reconstruction_loss, metrics=['accuracy'])
    history=vae.fit_generator(X_train, epochs=15,
                    validation_data=next(X_val), validation_steps=5,
                    callbacks=[ReduceLROnPlateau(monitor='val_loss', factor=0.5, verbose=2,
                    patience=4, cooldown=1, min_lr=0.0001)])
在训练过程中,验证损失为零,准确度为1/2。 这里,对于三类未标记的数据,经过训练的网络不能很好地将三类不同的数据进行聚类。不太清楚为什么当网络不能很好地在测试数据集上推广时,精确度会上升到1,而损失到0

Epoch 1/2
2164/2164 [==============================] - 872s 403ms/step - loss: 6668.9662 - accuracy: 0.7253 - val_loss: 3785921.0000 - val_accuracy: 0.9982
Epoch 2/2
2164/2164 [==============================] - 869s 401ms/step - loss: 0.0000e+00 - accuracy: 1.0000 - val_loss: 3857374.2500 - val_accuracy: 0.9983

有什么见解/建议吗?

VAE的目的是将输入压缩成表现良好的潜在表示,然后使用该潜在表示准确地重建输入。VAE的损失有两个术语,每个术语对应于第一句中的一项任务。损失中的第一项——KL散度项——强制从多维单位高斯分布中提取潜在表示。损失中的第二项使VAE精确地重构输入。通常,人们在输入和输出之间使用类似于L2损失的东西(有更多更奇特的东西可以使用,但L2损失通常可以)

由于模型不执行分类,因此精度不是一个好的度量标准。查看VAE重构输入的准确度的更好方法是监视诸如均方误差之类的东西

代码的输出(其中训练损失在1个历元后变为0)表明模型过度拟合了训练数据。尝试规范化您的模型(或使用容量较小的模型)或减少每个训练阶段的步骤数,以便更经常地在验证数据上监视模型的性能


此外,使用next(X_val)只是从验证集中获取一个元素。您可能希望传入验证数据生成器,而不是验证数据中的单个元素。删除next()调用将实现这一点。

VAE的目的是将输入压缩为行为良好的潜在表示,然后使用此潜在表示来准确地重建输入。VAE的损失有两个术语,每个术语对应于第一句中的一项任务。损失中的第一项——KL散度项——强制从多维单位高斯分布中提取潜在表示。损失中的第二项使VAE精确地重构输入。通常,人们在输入和输出之间使用类似于L2损失的东西(有更多更奇特的东西可以使用,但L2损失通常可以)

由于模型不执行分类,因此精度不是一个好的度量标准。查看VAE重构输入的准确度的更好方法是监视诸如均方误差之类的东西

代码的输出(其中训练损失在1个历元后变为0)表明模型过度拟合了训练数据。尝试规范化您的模型(或使用容量较小的模型)或减少每个训练阶段的步骤数,以便更经常地在验证数据上监视模型的性能


此外,使用next(X_val)只是从验证集中获取一个元素。您可能希望传入验证数据生成器,而不是验证数据中的单个元素。删除下一个()调用将实现这一点。

准确性对于您的案例来说是一个误导性的指标准确性对于您的案例来说是一个误导性的指标