【问题标题】:Load custom loss with extra input in keras使用 keras 中的额外输入加载自定义损失
【发布时间】:2019-09-11 21:33:42
【问题描述】:

我有一个自定义损失函数,它将模型的输入作为参数之一。如果我在训练的同一会话中加载,我可以使用this 技术加载它。


def custom_loss(inputs):
    def loss(y_true, y_pred):
        return ...
    return loss

inputs = keras.layers.Input(shape=(...))
y = keras.layers.Activation('tanh')(inputs)

model = keras.models.Model(inputs=inputs, outputs=y)

model.compile(loss=custom_loss(inputs), optimizer='Adam')
model.fit(...)
model.save('mymodel.h5')
load_model('mymodel.h5', custom_objects={'custom_loss': custom_loss(inputs})

但是,当我尝试在以后的会话中加载模型时遇到问题,因为这次我无法访问原始输入张量。如果我创建了一个新的输入占位符,那么模型需要两组不同的输入并且我会出错。

inputs = keras.layers.Input(shape=(...))
load_model('mymodel.h5', custom_objects={'custom_loss': custom_loss(inputs)})

有没有解决这个问题的好方法?归根结底的问题是输入尚未反序列化,因此无法将它们传递给自定义对象。

我不想只保存权重并创建具有相同权重的新模型,因为我失去了优化器状态。

【问题讨论】:

  • 我不知道它是否对你有帮助,但我确实看到你的代码中有错字load_model('mymodel.h5', custom_objects={'custom_loss': custom_loss(inputs)})(括号)

标签: python tensorflow keras


【解决方案1】:

这对我有用。

load_model('mymodel.h5', custom_objects={'custom_loss': custom_loss(inputs)}, compile=False)

【讨论】:

    【解决方案2】:

    另一种方法是计算 Keras 层内的损失并传递一个虚拟损失函数,该函数仅将模型的输出作为 compile 方法中的损失返回。 还有其他方法可以做到这一点。但这是我更喜欢的一个。

    import tensorflow as tf
    print('Tensorflow', tf.__version__)
    
    def custom_loss(tensor):
        y_true, y_pred, inputs = tensor[0], tensor[1], tensor[1]
        loss = ...
        return tf.constant([0], dtype=tf.float32)
    
    def dummy_loss(y_true, y_pred):
        return y_pred
    
    def get_model(training=False):
        inputs = tf.keras.layers.Input(shape=(10,))
        y = tf.keras.layers.Activation('tanh')(inputs)
        if training:
            targets = tf.keras.layers.Input(shape=(10,)) 
            loss_layer = tf.keras.layers.Lambda(custom_loss)([targets, y, inputs])
            model = tf.keras.models.Model(inputs=[inputs, targets], outputs=loss_layer)
        else:
            model = tf.keras.models.Model(inputs=inputs, outputs=y)
        return model
    
    
    model = get_model(training=True)
    model.compile(optimizer='sgd', loss=dummy_loss)
    model.save('model.h5')
    
    new_model = tf.keras.models.load_model('model.h5', custom_objects={'dummy_loss':dummy_loss})
    

    【讨论】:

      猜你喜欢
      • 2018-06-30
      • 2020-04-30
      • 2021-01-21
      • 2023-03-07
      • 2019-06-19
      • 2023-03-14
      • 1970-01-01
      • 2020-12-21
      • 2018-06-28
      相关资源
      最近更新 更多