如何在keras中强制特征正交

时间:2018-07-07 07:33:35

标签: 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 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分别在每个层上执行正则化,却找不到方法来定义多个权重的正则化器。

0 个答案:

没有答案