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

lvdongjie 阅读:35 2024-10-01 17:34:08 评论:0

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

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

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

我试图通过更改 LearningRateScheduler 来创建自定义回调。来自 keras repo 的回调
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一定数量的时代后的参数?

请您参考如下方法:

我理解你的想法。我认为问题在于损失函数中的 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 作为类变量而不是安装变量,然后更改损失函数如下:
def custom_loss(x, x_pred):  
    loss1 = binary_crossentropy(x, x_pred) 
    loss2 = (x, x_pred) 
    return (changeAlpha.alpha*)* loss1 + (1-changeAlpha.alpha)*loss2 

希望它可以帮助你。


标签:Python
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号