keras“;“未知损失函数”;定义自定义损失函数后出错
我在loss.py文件的keras中定义了一个新的loss函数。我关闭并重新启动anaconda提示符,但我得到了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进行更多的篡改,以将字符串映
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