我正在用未标记的输入图像训练变分自动编码器(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。这里,对于三类未标记的数据,经过训练的网络不能很好地对3个不同的类进行聚类。不太清楚为什么准确率高达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个epoch后变为0(表明模型过拟合训练数据。尝试规范化您的模型(或使用容量较小的模型(或减少每个训练时期的步骤数,这样您就可以更频繁地监控模型在验证数据上的性能。
此外,next(X_val(的用法只是从验证集中获取一个元素。您可能希望传入验证数据生成器,而不是验证数据中的单个元素。删除next((调用将实现这一点。