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

mat*_*ang 7 keras

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

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

Par*_*dhu 16

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


qub*_*t10 7

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

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

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


Mac*_*ero 0

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

from your.project import binary_crossentropy_2
# ...
model.fit(epochs, loss=binary_crossentropy_2)
Run Code Online (Sandbox Code Playgroud)

只要你的函数遵循满足这里的要求,它就可以正常工作。