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。)
谢谢!
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 章
在我正在研究的其中一个教程(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。)
谢谢!
max_norm
的权重约束有什么作用?
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