我试图在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层自动编码器,应该如何实现这个整体成本函数?
beta:稀疏惩罚系数(例如3)
s_2:隐藏层中的单位数
rho:固定值(例如0.2)
m:训练集中的样本数
x_i:我的训练集样本
a_2_j(x_i):第i层第j个单元的输出,用于第i个训练集样本
1 回答
你的代码是对的 . 但似乎没有关于您的自动编码器模型的任何代码 . 它只是隐藏层的正规化器 .
__call__
函数中的X是活动(隐藏层的输出),其形状应为(?,hidden_dim) . "?"表示样品数量,在装配前未知 .hidden_dim
是隐藏层中神经元的数量,在我的例子中它应该是250 .如果要构建整体,则应该知道如何定义其他层 . 这是一个玩具的例子 .
然后您可以通过以下方式编译和拟合模型:
因此整体损失函数由两部分组成:1)编译模型时分配的
mse
和定义隐藏层时的活动正则化(在我的示例中为encoded
)