【问题标题】:What does kernel_constraint=max_norm(3) do?kernel_constraint=max_norm(3) 有什么作用?
【发布时间】:2017-08-30 22:55:44
【问题描述】:

在我正在编写的其中一个教程中(链接如下),作者将基线神经网络结构概述为:

卷积输入层,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/

谢谢!

【问题讨论】:

    标签: optimization computer-vision keras conv-neural-network convolution


    【解决方案1】:

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

    maxnorm(m) 将,如果您的权重的 L2-Norm 超过 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 代码中所链接的,这似乎与dropoutlayer 结合使用效果特别好。更多信息请参阅this paper中的第 5.1 章

    【讨论】:

    • 很好的解释!不应该是“计算axis = [0, 1] 上的范数会将每个过滤器限制为给定的范数”吗?
    • 这取决于你打算做什么。使用具有通道最后维度排序的卷积层,axis = [0, 1, 2] 对每个卷积滤波器进行归一化,因为权重矩阵的[:, : , :, i] 是第 i 个滤波器。仅使用[0, 1] 约束每个平面的过滤器权重,例如在第一层中,然后分别对 R、G 和 B 通道的权重进行归一化。
    • 知道了。我将“过滤器”理解为单个卷积矩阵(您称之为“平面”),因此会造成混淆。谢谢。
    • 您能告诉我如何仅将约束应用于权重矩阵的一部分吗?比如只对列奇数列向量 w_ij 使用 keras?
    • @Cecilia。如果实现还是一样的话,我认为这是做不到的。您必须实现自己的版本,以不同方式计算范数
    猜你喜欢
    • 2023-01-04
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 2012-05-13
    • 2014-05-26
    • 1970-01-01
    • 2020-01-06
    • 2013-10-05
    相关资源
    最近更新 更多