为什么在 Keras 中改组验证集会改变模型的性能?
Why does shuffling my validation set in Keras change my model's performance?
为什么我很困惑:
如果我在示例 [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]
请注意,验证准确度是相同的。
这里是我用 shuffled 验证集测试模型的地方:
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 returns 在对等于 val_batches.nb_sample
的示例数评估模型后,这是验证集中的示例数。
这是一个非常有趣的问题。答案是因为神经网络使用的是float32
格式,没有float64
那么准确——这样的波动只是下溢现象的实现。
如果你输了 - 你可能会注意到差异出现在小数部分的第 7 个小数位之后 - float32
格式的精确度是多少。所以 - 基本上 - 你可以假设你的例子中出现的所有数字在 float32
表示方面都是相等的。
为什么我很困惑:
如果我在示例 [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]
请注意,验证准确度是相同的。
这里是我用 shuffled 验证集测试模型的地方:
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 returns 在对等于 val_batches.nb_sample
的示例数评估模型后,这是验证集中的示例数。
这是一个非常有趣的问题。答案是因为神经网络使用的是float32
格式,没有float64
那么准确——这样的波动只是下溢现象的实现。
如果你输了 - 你可能会注意到差异出现在小数部分的第 7 个小数位之后 - float32
格式的精确度是多少。所以 - 基本上 - 你可以假设你的例子中出现的所有数字在 float32
表示方面都是相等的。