TensorFlow中张量相减后负值异常转为256的问题求助
问题根源:无符号整数溢出导致的数值绕回
嘿,我太懂你碰到的这个问题了!这根本不是TensorFlow在“莫名加256”,而是uint8类型的特性搞的鬼——uint8是无符号8位整数,只能存储0到255之间的数值,当计算结果为负数时,它会自动通过“加256”的方式绕回到有效范围内,比如0 - 2在uint8里会变成254,这就是你看到那些奇怪正数的原因。
举个简单的例子:如果img里某个像素值是200,img2对应的是192(因为200//64*64=192),那img2 - img本来是-8,但uint8会把它转成256 - 8 = 248,这就是你输出里那些看起来不对劲的数值来源。
解决方法:先转换数据类型再计算
要实现“相减后用ReLU把负值转成0”的需求,你只需要先把张量转换成有符号的数值类型(比如float32、int32),再进行运算就可以了,具体修改后的代码如下:
import tensorflow as tf import matplotlib.image as mpimg # 读取图片 img = mpimg.imread('/home/moumenshobaky/tensorflow_files/virtualenv/archive/training/Dessert/82 7.jpg') # 将uint8转换为float32,避免溢出问题 img_float = tf.cast(img, dtype=tf.float32) # 基于浮点型计算img2 img2_float = tf.math.floordiv(img_float, 64) * 64 # 正常执行相减,负数可以被正确存储 img3_float = img2_float - img_float # 应用ReLU函数,把所有负值转为0 img3_relu = tf.nn.relu(img3_float) # 查看结果 from tensorflow.keras.layers import Flatten flatten = Flatten(dtype='float32') print(flatten(img2_float)) print(img3_relu)
额外提示:转回uint8的注意事项
如果之后需要把结果转回uint8格式,记得先把数值裁剪到0-255的范围内,再转换类型,避免再次出现溢出:
# 裁剪到0-255,再转回uint8 img3_uint8 = tf.cast(tf.clip_by_value(img3_relu, 0, 255), dtype=tf.uint8)
内容的提问来源于stack exchange,提问作者moumenShobakey




