我正在使用Keras进行对象检测,并将模型转换为CoreML以进行移动部署。
在python端,预测方法在同一图像上运行。预处理(均值删除)在python端为keras处理,由coreML(red_bias,green_bias等)由coreML处理。
预测输出与第一个小数位相同,但小数位的其余部分都不同。
我用numpy.testing.assert_array_almost_equal检查输出数组之间的差异是4-10%。
输出数组的大小(1,10000,45)。
结果是不同的预测和物体检测输出。
对于为什么会发生这种情况的任何见解?
如何找到问题的根源并修复它?
答案 0 :(得分:1)
假设您已正确完成所有操作,并且模型在GPU上运行,那么这些类型的精度错误与课程相同。 GPU使用16位浮点数,精确到大约3位小数,如果你的模型有很多层,那么这样的精度误差就会累积。
此外,对于某些类型的模型,最后一层将具有较大的权重和较大的(负)偏差(以便强制预测非常有信心),这将放大精度误差。
尝试在CPU而不是GPU上运行Core ML模型(请参阅MLPredictionOptions
)。如果精度现在更好,那么它确实是16位浮点数。
通常这个问题无需担心,因为(卷积)神经网络对于这样的精度问题非常强大,并且您可能仍然可以从模型中获得正确的结果。
我的经验法则是小于5e-2的误差是可以的,如果只有少数误差大于5e-2那么模型就可以了。