这是我已经问过的一个更通用的问题:Significant difference between outputs of deep tensorflow keras model in Python and tensorflowjs conversion
据我所知,与在Python或Windows XP中运行的同一模型相比,在浏览器中运行的tfjs模型的各层(到目前为止仅在Chrome和Firefox中进行了测试)在输出值上会有很小的数值差异节点。这些小差异在模型所有各层之间的累积影响会导致输出中的相当大的差异。有关示例,请参见here。
这意味着在浏览器中运行时,使用Python或Node训练的模型在准确性方面表现不佳。而且,模型越深入,效果就会越差。
因此,我的问题是,在浏览器中训练模型与tfjs一起使用的最佳方法是什么?有没有办法确保输出相同?还是只需要接受数值上的微小差异,如果是的话,是否有任何方法可以用来训练模型以使其更具弹性?
答案 0 :(得分:0)
此答案基于我的个人观察。因此,这是有争议的,并且没有足够的证据支持。为了使16位模型的精度接近32位模型,我需要遵循以下几点:
对于隐藏层,请避免使用上下界较小的激活,例如sigmoid
或tanh
。这些激活使下一层的权重变得对小值非常敏感,因此对小的变化也非常敏感。我更喜欢将ReLU用于此类模型。由于现在它是大多数模型中隐藏层的标准激活方式,因此无论如何都应使用它。
在训练时避免重量衰减和重量的L1 / L2正则化(keras中的kernel_regularizer
参数),因为这些会增加重量的敏感性。使用Dropout
代替,我没有发现使用TFLite代替数字正则化器时,TFLite的性能有明显下降。