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

nab*_*abs 5 python deep-learning keras tensorflow 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
Run Code Online (Sandbox Code Playgroud)

根据我的研究,创建自定义回调是可行的方法。我在此处此处查看了类似问题的解决方案,但这些解决方案没有实现我想要完成的回调解决方案。

我试图通过更改LearningRateScheduler来自keras 存储库的回调来创建自定义回调

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))
Run Code Online (Sandbox Code Playgroud)

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

有人可以帮我编辑回调,使其alpha在一定数量的时期后改变我的参数吗?

小智 4

我明白你的想法。我认为问题在于损失函数中的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
Run Code Online (Sandbox Code Playgroud)

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

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

希望它可以帮助你。