如何在keras中增强特征正交性

如何在keras中增强特征正交性,keras,Keras,我是Keras和Tensorflow的新手。我想根据网络中的一些输出,给我的分类交叉熵损失函数增加一个惩罚。具体来说,我将完全连接层的输出分解为8个分区,希望这些输出是正交的。因此,我将激活附加到一个列表中,并使用Keras后端将其转换为一个堆栈。下面是我如何划分激活的: for i in range(8): x_sub = Lambda(lambda x: x[:,i*128:i*128+128])(x) features.append(x_sub) #convert bat

我是Keras和Tensorflow的新手。我想根据网络中的一些输出,给我的分类交叉熵损失函数增加一个惩罚。具体来说,我将完全连接层的输出分解为8个分区,希望这些输出是正交的。因此,我将激活附加到一个列表中,并使用Keras后端将其转换为一个堆栈。下面是我如何划分激活的:

for i in range(8):
    x_sub = Lambda(lambda x: x[:,i*128:i*128+128])(x)
    features.append(x_sub)

#convert batch of feature lists in to 8x(128*batch_size) keras tensor
outs.append(Lambda(lambda x:  K.reshape(K.stack(x, axis=0), (8, -1)))(features))
net = Model(inputs=[net.input], outputs=outs)
然后我将损失定义如下:

def OrthLoss(features):
    W = K.l2_normalize(features, axis=1)
    diff = K.dot(W, K.transpose(W)) - K.eye(8)
    return K.mean(diff)

然而,这似乎并不一致。这是实现这一目标的正确方法吗?我第一次尝试将正交性作为权重上的正则化子来执行,但据我所知,Keras在每个层上分别执行正则化,并且没有找到在多个权重上定义正则化子的方法

你如何编译你的模型?是否有可能提供可复制的代码?