自动编码器在简单二进制数据上的丢失和准确性

时间:2018-04-11 06:48:10

标签: keras mean autoencoder loss

我正在努力理解并改善变分自动编码器的损失和准确性。我用自动编码器填充了一个简单的二进制数据:

data1 = np.array([0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
   1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0], dtype='int32')

data2 = np.array([1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
   1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0], dtype='int32')


data3 = np.array([0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
   1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0], dtype='int32')

每个样品100个,所以我有300个样品。

我尝试用变分自动编码器进行预测

sent_encoded = encoder.predict(np.array(test), batch_size = batch_size)
sent_decoded = generator.predict(sent_encoded)

并获得了几行的正确答案

print(np.round_(sent_decoded[1]))
print(np.round_(sent_decoded[100]))
print(np.round_(sent_decoded[299]))

[ 0.  1.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  1.  0.  0.
  0.  0.  0.  0.  0.  1.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.
  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
[ 0.  1.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  1.  0.  0.
  0.  0.  0.  0.  0.  1.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.
  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
[ 1.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  1.  0.  0.  0.
  0.  0.  0.  0.  0.  1.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.
  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]

我不明白的是模型训练的损失,准确性和遗失。

我得到了相当不错的损失表

enter image description here

但是为什么模型的准确性在这个简单的数据集上并不那么好? 看看吧 enter image description here

mse损失不会改变它并且它很高: enter image description here

我能做些什么来获得100%准确的模型?变量自动编码器是否能够使用这种类型的数据获得100%准确的模型?请告诉我代码。

1 个答案:

答案 0 :(得分:2)

变分自动编码器不是分类器,因此精度在这里实际上没有任何意义。

通过均方重建误差测量VAE的损失也可能存在问题。简而言之,VAE不会优化重建损失。

您需要了解有关变分自动编码器的更多信息,特别是它的优化内容。如果您只对分类感兴趣,那么可能只是预先训练常规自动编码器,然后分类器会更有意义。