【问题标题】:keras custom activity regularizerkeras 自定义活动正则化器
【发布时间】:2018-12-24 09:10:51
【问题描述】:
def kl_divergence(p, p_hat):
    return (p * K.log(p / p_hat)) + ((1 - p) * K.log((1 - p) / (1 - p_hat)))

class SparseActivityRegularizer(Regularizer):
    sparsityBeta = None

def __init__(self, l1=0., l2=0., p=0.01, sparsityBeta=0.1):
    self.p = p
    self.sparsityBeta = sparsityBeta

def set_layer(self, layer):
    self.layer = layer

def __call__(self,loss):
    #p_hat needs to be the average activation of the units in the hidden layer.      
    p_hat = T.sum(T.mean(self.layer.get_output(True) , axis=0))

    loss += self.sparsityBeta * kl_divergence(self.p, p_hat)
    return loss

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

当我在模型中调用这个自定义正则化器时,如下所示

dr=0.5
inputs = Input(shape=(392,))
x = Dense(1000,activation='relu',activity_regularizer=SparseActivityRegularizer())(inputs)
x=Dropout(dr)(x)
out= Dense(392, activation='sigmoid')(x)
model = Model(inputs=inputs, outputs=out)



model.compile(loss=euc_dist_keras,
         optimizer='adadelta', metrics=["accuracy"])
model.summary()

filepath="weightdae.best.hdf5"
checkpoint = ModelCheckpoint(filepath, monitor='val_loss', verbose=1, 
save_best_only=True, mode='min')
callbacks_list = [checkpoint,TensorBoard(log_dir='/tmp/autoencoder')]
hist = model.fit(ptilde, p,
             nb_epoch=40,
             shuffle=True,
             validation_data=(ptilde_val,p_val),
            batch_size=32,
            callbacks=callbacks_list) 

我收到以下错误

AttributeError: 'SparseActivityRegularizer' object has no attribute 'layer'

有人可以帮我解决这个错误吗? 我检查了正则化器的实现, keras 中的活动正则化器也以相同的方式实现。 但是在这里不知何故找不到属性“层”并抛出此错误。

【问题讨论】:

  • 你在哪里看到可以在正则化器中使用这个名为 layer 的属性?

标签: python keras autoencoder regularized


【解决方案1】:

这种类型的正则化声明已弃用 here。从 Keras 1.2.0 开始,您必须将正则化实现为像 here 这样的函数或像 here 这样的可调用类

【讨论】:

  • 虽然理论上可以回答这个问题,但最好在此处包含答案的基本部分,并提供链接以供参考。
  • 我在跟踪 Keras 存储库的 github 提交时发现了这种弃用。我所知道的就是这种弃用,我不知道如何实现这种正则化。添加了关于弃用的链接以回答。
【解决方案2】:

试试这个:

class SparseRegularizer(keras.regularizers.Regularizer):
    
    def __init__(self, rho = 0.01,beta = 1):
        """
        rho  : Desired average activation of the hidden units
        beta : Weight of sparsity penalty term
        """
        self.rho = rho
        self.beta = beta
        

    def __call__(self, activation):
        rho = self.rho
        beta = self.beta
        # sigmoid because we need the probability distributions
        activation = tf.nn.sigmoid(activation)
        # average over the batch samples
        rho_bar = K.mean(activation, axis=0)
        # Avoid division by 0
        rho_bar = K.maximum(rho_bar,1e-10) 
        KLs = rho*K.log(rho/rho_bar) + (1-rho)*K.log((1-rho)/(1-rho_bar))
        return beta * K.sum(KLs) # sum over the layer units

    def get_config(self):
        return {
            'rho': self.rho,
            'beta': self.beta
        }

【讨论】:

    猜你喜欢
    • 2019-01-25
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 2021-04-06
    相关资源
    最近更新 更多