kernel_constraint=max_norm(3) 是做什么的?

What does kernel_constraint=max_norm(3) do?

在我正在研究的其中一个教程(link 下面给出)中,作者将基线神经网络结构概述为:

卷积输入层,32个大小为3×3的特征图,整流器激活函数和最大范数设置为3的权重约束。

model.add(Conv2D(32, (3, 3), input_shape=(3, 32, 32), padding='same', activation='relu', kernel_constraint=maxnorm(3)))

最大范数的权重约束对Conv层意味着什么? (我们正在使用 Keras。)

https://machinelearningmastery.com/object-recognition-convolutional-neural-networks-keras-deep-learning-library/

谢谢!

max_norm的权重约束有什么作用?

如果您的权重的 L2 范数超过 m

maxnorm(m) 将通过将范数降低到 m 的因子缩放您的整个权重矩阵。 正如您可以在 class MaxNorm(Constraint) 中的 keras code 中找到的那样:

现在源代码在tensorflow.

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 层结合使用效果特别好。更多信息请参阅 this paper

中的第 5.1 章