这是一个使用它的 keras 代码示例:
from keras.constraints import max_norm
model.add(Convolution2D(32, 3, 3, input_shape=(3, 32, 32),
border_mode='same', activation='relu', kernel_constraint=max_norm(3)))
这是一个使用它的 keras 代码示例:
from keras.constraints import max_norm
model.add(Convolution2D(32, 3, 3, input_shape=(3, 32, 32),
border_mode='same', activation='relu', kernel_constraint=max_norm(3)))
来自http://cs231n.github.io/neural-networks-2/#reg:
最大范数约束。另一种形式的正则化是对每个神经元的权重向量的大小强制一个绝对上限,并使用投影梯度下降来强制约束。在实践中,这对应于正常执行参数更新,然后通过钳位权重向量来执行约束每个神经元满足的典型值是 3 或 4 的数量级。有些人报告使用这种形式的正则化时有所改进。它的一个吸引人的特性是,即使学习率设置得太高,网络也不会“爆炸”,因为更新总是有界的。
我发现McLawrence在另一个问题中的回答非常有帮助。转载如下:
权重约束有
max_norm
什么作用?
maxnorm(m)
如果您的权重的 L2-Norm 超过m
,则将整个权重矩阵缩放一个因子,将规范降低到m
。正如您可以在keras 代码中找到的那样class MaxNorm(Constraint)
:def __call__(self, w): norms = K.sqrt(K.sum(K.square(w), axis=self.axis, keepdims=True)) desired = K.clip(norms, 0, self.max_value) w *= (desired / (K.epsilon() + norms)) return w
此外,
maxnorm
有一个axis
参数,计算规范。在您的示例中,您没有指定轴,因此范数是在整个权重矩阵上计算的。例如,如果您想约束每个卷积滤波器的范数,假设您使用tf
维度排序,则权重矩阵的形状为(rows, cols, input_depth, output_depth)
。计算范数axis = [0, 1, 2]
会将每个过滤器约束到给定的范数。为什么要这样做?
直接约束权重矩阵是另一种正则化。如果你使用一个简单的 L2 正则化项,你会用你的损失函数惩罚高权重。使用此约束,您可以直接进行正则化。正如
keras
代码中所链接的那样,这似乎与dropout
层结合使用特别好。更多信息请参阅本文第 5.1 章