You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动