如何在Keras中创建依赖于时期数的损失函数参数?

时间:2018-10-09 03:08:02

标签: python tensorflow keras deep-learning loss-function

我有一个带有超参数alpha的自定义损失函数,我想在训练中每20个周期更改一次。损失函数类似于:

def custom_loss(x, x_pred): 
    loss1 = binary_crossentropy(x, x_pred)
    loss2 = (x, x_pred)
    return (alpha)* loss1 + (1-alpha)*loss2

根据我的研究,创建自定义回调是必经之路。我已经看过类似问题herehere的解决方案,但是这些解决方案并未实现我要完成的回调解决方案。

我试图通过更改keras repoLearningRateScheduler回调来创建自定义回调

class changeAlpha(Callback):
    def __init__(self, alpha):
        super(changeAlpha, self).__init__()
        self.alpha = alpha 

    def on_epoch_begin(self, epoch, logs={}):
        if epoch%20 == 0:   
             K.set_value(self.alpha, K.get_value(self.alpha) * epoch**0.95)
             print("Setting alpha to =", str(alpha))

但是,我不确定alpha值实际上是否与我的损失函数中的alpha值相对应。无论如何,当我将changeAlpha回调函数放在model.fit方法中时,都会收到一个attribute error

有人可以帮助我编辑回调,以便在一定次数后更改我的alpha参数吗?

1 个答案:

答案 0 :(得分:0)

我了解您的想法。我认为问题在于,损失函数中的alpha没有引用到changeAlpha类的成员。您可以尝试这样:

instance = changeAlpha()
def custom_loss(x, x_pred): 
    loss1 = binary_crossentropy(x, x_pred)
    loss2 = (x, x_pred)
    return (instance.alpha*)* loss1 + (1-instance.alpha)*loss2

或者,您可以将alpha作为类变量而不是install变量,然后按如下所示更改损失函数:

def custom_loss(x, x_pred): 
    loss1 = binary_crossentropy(x, x_pred)
    loss2 = (x, x_pred)
    return (changeAlpha.alpha*)* loss1 + (1-changeAlpha.alpha)*loss2

希望它可以为您提供帮助。