java 方差归一化_数据预处理:归一化 Normalization

数据归一化是机器学习中重要的预处理步骤,它能加速模型收敛,提高精度。常见的归一化方法包括均值方差归一化(标准化)、最小-最大归一化和非线性归一化。在处理测试集时,须确保使用与训练集相同的均值和标准差。PyTorch中的`transforms.Normalize`用于图像数据的归一化,通常需要计算数据集的均值和标准差。
摘要由CSDN通过智能技术生成

为什么要数据归一化Feature Scaling

由于原始数据值的范围差异很大,因此在某些机器学习算法中,如果没有归一化,目标函数将无法正常工作。例如,许多分类器通过欧几里得距离来计算两点之间的距离。如果其中一个要素的取值范围较广,则该距离将受此特定要素支配。因此,所有特征的范围应归一化,以使每个特征对最终距离的贡献大致成比例

可以使得梯度下降收敛更快

如果将正则化用作损失函数的一部分,则数据归一化也很重要(以便适当地对系数进行惩罚)

归一化的优点

提升模型的收敛速度

877eaa80309a39ae0574aae71f325f72.png

左图:归一化前 右图:归一化后

提高模型精度

常用方法

均值方差归一化 Zero-mean normalization

\[x = \frac{x-\bar{x}}{\sigma }

\]

​又叫标准化Standardization,处理后的数据满足标准正态分布

​可见,归一化包含标准化,标准化只是归一化的一种

Min-max normalization

\[x = \frac{x-x_{min}}{x_{max}-x_{min}}

\]

​是一种线性的归一化方法,它的特点是不会对数据分布产生影响。

​当数据集的分布最大值和最小值不稳定时,结果输出可能也会不稳定。

​该方法在图像处理上很常用,因为大部分的图像像素值为x∈[0, 255]

Non-linear normalization

包含log、exp、arctan、sigmoid等非线性函数,选择时取决于期望的输出范围:

log()在[0,1]上有很强的区分度

arctan()可以将任意实数转换到[-π/2, π/2]区间

sigmoid()可以将任意实数映射到(0, 1)区间

Length-one normalization

\[x = \frac{x}{\left | \left | x \right | \right |}

\]

​将特征转为单位向量的形式来剔除特征强度的影响

测试集归一化

测试集归一化所用均值和标准差的必须与train dataset 的input相同,保证数据是同分布的

测试集的数据分布本身是无法计算的,而深度学习神经网络的基础就是假定test set和train set是同分布的数据

target归一化

input经过target下采样而来

利用target下采样得到input,此时,两者本身就是同分布的(如img 1),以至于在很多SR Task中,并没有采用normalize操作

若要进行normalize,两者可采用相同的均值和标准差

722a28965ab0deb699b6a2b964a7b048.png

img 1

input和target都为Raw images

当input和target都是Raw images时,两者的数据分布将会存在较大的差异,如img 2中:

在R通道上,input和target的均值和标准差相差很大

在G通道上,input和target的均值和标准差相差很小,接近于同分布

7dcdc7196c46d59cdfbff47da651f2e8.png

img 2

此时,对于input和target应当采用不同的均值和标准差[即img 2计算的结果],使得它们能够满足(0,1)正态分布

def Dataset_transform_norm(imgs):

if imgs == 'LR':

norms = Normalize((0.1815, 0.0378, 0.0000), (0.1599, 0.0896, 1.0000)) # G通道无信息,所以标准差不能为0,因为分母不能为0

elif imgs == 'HR_2':

norms = Normalize((0.1290, 0.0367, 0.0000), (0.1053, 0.0830, 1.0000))

else:

norms = Normalize((0.1058, 0.0366, 0.0000), (0.0906, 0.0841, 1.0000))

return Compose([

ToTensor(),

norms

])

归一化后,满足正态分布,如img 3:

bb1c7557df996d6e97415eb07beefbbd.png

img 3

pytorch中的归一化

在pytorch中用均值和标准差对张量图像进行归一化

torchvision.transforms.Normalize(mean, std, inplace=False)

所以,在数据预处理时有:

transform_train = transforms.Compose([

transforms.ToTensor(),

transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),

])

计算均值与标准差

对于RGB图像,计算均值与标准差的代码👉calculate_mean_std.py:

通过对General100数据集进行计算可知

R通道

G通道

B通道

均值

0.5525

0.4983

0.4047

标准差

0.2432

0.2403

0.2482

e67d536c207e788afa756a7fcb8f4930.png

之后,便可利用计算好的均值和标准差放入到transforms.Normalize中做归一化处理了

Write by Gqq

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值