加载自定义损失+ keras的模型

Jas*_*son 13 python keras

在Keras中,如果您需要使用其他参数进行自定义丢失,我们可以像https://datascience.stackexchange.com/questions/25029/custom-loss-function-with-additional-parameter-in-中所述使用它.keras

def penalized_loss(noise):
    def loss(y_true, y_pred):
        return K.mean(K.square(y_pred - y_true) - K.square(y_true - noise), axis=-1)
    return loss
Run Code Online (Sandbox Code Playgroud)

当我训练模型时,上述方法有效.但是,一旦训练模型,我就难以加载模型.当我尝试在load_model中使用custom_objects参数时,如下所示

model = load_model(modelFile, custom_objects={'penalized_loss': penalized_loss} )
Run Code Online (Sandbox Code Playgroud)

它抱怨 ValueError: Unknown loss function:loss

有没有办法将损失函数作为自定义损失之一传递custom_objects?从我可以收集的内容来看,在load_model调用期间,内部函数不在命名空间中.是否有更简单的方法来加载模型或使用附加参数的自定义损失

ric*_*ert 18

就在这里!custom_objects期望您用作损失函数的确切函数(在您的情况下是内部函数):

model = load_model(modelFile, custom_objects={ 'loss': penalized_loss(noise) })
Run Code Online (Sandbox Code Playgroud)

不幸的是,keras不会在模型中存储噪声值,因此您需要手动将其提供给load_model函数.


小智 5

如果要加载模型只是预测(不训练),你可以编译标志设置为Falseload_model如下:

model = load_model(model_path, compile=False)
Run Code Online (Sandbox Code Playgroud)

这不会搜索损失函数,因为它仅用于编译模型。


小智 5

我遇到了同样的问题,经过多次研究,我可以假设这是有效的:

  1. 首先,加载模型并分配compile=False.
  2. 使用自定义损失函数编译模型。
  3. 重新训练你的模型。

例子:

def custom_loss(y_true, y_pred):
   nn = np.square(y_true - y_pred)
   return nn

model = load_model("aaaa.h5", compile=False)
model.compile(loss=custom_loss, optimizer='adam', metrics=custom_loss)
model.fit(...)
Run Code Online (Sandbox Code Playgroud)