keras“;“未知损失函数”;定义自定义损失函数后出错

keras“;“未知损失函数”;定义自定义损失函数后出错,keras,Keras,我在loss.py文件的keras中定义了一个新的loss函数。我关闭并重新启动anaconda提示符,但我得到了ValueError:('Unknown loss function',':binary\u crossentropy\u 2')。我在Windows10上使用python2.7和anaconda运行keras 我通过在编译模型的python文件中添加loss函数暂时解决了这个问题。看起来您正试图通过字符串别名调用该函数,这需要对Keras'loss.py进行更多的篡改,以将字符串映

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


我通过在编译模型的python文件中添加loss函数暂时解决了这个问题。

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

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

只要您的函数符合要求,它就可以正常工作。

解决方案是将该函数添加到环境文件夹中keras中的loss.py中。起初,我在anaconda2/pkgs/keras…/loss.py中添加了它,所以我得到了这个错误

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


anaconda2/envs/envname/lib/python2.7/site packages/keras/loss.py
在keras中,我们必须在
加载模式中传递自定义函数
函数:

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

我在上述解决方案中运气不佳,但我能够做到:

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')

我在这里找到了解决方案:

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

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

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)

请提供一些源代码,您无需将loss添加到loss.py中即可使其正常工作。@MatiasValdenegro。我将它添加到loss.py,因为我希望所有模型都能够使用它,而不是在与模型相同的文件中定义它。感谢您的提醒,我现在就这样做。这似乎是一种方法,但我无法从keras导入
。导入二进制\u CrossEntrophy\u 2
错误是:“无法导入名称二进制\u crossentrophy2”您在哪里定义函数?也许可以尝试将声明移动到调用
model.fit()
的同一个文件中,这样就不需要导入。如果您的项目中有一个名为
keras
的包,这可能是问题所在,因为Python将首先查找分发库。在model.fit函数中似乎不再存在此“loss”参数,我使用的是tensorflow 1.15.0