【问题标题】:Tensorflow: How to convert NaNs to a number?Tensorflow:如何将 NaN 转换为数字?
【发布时间】:2016-11-26 10:23:10
【问题描述】:

我正在尝试在训练我的图表时计算权重的熵并将其用于正则化。这当然涉及w*tf.log(w),并且随着我的权重发生变化,其中一些势必会进入导致返回 NaN 的区域。

理想情况下,我会在我的图表设置中包含一条线:

w[tf.is_nan(w)] = <number>

但是 tensorflow 不支持这样的分配。我当然可以创建一个操作,但这行不通,因为我需要在整个图表的执行期间发生它。我迫不及待地等待图表执行然后“修复”我的权重,这必须是图表执行的一部分。

我无法在文档中找到与 np.nan_to_num 等效的内容。

有人有想法吗?

(由于显而易见的原因,添加 epsilon 不起作用)

【问题讨论】:

标签: python tensorflow nan


【解决方案1】:

我认为你需要使用 tf.select。

w = tf.select(tf.is_nan(w), tf.ones_like(w) * NUMBER, w); #if w is nan use 1 * NUMBER else use element in w

更新: TensorFlow 1.0 有 deprecated tf.select 支持 Numpy 兼容 tf.where

【讨论】:

  • w = tf.where(tf.is_nan(w), tf.ones_like(w) * NUMBER, w) # 带有 tf.where 的版本 - 更快地复制并避免混淆
  • 对于 Tensorflow 2.0+,您需要使用 tf.math.is_nan。此代码删除由 categorically_cross_entropy 损失函数的填充部分创建的 nan:loss_value = tf.where(tf.math.is_nan(loss_value), tf.zeros_like(loss_value), loss_value)
【解决方案2】:

您不能将 nan 转换为数字(例如您不能将无限转换为数字)。

一旦 w 是(或包含)零,nan 很可能来自 w*tf.log(w)。您可以先添加 1e-6,这样就不会发生被零除。

【讨论】:

  • 在最初的问题中,他说他不能添加 epsilon,所以我认为添加 1e-6 不会起作用。
【解决方案3】:

如果它是 NaN,我使用它来将值转换为 0:

value_not_nan = tf.dtypes.cast(tf.math.logical_not(tf.math.is_nan(value)), dtype=tf.float32)
tf.math.multiply_no_nan(value, value_not_nan)

【讨论】:

    猜你喜欢
    • 2020-10-24
    • 2013-04-26
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 2018-05-19
    • 1970-01-01
    • 2012-01-01
    相关资源
    最近更新 更多