我在loss.py文件中的keras中定义了一个新的丢失函数。我关闭并重新启动anaconda提示,但我得到了ValueError: ('Unknown loss function', ':binary_crossentropy_2')
。我在Windows 10上使用python2.7和anaconda运行keras。
我通过在编译模型的python文件中添加loss函数来暂时解决它。
答案 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)