TensorFlow中如何将张量计算结果的所有nan值正确替换为0
问题原因
每次调用TensorFlow张量的.numpy()方法,都会基于张量当前值生成一份独立的numpy数组副本。直接对链式调用生成的临时副本做赋值修改,改动只会停留在这个临时副本上,既不会修改原始TF张量,也不会影响下一次调用.numpy()时新生成的数组,因此nan值始终没有被真正替换。
另外你贴的代码存在一处笔误:out = ts / (ts + fx)中的fx未定义,应为前面声明的tx。
解决方法
方案1:使用TF原生API(推荐)
直接在张量层面完成值替换,避免频繁的张量与numpy数组转换,性能更优,也不会出现副本修改无效的问题:
import tensorflow as tf import numpy as np ts = tf.constant([[0, 0]], dtype=tf.float32) tx = tf.constant([[0, 1]], dtype=tf.float32) out = ts / (ts + tx) # 识别所有nan位置,替换为同形状的0值 out = tf.where( condition=tf.math.is_nan(out), x=tf.zeros_like(out), y=out ) print(out.numpy()) # 输出结果:[[0. 0.]]
方案2:转numpy后持有引用再修改
如果需要用numpy逻辑处理数据,必须先把.numpy()生成的数组赋值给固定变量,修改完成后如果需要继续在TF流程中使用,可以再转回TF张量:
# 将张量转为numpy数组并存入变量,持有数组引用 out_np = out.numpy() # 生成nan值的布尔掩码 nan_mask = tf.math.is_nan(out).numpy() # 对持有的numpy数组做原地赋值 out_np[nan_mask] = 0 print(out_np) # 输出结果:[[0. 0.]] # 后续需要使用TF张量时,将处理好的数组转回即可 out = tf.constant(out_np)
注意事项
- 不要直接对
.numpy()返回的临时对象做原地修改,所有修改必须作用在你自己持有引用的numpy变量上 - 优先使用TensorFlow内置算子做数值处理,避免不必要的设备间数据拷贝、格式转换开销
内容的提问来源于stack exchange,提问作者Anshuman Sinha
相关产品推荐
相关产品推荐

