一般来说,选择将数据归一化到(0,1)还是(-1,1)应该考虑以下几个因素:
-
数据的范围:如果数据的取值范围主要集中在非负数或者非正数区间,那么归一化到(0,1)范围更合适。例如,图像数据的像素值通常取值范围为0到255或者0到1,归一化到(0,1)范围可以更好地保留数据的相对大小关系。
-
数据的对称性:如果数据存在负数值,并且对称性很重要,那么归一化到(-1,1)范围更适用。例如,在生成对抗网络(GAN)中的输入噪声通常是均值为零的对称分布,因此归一化到(-1,1)范围可以更好地保持对称性。
-
模型对输入数据范围的敏感性:有些模型(如深度神经网络)对输入数据范围非常敏感,较大或较小的数据范围可能会导致模型性能下降。在这种情况下,根据模型的要求进行合适的数据归一化是很重要的。
我的经验是,用diffusion model做生成任务时,将图像输入归一化为(-1,1),应该也是因为噪声通常是均值为零的对称分布(还没考证)。
在跑UNet时,我将图像输入归一化为(-1,1),激活函数用的Relu,网络学不到东西。换成swish激活函数就可以了。应该是Relu把负数输出给截止掉了。
(我做实验将图像归一化为(0,1),用Relu还不行,只有一层Conv3d甚至中间梯度爆炸了,不知道啥原因了)