我在神经网络中有一个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倍。)
还有什么我应该尝试的吗?