【问题标题】:Getting horrendous accuracy with tensorflow on easy classification data在简单的分类数据上使用 tensorflow 获得惊人的准确性
【发布时间】:2019-01-06 05:26:10
【问题描述】:

我开始学习如何使用 tensorflow。所以,我从here 提供的最基本的教程开始。

该示例在 mnist 数据上训练两层感知器。我决定用我自己的数据替换它。因此,我创建了一个生成属于四个类之一的二维数据的方法(参见非常简单的实现,method called get_data here)。这些类很明显是线性可分的(见下图)。所以,我希望任何分类器都能将它淘汰出局。

然后我 modify the tensorflow sample 以便它读取我的数据。

结果太可怕了。损失似乎与准确度完全不相关,准确度在训练过程中变化很大。

我可能遗漏的东西对任何人来说都很明显吗?我所做的修改非常简单,我已经审查了很多次。

Step 1, Minibatch Loss= 2167311.5000, Training Accuracy= 0.250
Step 100, Minibatch Loss= 19227.4277, Training Accuracy= 0.250
Step 200, Minibatch Loss= 5008.3398, Training Accuracy= 0.180
Step 300, Minibatch Loss= 1909.1743, Training Accuracy= 0.461
Step 400, Minibatch Loss= 1811.5497, Training Accuracy= 0.398
Step 500, Minibatch Loss= 2363.8840, Training Accuracy= 0.414
Step 600, Minibatch Loss= 2374.1931, Training Accuracy= 0.195
Step 700, Minibatch Loss= 173.2211, Training Accuracy= 0.352
Step 800, Minibatch Loss= 1286.1042, Training Accuracy= 0.250
Step 900, Minibatch Loss= 560.9091, Training Accuracy= 0.023
Step 1000, Minibatch Loss= 163.1450, Training Accuracy= 0.195
Step 1100, Minibatch Loss= 412.8525, Training Accuracy= 0.023
Step 1200, Minibatch Loss= 155.7486, Training Accuracy= 0.094
Step 1300, Minibatch Loss= 137.8443, Training Accuracy= 0.078
Step 1400, Minibatch Loss= 59.5813, Training Accuracy= 0.062
Step 1500, Minibatch Loss= 74.8706, Training Accuracy= 0.180
Step 1600, Minibatch Loss= 7.7829, Training Accuracy= 0.250
Step 1700, Minibatch Loss= 18.4251, Training Accuracy= 0.250
Step 1800, Minibatch Loss= 76.1630, Training Accuracy= 0.211
Step 1900, Minibatch Loss= 2147.1362, Training Accuracy= 0.250
Step 2000, Minibatch Loss= 8275.0098, Training Accuracy= 0.242
Step 2100, Minibatch Loss= 36986.7539, Training Accuracy= 0.250
Step 2200, Minibatch Loss= 2482.1418, Training Accuracy= 0.164
Step 2300, Minibatch Loss= 8919.1445, Training Accuracy= 0.250
Step 2400, Minibatch Loss= 2694.6621, Training Accuracy= 0.172
Step 2500, Minibatch Loss= 262.8948, Training Accuracy= 0.172
Step 2600, Minibatch Loss= 655.5334, Training Accuracy= 0.148
Step 2700, Minibatch Loss= 278.0427, Training Accuracy= 0.250
Step 2800, Minibatch Loss= 2314.9653, Training Accuracy= 0.242
Step 2900, Minibatch Loss= 570.7736, Training Accuracy= 0.180
Step 3000, Minibatch Loss= 4217.2334, Training Accuracy= 0.250
Step 3100, Minibatch Loss= 1161.3817, Training Accuracy= 0.250
Step 3200, Minibatch Loss= 2473.6438, Training Accuracy= 0.234
Step 3300, Minibatch Loss= 2483.4707, Training Accuracy= 0.250
Step 3400, Minibatch Loss= 720.1823, Training Accuracy= 0.070
Step 3500, Minibatch Loss= 1411.0126, Training Accuracy= 0.188
Step 3600, Minibatch Loss= 1034.0898, Training Accuracy= 0.250
Step 3700, Minibatch Loss= 2143.2910, Training Accuracy= 0.258
Step 3800, Minibatch Loss= 2471.9592, Training Accuracy= 0.242
Step 3900, Minibatch Loss= 932.8969, Training Accuracy= 0.250
Step 4000, Minibatch Loss= 2762.5869, Training Accuracy= 0.180
Step 4100, Minibatch Loss= 2132.0295, Training Accuracy= 0.250
Step 4200, Minibatch Loss= 6322.4692, Training Accuracy= 0.250
Step 4300, Minibatch Loss= 6657.2842, Training Accuracy= 0.242
Step 4400, Minibatch Loss= 343629.0312, Training Accuracy= 0.195
Step 4500, Minibatch Loss= 19370.7188, Training Accuracy= 0.234
Step 4600, Minibatch Loss= 1008.6259, Training Accuracy= 0.227
Step 4700, Minibatch Loss= 952.9269, Training Accuracy= 0.125
Step 4800, Minibatch Loss= 390.7108, Training Accuracy= 0.211
Step 4900, Minibatch Loss= 846.1492, Training Accuracy= 0.188
Step 5000, Minibatch Loss= 218.7473, Training Accuracy= 0.250
Optimization Finished!
Testing Accuracy: 0.3275

【问题讨论】:

    标签: python tensorflow deep-learning classification perceptron


    【解决方案1】:

    你的学习率相当大;常用值更接近 0.001-0.01 的范围(尽管这可能因您的特定任务而异)。此外,您可能希望随着时间的推移降低学习率(所谓的“学习率衰减”(Andrey Karpathy's great lecture 中的更多内容)。

    此外,仅 5000 次迭代的训练可能不是您想要的。通常,诸如“过度拟合”之类的东西会阻止您准确地学习 general 表示。这意味着,您非常擅长识别(和分类)之前看到的数据,但不太擅长对未见过的数据进行分类。
    为此,最好使用第三个数据集进行验证(~测试集的大小)。然后使用此验证集来查看经过训练的模型在预扣数据上的表现如何。您将在每 100 次左右迭代后进行评估,然后查看此数据集上的损失如何变化。

    一种常见的技术是“提前停止”,这意味着一旦您的算法在测试集上没有改进,您就停止训练过程。 this Stackexchange post 显示了一个很好的可视化,具有密切相关的上下文。

    最后,256 个神经元非常多,在您的情况下甚至可能不是必需的。我不太清楚你的输入有多少维度,但通常每层大约有 16 个神经元应该很好(也许可以尝试一下,看看网络在不同大小下的表现如何)。

    很多结果纯粹来自于知道要设置哪些参数,祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      • 2021-04-22
      • 2020-04-07
      • 2018-02-09
      • 2021-08-03
      • 1970-01-01
      • 2012-11-14
      相关资源
      最近更新 更多