首页 > 解决方案 > 修复 Keras/TensorFlow 卷积滤波器中的权重总和

问题描述

我在神经网络中有一个 2D 卷积过滤层(称为 7x7)。我想限制过滤器使其权重加起来为 0。(这是图像处理中卷积过滤器的常见要求 - 想法是过滤器对亮度的局部变化敏感,但对亮度的绝对水平不敏感亮度。)这或多或少相当于拥有一个 48 权重的层,其输入为 x[-3,-3]-x[0,0], x[-3,-2]-x[0,0] , ... x[3,3]-x[0,0]。

出于某种原因,我看不到任何本机功能可以施加此约束。

到目前为止我尝试过的事情:

例如

class FixSum(Regularizer):      
def call(self, x):
    reg=0.01*math_ops.reduce_sum(math_ops.abs(math_ops.reduce_sum(x,axis=(0,1))))
    return reg

不利于收敛,特别是在正则化强度方面,它实际上可以有效地将权重之和驱动到零附近。

例如

class TestConstraint(Constraint):
      def __init__(self, N, target_sum):
        self.target_sum = tf.keras.backend.variable(target_sum,dtype="float32")
        self.N = N
      def __call__(self, w):
        t = math_ops.reduce_sum(x,axis=(0,1),keepdims=True) - self.target_sum
        t /= self.N
        return w - tf.keras.backend.repeat_elements(tf.keras.backend.repeat_elements(t, w.shape[0], 0), w.shape[1], 1)

有点作品,但收敛速度有待改进

我会做

Conv2D(48, (7,7), trainable=False, ...)
Conv2D(n, (1,1), ...)

其中第一个 Conv2D 的权重在一开始就设置为产生 x[-3,-3]-x[0,0] 等。

收敛速度不错,但性能不太好。而且它的扩展性不太好(如果我将内核从 7x7 增加到 15x15,这会使这个“假层”的计算复杂度增加约 20 倍。)

还有什么我应该尝试的吗?

标签: tensorflowkeras

解决方案


推荐阅读