首页 文章

在Keras内部实施自定义活动规则制定者

提问于
浏览
1

我试图在Andrew Ng Sparse Autoencoder的损失函数内实现正则化项 . 在第15页,引入了稀疏性惩罚项,其根据所有隐藏层单元的rho和rho_hat_j之间的Kullback-Leibor(KL)散度的总和计算 . rho是静态数,它迫使神经元大部分关闭,rho_hat_j是整个训练集上神经元j的平均输出(激活) .

我正在使用Keras来实现自动编码器,我知道有一个关于使用Keras构建自动编码器的精彩教程可以在Keras Blog上找到,但我想在Keras中使用自定义正则化器来实现所描述的稀疏惩罚术语 . 关于这个问题的一些旧实现在Link,_ Link上找到,但是自1.2.0版以来Keras上的正规化API发生了变化,它们已被弃用,不再适用 .

所以我试图用这样的东西来实现它:

from keras import backend as K

def kl_divergence(rho, rho_hat):
    return rho * tf.log(rho) - rho * tf.log(rho_hat) + (1 - rho) * tf.log(1 - rho) - (1 - rho) * tf.log(1 - rho_hat)

class SparseActivityRegularizer(Regularizer):

    def __init__(self, p=0.1, sparsityBeta=3):
        self.p = p
        self.sparsityBeta = sparsityBeta

    def __call__(self, x):
        regularization = 0            

        p_hat = K.mean(x, axis=0)
        regularization += self.sparsityBeta * K.sum(kl_divergence(self.p, p_hat))

        return regularization

    def get_config(self):
        return {"name": self.__class__.__name__}

这是对的吗?!

我没有在任何地方找到的一个大问题,究竟是什么传递给callable __ call __(作为x参数)?

我是否正确x是2维张量,每行属于每个神经元,每列属于训练集上的每个样本,并且每个单元(i,j)将输出神经元i用于训练集的样本j?

Update: Shorter Question

考虑一下Keras中的3层自动编码器,应该如何实现这个整体成本函数?

Sparse Autoencoder Cost Function

beta:稀疏惩罚系数(例如3)

s_2:隐藏层中的单位数

rho:固定值(例如0.2)

m:训练集中的样本数

x_i:我的训练集样本

a_2_j(x_i):第i层第j个单元的输出,用于第i个训练集样本

1 回答

  • 1

    你的代码是对的 . 但似乎没有关于您的自动编码器模型的任何代码 . 它只是隐藏层的正规化器 .

    • 由于您定义了一个活动正则化器, __call__ 函数中的X是活动(隐藏层的输出),其形状应为(?,hidden_dim) . "?"表示样品数量,在装配前未知 . hidden_dim 是隐藏层中神经元的数量,在我的例子中它应该是250 .

    如果要构建整体,则应该知道如何定义其他层 . 这是一个玩具的例子 .

    x_input = Input(shape=(576,))
    regularizer = SparseActivityRegularizer(0.1, 6)
    encoded = Dense(250, activation='relu', activity_regularizer=regularizer)(x_input)
    decoded = Dense(576, activation ='relu')(encoded)
    ae = Model(inputs=x_input, outputs=decoded)
    

    然后您可以通过以下方式编译和拟合模型:

    ae.compile(optimizer='adam', loss='mse')
    ae.fit(x_train, x_train, epochs=1, batch_size=50)
    

    因此整体损失函数由两部分组成:1)编译模型时分配的 mse 和定义隐藏层时的活动正则化(在我的示例中为 encoded

相关问题