【问题标题】:keras "unknown loss function" error after defining custom loss function定义自定义损失函数后,keras“未知损失函数”错误
【发布时间】:2017-08-08 19:27:14
【问题描述】:

我在 loss.py 文件中的 keras 中定义了一个新的损失函数。我关闭并重新启动 anaconda 提示符,但我得到了ValueError: ('Unknown loss function', ':binary_crossentropy_2')。我在 Windows 10 上使用 python2.7 和 anaconda 运行 keras。

我通过在我编译模型的python文件中添加损失函数来临时解决它。

【问题讨论】:

  • 请提供一些源代码,您无需将损失添加到loss.py中即可使其正常工作。
  • @MatiasValdenegro。我将它添加到 loss.py 是因为我希望所有模型都能够使用它,而不是在与模型相同的文件中定义它。感谢您的提醒,我现在就这样做。

标签: keras


【解决方案1】:

在 Keras 中,我们必须在 load_model 函数中传递自定义函数:

def my_custom_func():
    # your code
    return
from keras.models import load_model
model = load_model('my_model.h5', custom_objects={'my_custom_func':                   
my_custom_func})

【讨论】:

    【解决方案2】:

    这些解决方案都不适合我,因为我有两个或多个用于多个输出变量的嵌套函数。

    我的解决方案是在加载模型时不编译。我稍后会使用您训练模型时使用的损失函数列表来编译模型。

    from tensorflow.keras.models import load_model
    
    # load model weights, but do not compile
    model = load_model("mymodel.h5", compile=False)
    
    # printing the model summary 
    model.summary()
    
    # custom loss defined for feature 1
    def function_loss_o1(weights)
        N_c = len(weights)
        def loss(y_true, y_pred):
            output_loss = ... 
            return output_loss/N_c
        return loss
    
    # custom loss defined for feature 2
    def function_loss_o2(weights)
        N_c = len(weights)
        def loss(y_true, y_pred):
            output_loss = ... 
            return output_loss/N_c
        return loss 
    
    # list of loss functions for each output feature
    losses = [function_loss_o1, function_loss_o2]
    
    # compile and train the model
    model.compile(optimizer='adam', loss=losses, metrics=['accuracy'])
    
    # now you can use compiled model to predict/evaluate, etc
    eval_dict = {}
    eval_dict["test_evaluate"] = model.evaluate(x_test, y_test, batch_size=batch_size, verbose=0)
    

    【讨论】:

      【解决方案3】:

      上述解决方案我没有运气,但我能够做到这一点:

      from keras.models import load_model
      from keras.utils.generic_utils import get_custom_objects
      
      get_custom_objects().update({'my_custom_func': my_custom_func})
      
      model = load_model('my_model.h5')
      

      我在这里找到了解决方案:https://github.com/keras-team/keras/issues/5916#issuecomment-294373616

      【讨论】:

        【解决方案4】:

        您似乎正在尝试通过字符串别名调用该函数,这需要更多地篡改 Keras 的 losses.py 才能将字符串映射到函数(如果您更新包,它会被覆盖,您不应该这样做)。相反,只需在项目中声明该函数并将其传递给loss 参数,例如:

        from your.project import binary_crossentropy_2
        # ...
        model.fit(epochs, loss=binary_crossentropy_2)
        

        只要你的功能符合here的要求,就可以正常工作。

        【讨论】:

        • 这似乎是这样做的方式,但我无法导入from keras.losses import binary_crossentropy_2 错误是:“无法导入名称binary_crossentrophy2”
        • 你在哪里定义的函数?也许尝试将声明移动到您调用model.fit() 的同一文件中,因此无需导入。如果您的项目中有一个名为 keras 的包,这可能是问题所在,因为 Python 会首先查看您的分发库。
        • 在model.fit函数中似乎不再存在这个“损失”参数,我使用的是tensorflow 1.15.0
        【解决方案5】:

        解决方案是将函数添加到环境文件夹中 keras 的 loss.py 中。一开始我是在anaconda2/pkgs/keras.../losses.py添加的,所以才报错。

        loss.py 在环境中的路径类似于:

        anaconda2/envs/envname/lib/python2.7/site-packages/keras/losses.py

        【讨论】:

          猜你喜欢
          • 2019-03-10
          • 2017-12-20
          • 2020-12-19
          • 2017-12-18
          • 2020-03-27
          • 1970-01-01
          • 2018-12-26
          • 2018-08-06
          • 2018-10-28
          相关资源
          最近更新 更多