Normalization
classkeras.layers.Normalization(axis=-1, mean=None, variance=None, invert=False, **kwargs)
一个用于连续特征标准化的预处理层.
该层将输入转换为以0为中心、标准差为1的分布.它通过预先计算数据的均值和方差,并在运行时调用(input - mean) / sqrt(var)
来实现这一点.
层的均值和方差值必须在构造时提供,或者通过adapt()
学习.adapt()
将计算数据的均值和方差,并将它们存储为层的权重.在调用fit()
、evaluate()
或predict()
之前,应调用adapt()
.
参数:
axis: 整数、整数元组或None.应该为形状中的每个索引分别计算均值和方差的轴或轴.
例如,如果形状是(None, 5)
且axis=1
,层将为最后一个轴跟踪5个单独的均值和方差值.
如果axis
设置为None
,层将通过标量均值和方差标准化输入中的所有元素.
当-1
时,假定输入的最后一个轴为特征维度,并按索引进行标准化.
请注意,在特定情况下,批量标量输入且唯一的轴是批量轴时,默认将分别标准化批量中的每个索引.
在这种情况下,建议传递axis=None
.默认为-1
.
mean: 用于标准化的均值.传递的值将广播到保留轴的形状上;
如果值不能广播,则在此层的build()
方法被调用时会引发错误.
variance: 用于标准化的方差.传递的值将广播到保留轴的形状上;
如果值不能广播,则在此层的build()
方法被调用时会引发错误.
invert: 如果为True
,该层将对其输入应用逆变换:它将把标准化输入还原为其原始形式.
示例:
通过在adapt()
中分析数据集来计算全局均值和方差.
>>> adapt_data = np.array([1., 2., 3., 4., 5.], dtype='float32')
>>> input_data = np.array([1., 2., 3.], dtype='float32')
>>> layer = keras.layers.Normalization(axis=None)
>>> layer.adapt(adapt_data)
>>> layer(input_data)
array([-1.4142135, -0.70710677, 0.], dtype=float32)
为最后一个轴上的每个索引计算均值和方差.
>>> adapt_data = np.array([[0., 7., 4.],
... [2., 9., 6.],
... [0., 7., 4.],
... [2., 9., 6.]], dtype='float32')
>>> input_data = np.array([[0., 7., 4.]], dtype='float32')
>>> layer = keras.layers.Normalization(axis=-1)
>>> layer.adapt(adapt_data)
>>> layer(input_data)
array([-1., -1., -1.], dtype=float32)
直接传递均值和方差.
>>> input_data = np.array([[1.], [2.], [3.]], dtype='float32')
>>> layer = keras.layers.Normalization(mean=3., variance=2.)
>>> layer(input_data)
array([[-1.4142135 ],
[-0.70710677],
[ 0. ]], dtype=float32)
使用该层对输入进行反标准化(在适应层之后).
>>> adapt_data = np.array([[0., 7., 4.],
... [2., 9., 6.],
... [0., 7., 4.],
... [2., 9., 6.]], dtype='float32')
>>> input_data = np.array([[1., 2., 3.]], dtype='float32')
>>> layer = keras.layers.Normalization(axis=-1, invert=True)
>>> layer.adapt(adapt_data)
>>> layer(input_data)
array([2., 10., 8.], dtype=float32)