batch normalization层的权重如何设置?
How to set weights of the batch normalization layer?
如何设置Keras的batch normalization层的权重?
我对文档有点困惑
weights:初始化权重。 2 个 Numpy 数组的列表,形状为:[(input_shape,), (input_shape,)] 注意这个列表的顺序是 [gamma, beta, mean, std]
我们需要所有四个 [gamma、beta、mean、std] 吗?有没有办法只使用 [gamma, beta] 来设置权重?
是的,您需要所有四个值。回忆一下批量归一化的作用。它的目标是规范化(即均值 = 0 和标准偏差 = 1)进入每一层的输入。为此,您需要(mean, std)
。因此,归一化激活可以看作是进行线性变换的子网络的输入:
y = gamma*x_norm + beta
(gamma, beta)
非常重要,因为它们补充了 (mean,std)
,因为 (gamma, beta)
有助于从标准化激活中恢复原始激活。如果您不这样做或更改任何一个参数而不考虑其他参数,则可能会更改激活的语义。现在可以使用您的下一层处理这些原始激活。对所有层重复此过程。
编辑:
另一方面,我认为值得尝试首先计算大量图像的均值和标准差,然后将其输入作为您的均值和标准差。请注意,您正在计算均值和标准差的图像来自与您的训练数据相同的分布。我认为这应该有效,因为批归一化通常有两种计算均值的模式,一种是 运行 批次平均维护,另一种是全局均值(至少在 Caffe 中,参见 here)。
如何设置Keras的batch normalization层的权重?
我对文档有点困惑
weights:初始化权重。 2 个 Numpy 数组的列表,形状为:[(input_shape,), (input_shape,)] 注意这个列表的顺序是 [gamma, beta, mean, std]
我们需要所有四个 [gamma、beta、mean、std] 吗?有没有办法只使用 [gamma, beta] 来设置权重?
是的,您需要所有四个值。回忆一下批量归一化的作用。它的目标是规范化(即均值 = 0 和标准偏差 = 1)进入每一层的输入。为此,您需要(mean, std)
。因此,归一化激活可以看作是进行线性变换的子网络的输入:
y = gamma*x_norm + beta
(gamma, beta)
非常重要,因为它们补充了 (mean,std)
,因为 (gamma, beta)
有助于从标准化激活中恢复原始激活。如果您不这样做或更改任何一个参数而不考虑其他参数,则可能会更改激活的语义。现在可以使用您的下一层处理这些原始激活。对所有层重复此过程。
编辑:
另一方面,我认为值得尝试首先计算大量图像的均值和标准差,然后将其输入作为您的均值和标准差。请注意,您正在计算均值和标准差的图像来自与您的训练数据相同的分布。我认为这应该有效,因为批归一化通常有两种计算均值的模式,一种是 运行 批次平均维护,另一种是全局均值(至少在 Caffe 中,参见 here)。