如何将浮点数归一化至[0,1]区间?视频判别器场景疑问
嘿,咱们一步步来解决你的问题~
最常用的是最小-最大归一化(Min-Max Normalization),公式很直接:
normalized_value = (x - min_val) / (max_val - min_val)
x是你要归一化的原始浮点数min_val是所有待归一化数据中的最小值max_val是所有待归一化数据中的最大值
举个例子,如果你的帧输出范围是[-5, 10],那某个值3的归一化结果就是(3 - (-5))/(10 - (-5)) = 8/15 ≈ 0.53。
如果你的判别器输出的是logits(未经过激活的原始输出),更适合用Sigmoid函数直接映射到(0,1)区间,不用依赖数据集的最值:
import math normalized_value = 1 / (1 + math.exp(-x))
这种方式更适合概率类输出,能自然把任意实数压缩到0到1之间。
⚠️ 注意:如果所有数据值都相同(比如全是5),Min-Max会出现除以0的情况,这时候可以统一把结果设为0.5,或者根据你的业务需求调整(比如直接设为0或1)。
结合你的场景——判断视频是否人工生成,每帧的判断应该是同等重要的,我更推荐先将每帧结果归一到[0,1],再对总和做归一化,原因如下:
1. 先帧归一再总和归一的逻辑
如果你的判别器当前帧输出还不是[0,1],先把每帧都映射到0(假)到1(真)的区间,然后把所有帧的结果相加,最后除以总帧数,得到最终的[0,1]结果。比如10帧的视频,每帧归一后总和是7.2,最终结果就是7.2/10=0.72,这个值可以直观理解为「平均每帧的真实度」,逻辑清晰,每帧的权重均等。
2. 仅对总和归一化的问题
如果跳过帧归一,直接把原始帧的总和归一到[0,1],会导致不同帧的原始数值范围主导最终结果。比如某帧的原始输出范围是[0,100],另一帧是[0,1],那前者的微小波动都会比后者的最大贡献还大,相当于给某些帧加了不合理的权重,这会让你的判别器判断偏向数值范围大的帧,不符合视频帧同等重要的判断逻辑。
当然,如果你的业务需求是给某些关键帧(比如动作变化大的帧)更高权重,那可以调整归一化策略,但默认情况下,先帧归一再做总和的均值归一是最稳妥的选择。
内容的提问来源于stack exchange,提问作者costa98

