具有对角线权重矩阵的自定义层

时间:2018-12-12 13:49:41

标签: python tensorflow keras keras-layer

我想实现一个具有稀疏输入层的分类器。我的数据约有60个维度,我想检查一下功能的重要性。为此,我希望第一层具有对角线权重矩阵(我要向其应用L1内核正则化器),所有非对角线应为不可训练的零。因此,每个输入通道一对一连接,密集层将混合输入变量。我检查了Specify connections in NN (in keras)Custom connections between layers Keras。我不能使用后者,因为Lambda层不会引入可训练的权重。

但是,这种情况不会影响实际的体重矩阵:

if

训练模型并打印权重时,第一层没有得到对角矩阵。

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

不太清楚您要确切执行的操作,因为对我而言,diagonal对于方阵而言,意味着您的图层输入和输出尺寸应保持不变。

无论如何,让我们首先谈谈方阵情况。我认为有两种方法可以实现对角矩阵都为零的权重矩阵。

方法1:仅在概念上遵循方阵思想,并使用可训练的权重向量来实现这一层,如下所示。

# instead of writing y = K.dot(x,W), 
# where W is the weight NxN matrix with zero values of the diagonal.
# write y = x * w, where w is the weight vector 1xN

方法2:使用默认的Dense图层,但使用自己的constraint

# all you need to create a mask matrix M, which is a NxN identity matrix
# and you can write a contraint like below
class DiagonalWeight(Constraint):
    """Constrains the weights to be diagonal.
    """
    def __call__(self, w):
        N = K.int_shape(w)[-1]
        m = K.eye(N)
        w *= m
        return w

当然,您应该使用Dense( ..., kernel_constraint=DiagonalWeight())