【问题标题】:TensorFlow default precision mode?TensorFlow默认精度模式?
【发布时间】:2020-12-21 05:08:29
【问题描述】:

我正在使用 TensorFlow 1.14 并测试 TensorRT;正如我在文档中看到的,TensorRT 支持 3 种精度模式:“FP32”、“FP16”和“INT8”。所以想知道TensorFlow默认的精度模式是什么;我想它是 FP32,但我对此不太确定?

【问题讨论】:

    标签: python tensorflow tensorrt


    【解决方案1】:

    张量流中 weights 的默认精度是 'float32',可以在此处的权重初始化函数文档中看到: https://github.com/tensorflow/tensorflow/blob/6bfbcf31dce9a59acfcad51d905894b082989012/tensorflow/python/ops/init_ops.py#L527

    但是,模型中使用的不同层支持的输入可能具有多种精度。

    现在,您通常希望在训练后减小模型的大小(由模型权重形成)以便能够部署。在此期间,您可以将模型权重的精度降低到 FP16。

    【讨论】:

      【解决方案2】:

      TensorRT 的默认精度为 Float32。见here

      Tensorflow 的默认精度也是 Float32。见here
      您可以通过以下方式确认:
      代码:

      import tensorflow as tf
      tf.keras.backend.floatx()
      

      输出:

      'float32'
      

      如果您希望更改此行为或使用其他精度: 您可以使用 set_floatx 方法。

      tf.keras.backend.set_floatx('float64')
      

      注意:不建议将其设置为 float16 进行训练,因为这可能会导致数值稳定性问题。

      【讨论】:

      • 使用float16 非常好。您只需要记住增加实现中使用的每个 epsilon 的大小(例如在 Adam、log 或 div 中),因为某些默认值可能对于基础精度来说太小,导致 0.0 值。
      • @runDOSrun 参见here。它是在官方 TensorFlow 文档中编写的。另外,您能否详细说明增加 epsilon 的大小?
      • 感谢来源!一些基本操作的 TF 实现需要添加一个小数(通常称为 epsilon e)来避免 NaN。最简单的例子是 div(a,0) := a/0。我们真的不希望它抛出异常,因为这实际上经常发生(尤其是在优化器/损失中)。解决方案: div(a,b) := a/(b+e) 其中 e=1e-7。但是,32 位精确地为您提供 7 个十进制数字的精度。如果我们降低精度,我们需要增加 epsilons 以避免 NaN 无处不在。我想他们有一天会为此添加动态检查。
      猜你喜欢
      • 2018-02-23
      • 2017-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-17
      • 1970-01-01
      • 2017-07-27
      • 1970-01-01
      相关资源
      最近更新 更多