定义自定义丢失函数后,keras“未知丢失函数”错误

时间:2017-08-08 19:27:14

标签: keras

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

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

5 个答案:

答案 0 :(得分:13)

在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})

答案 1 :(得分:0)

看起来你正试图通过字符串别名来调用该函数,这需要更多地篡改Keras'losses.py以将字符串映射到函数(如果你更新它会被覆盖,你不应该做的事情包裹)。而只是在项目中声明该函数并将其传递给loss参数,例如:

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

只要您的函数满足要求here,它就能正常工作。

答案 2 :(得分:0)

解决方案是将函数添加到环境文件夹中keras中的losses.py.起初,我在anaconda2/pkgs/keras.../losses.py中添加了它,这就是我收到错误的原因。

环境中loss.py的路径如下:

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

答案 3 :(得分:0)

我对上述解决方案不走运,但是我能够做到这一点:

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 :(得分:0)

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

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

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)