是十进制缩放归一化 和最大最小归一化的概念
时间: 2024-07-19 10:00:36 浏览: 199
数据归一化是数据分析和机器学习中常见的预处理步骤,用来将数值特征缩放到特定范围内,便于后续模型训练和提高算法性能。主要有两种方法:
1. **十进制缩放归一化** (Decimal Scaling Normalization):也称为小数定标法或标准化。这种方法是通过减去每个特征的均值(平均值),然后除以该特征的标准差(方差的平方根)来实现的。公式通常表示为:
\[ X_{normalized} = \frac{X - \mu}{\sigma} \]
其中 \( X \) 是原始特征,\( \mu \) 是均值,\( \sigma \) 是标准差。结果范围是介于-1到1之间。
2. **最大最小归一化** (Min-Max Scaling or Rescaling):也称为线性归一化,它将数据缩放到一个新的最小值0和最大值1之间的区间。具体计算方法如下:
\[ X_{normalized} = \frac{X - X_{min}}{X_{max} - X_{min}} \]
在这个过程中,\( X_{min} \) 是特征的最小值,\( X_{max} \) 是最大值。这样做使得所有特征都在同一尺度上,方便比较。
这两种方法都有助于减少特征间的量纲差异,加速训练过程,并且避免某些特征过大对其他特征的影响。同时,归一化也有利于防止某些权重过大导致模型过拟合。
相关问题
深度学习归一化和反归一化
### 深度学习中的归一化与反归一化
#### 归一化的定义及其重要性
归一化是数据预处理的一个关键步骤,能够有效地提升模型性能、数值稳定性及训练效率。不同的归一化技术适用于不同场景下的神经网络结构,合理的选择能显著改善最终的训练效果[^2]。
#### 常见的归一化方法概述
常见的几种归一化方式包括但不限于:
- **最大最小归一化 (Min-Max Scaling)**:通过线性变换将特征缩放到指定范围。
- **Z-score归一化 (Standardization)**:使数据分布具有零均值和单位方差特性。
- **小数定标归一化 (Decimal Scaling)**:基于十进制的比例因子调整原始数值大小。
- **批量归一化 (Batch Normalization, BN)**:针对每一批次的数据,在激活函数之前执行标准化操作。
- **层归一化 (Layer Normalization, LN)** 和 **实例归一化 (Instance Normalization, IN)**:分别作用于单一样本内的所有通道或同一通道的不同位置上。
- **组归一化 (Group Normalization, GN)**:结合了上述两种策略的优点,按一定数量分组后再做标准化处理[^3]。
#### 批量归一化(Batch Normalization)的具体实现过程
为了减少内部协变量偏移(Internal Covariate Shift),即各层输入统计特性的变化,批量归一化被引入到每一层中去。具体来说就是在前向传播过程中计算当前batch内各个维度上的均值μ_B和标准差σ_B;接着利用这两个参数对原输入x进行转换得到y=(x−μ_B)/√(σ²_B+ε),其中ε是一个很小的常数用来防止除以0的情况发生。最后再乘以可学习参数γ并加上β来恢复尺度和平移信息[^4]。
```python
import torch.nn as nn
class BatchNorm(nn.Module):
def __init__(self, num_features, eps=1e-5, momentum=0.1):
super().__init__()
self.eps = eps
self.momentum = momentum
# 初始化gamma和beta为可训练参数
self.gamma = nn.Parameter(torch.ones(num_features))
self.beta = nn.Parameter(torch.zeros(num_features))
# 注册运行时统计数据
self.register_buffer('running_mean', torch.zeros(num_features))
self.register_buffer('running_var', torch.ones(num_features))
def forward(self, x):
if self.training:
batch_mean = x.mean(dim=0)
batch_var = x.var(dim=0, unbiased=False)
# 更新移动平均估计
with torch.no_grad():
n = float(x.size()[0])
new_running_mean = (1 - self.momentum) * self.running_mean + \
self.momentum * batch_mean
new_running_var = (1 - self.momentum) * self.running_var + \
self.momentum * batch_var
y = (x - batch_mean) / ((batch_var + self.eps).sqrt())
# 使用最新的运行状态更新模块属性
self.running_mean.copy_(new_running_mean)
self.running_var.copy_(new_running_var)
else:
y = (x - self.running_mean) / ((self.running_var + self.eps).sqrt())
return self.gamma.view_as(y) * y + self.beta.view_as(y)
```
#### 反归一化的概念及应用场景
当完成预测后,可能需要将经过归一化后的输出重新映射回原来的尺度空间以便解释结果的实际意义。这一步骤被称为反归一化。例如,在图像生成任务中,如果像素强度已经被标准化到了[-1,+1]区间,则在展示图片前需将其还原至[0,255]范围内显示正常色彩。
对于简单的线性变换类归一化方案而言,只需保存最初的平移项b和比例系数a即可轻松实现逆运算z=ax+b。而对于像BN这样的复杂机制由于涉及到了动态计算的过程所以通常不需要显式的反归一化步骤除非特别需求。
def normalize_and_convert_to_binary(arr): # 将数组进行归一化 arr = np.array(arr) arr_norm = (arr - np.min(arr)) / (np.max(arr) - np.min(arr)) # 将归一化后的小数乘以255,得到一个范围在0到255的整数 arr_int = (arr_norm * 255).astype(int).tolist() # 将整数转换为8位二进制数 arr_bin = [] for i in range(len(arr_int)): arr_bin.append(format(arr_int[i], '08b')) return arr_bin def denormalize(arr_bin): # 将十进制数除以255,得到范围在0到1之间的小数 arr_dec = np.array([int(binary_num, base=2) for binary_num in arr_bin]) arr_norm = arr_dec / 255.0 # 将范围在0到1之间的小数反归一化 arr_denorm = arr_norm * (np.max(arr_norm) - np.min(arr_norm)) + np.min(arr_norm) return arr_denorm
这段代码实现了一个数组的归一化和反归一化过程,以及将整数转换为二进制数。
首先,`normalize_and_convert_to_binary`函数接收一个数组作为参数,并将该数组进行归一化处理。归一化的目的是将数组的值缩放到特定的范围内,这里是将数组中的值缩放到0-255之间。具体实现是将数组的每个值减去数组中的最小值,然后除以数组中的最大值和最小值之差,得到一个范围在0到1之间的小数。接着,将这个小数乘以255,得到一个范围在0到255的整数,然后将这个整数转换为一个8位的二进制数,存储在一个字符串数组中,并将这个数组作为函数的返回值。
接下来,`denormalize`函数接收一个字符串数组作为参数,表示一个由整数转换而来的二进制数数组。这个函数将字符串数组中的每个二进制数转换为一个十进制数,然后将这个十进制数除以255,得到一个范围在0到1之间的小数。接着,将这个小数反归一化,得到原始数组中的值,并将这个数组作为函数的返回值。
总体来说,这段代码实现了一个通用的数组归一化和反归一化的过程,并将整数转换为二进制数。这个过程在机器学习和神经网络中经常用到,例如在图像处理中,将像素值归一化到0-1之间,或将标签值转换为二进制数等。
阅读全文