我想实现一个具有稀疏输入层的分类器。我的数据约有60个维度,我想检查一下功能的重要性。为此,我希望第一层具有对角线权重矩阵(我要向其应用L1内核正则化器),所有非对角线应为不可训练的零。因此,每个输入通道一对一连接,密集层将混合输入变量。我检查了Specify connections in NN (in keras)和Custom connections between layers Keras。我不能使用后者,因为Lambda层不会引入可训练的权重。
但是,这种情况不会影响实际的体重矩阵:
if
训练模型并打印权重时,第一层没有得到对角矩阵。
我在做什么错了?
答案 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())
。