我在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)
这些解决方案都不适合我,因为我有两个或多个用于多个输出变量的嵌套函数。
我的解决方案是加载模型时不编译。稍后我会使用训练模型时使用的损失函数列表来编译模型。
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)
看起来您正在尝试通过字符串别名调用该函数,这需要对 Keras 进行更多篡改losses.py才能将字符串映射到该函数(您不应该这样做,因为如果更新包,它会被覆盖)。相反,只需在项目中声明该函数并将其传递给loss参数,例如:
from your.project import binary_crossentropy_2
# ...
model.fit(epochs, loss=binary_crossentropy_2)
Run Code Online (Sandbox Code Playgroud)
只要你的函数遵循满足这里的要求,它就可以正常工作。
| 归档时间: |
|
| 查看次数: |
6020 次 |
| 最近记录: |