我想实现一个带有稀疏输入层的分类器。我的数据有大约 60 个维度,我想检查特征重要性。为此,我希望第一层具有对角权重矩阵(我想对其应用 L1 核正则化器),所有非对角线都应该是不可训练的零。因此,每个输入通道一对一连接,密集层将混合输入变量。我检查了在 NN 中指定连接(在 keras 中)和层之间的自定义连接 Keras。后一个我不能使用,因为 Lambda 层不引入可训练的权重。
然而,这样的事情不会影响实际的权重矩阵:
class MyLayer(Layer):
def __init__(self, output_dim,connection, **kwargs):
self.output_dim = output_dim
self.connection=connection
super(MyLayer, self).__init__(**kwargs)
def build(self, input_shape):
# Create a trainable weight variable for this layer.
self.kernel = self.add_weight(name='kernel',
shape=(input_shape[1], self.output_dim),
initializer='uniform',
trainable=True)
self.kernel=tf.linalg.tensor_diag_part(self.kernel)
self.kernel=tf.linalg.tensor_diag(self.kernel)
super(MyLayer, self).build(input_shape) # Be sure to call this at the end
def call(self, x):
return K.dot(x, self.kernel)
def compute_output_shape(self, input_shape):
return (input_shape[0], self.output_dim)
Run Code Online (Sandbox Code Playgroud)
当我训练模型并打印权重时,我没有得到第一层的对角矩阵。
我究竟做错了什么?