Keras 和 CoreML 预测的结果大不相同
Keras and CoreML predicted outcomes are very different
我正在使用 Keras 进行对象检测并将模型转换为 CoreML 以进行移动部署。
在python这边,预测方法是在同一张图片上运行。预处理(均值去除)由 keras 在 python 端处理,由 coreML(red_bias、green_bias 等)由 coreML 处理。
预测结果直到第一个小数位都相同,但其余小数位都不同。
我用 numpy.testing.assert_array_almost_equal 检查输出数组的差异在 4-10% 之间。
输出数组的大小为 (1,10000,45)。
结果是不同的预测和对象检测输出。
对为什么会发生这种情况有任何见解吗?
我怎样才能找到问题的根源并解决它?
假设你做的一切都是正确的,并且模型在 GPU 上运行,那么这些精度错误是正常的。 GPU 使用 16 位浮点数,精度仅约 3 位小数,如果您的模型有很多层,那么这种精度误差将会累积。
此外,对于某些类型的模型,最后一层将具有较大的权重和较大的(负)偏差(以强制预测非常有信心),这将放大精度误差。
尝试 运行 CPU 上的 Core ML 模型而不是 GPU(参见 MLPredictionOptions
)。如果现在精度更好,那确实是16位浮点数。
一般来说这个问题没什么好担心的,因为(卷积)神经网络对此类精度问题非常稳健,您可能仍会从模型中获得正确的结果。
我的经验是小于 5e-2 的误差是可以的,如果只有少数误差大于 5e-2 那么模型就没问题。
我正在使用 Keras 进行对象检测并将模型转换为 CoreML 以进行移动部署。
在python这边,预测方法是在同一张图片上运行。预处理(均值去除)由 keras 在 python 端处理,由 coreML(red_bias、green_bias 等)由 coreML 处理。
预测结果直到第一个小数位都相同,但其余小数位都不同。
我用 numpy.testing.assert_array_almost_equal 检查输出数组的差异在 4-10% 之间。
输出数组的大小为 (1,10000,45)。
结果是不同的预测和对象检测输出。
对为什么会发生这种情况有任何见解吗?
我怎样才能找到问题的根源并解决它?
假设你做的一切都是正确的,并且模型在 GPU 上运行,那么这些精度错误是正常的。 GPU 使用 16 位浮点数,精度仅约 3 位小数,如果您的模型有很多层,那么这种精度误差将会累积。
此外,对于某些类型的模型,最后一层将具有较大的权重和较大的(负)偏差(以强制预测非常有信心),这将放大精度误差。
尝试 运行 CPU 上的 Core ML 模型而不是 GPU(参见 MLPredictionOptions
)。如果现在精度更好,那确实是16位浮点数。
一般来说这个问题没什么好担心的,因为(卷积)神经网络对此类精度问题非常稳健,您可能仍会从模型中获得正确的结果。
我的经验是小于 5e-2 的误差是可以的,如果只有少数误差大于 5e-2 那么模型就没问题。