python - 为什么在 Keras 中改组验证集会改变模型的性能?

标签 python machine-learning neural-network deep-learning keras

为什么我很困惑:

如果我在示例 [A, B, C] 上测试我的模型,它将获得一定的准确性。如果我在示例 [C、B、A] 上测试相同的模型,它应该获得相同的准确度。换句话说,打乱例子不应该改变我的模型的准确性。但这似乎是下面发生的事情:

一步一步:

这是我训练模型的地方:

model.fit_generator(batches, batches.nb_sample, nb_epoch=1, verbose=2,
                    validation_data=val_batches,
                    nb_val_samples=val_batches.nb_sample)

这是我在不打乱验证集的情况下测试模型的地方:

gen = ImageDataGenerator()
results = []
for _ in range(3):
    val_batches = gen.flow_from_directory(path+"valid", batch_size=batch_size*2,
                                          target_size=target_size, shuffle=False)
    result = model.evaluate_generator(val_batches, val_batches.nb_sample)
    results.append(result)

这是结果(val_loss,val_acc):

[2.8174608421325682, 0.17300000002980231]
[2.8174608421325682, 0.17300000002980231]
[2.8174608421325682, 0.17300000002980231]

请注意,验证准确度是相同的。

这是我使用混洗验证集测试模型的地方:

results = []
for _ in range(3):
    val_batches = gen.flow_from_directory(path+"valid", batch_size=batch_size*2,
                                          target_size=target_size, shuffle=True)
    result = model.evaluate_generator(val_batches, val_batches.nb_sample)
    results.append(result)

这是结果(val_loss,val_acc):

[2.8174608802795409, 0.17299999999999999]
[2.8174608554840086, 0.1730000001192093]
[2.8174608268737793, 0.17300000059604645]

请注意,尽管验证集和模型未更改,但验证准确度不一致。怎么回事?


注意:

我每次都在整个验证集上进行评估。 model.evaluate_generator在根据等于 val_batches.nb_sample 的示例数评估模型后返回,这是验证集中的示例数。

最佳答案

这是一个非常有趣的问题。答案是因为神经网络使用的float32格式不如float64准确——这样的波动只是下溢现象的实现。

如果您丢失了 - 您可能会注意到差异出现在小数部分的第 7 个小数位之后 - float32 格式的精确度是多少。所以 - 基本上 - 您可以假设您的示例中显示的所有数字在 float32 表示方面都是相等的。

关于python - 为什么在 Keras 中改组验证集会改变模型的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41836602/

相关文章:

ios - MPSCNN 权重排序

python - 寻找在 3600x20x20 的 xarray 中查找阈值之间的值的最快方法

python - 正确使用 QThread.currentThreadId()

c++ - 如何修复 opencv 的慢 kmeans

python - 如何为机器学习方法编码我的数据?

r - 生成数据以在 R 中创建绘图

python - 按照设计,属性 getter 是否应该在 python 中抛出异常?

python - 如何访问嵌套跨度标签内的数据

python-3.x - 在 keras 回调中监控 F1 分数(或一般的自定义指标)

python - keras中的神经网络不收敛