在Keras / TensorFlow卷积滤波器中固定权重之和

时间:2019-01-26 22:00:28

标签: tensorflow keras

我在神经网络中有一个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(n,(7,7),...)

我愿意

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

第一个Conv2D首先设置权重以产生x [-3,-3] -x [0,0]等。

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

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

0 个答案:

没有答案