【问题标题】:how to customize a loss function with an extra variable in keras如何在 keras 中使用额外的变量自定义损失函数
【发布时间】:2023-03-07 07:01:02
【问题描述】:

我想训练一个具有自定义损失函数的模型。损失包括两部分。 Part1 和 part2 可以用 y_true(标签)和 y_predicted(实际输出)计算。 但是,loss = part1 +lambda part2

lambda 是一个变量,应该能够与网络模型的参数一起调整。在张量流中,似乎可以将 lambda 定义为 tf.Variable 以进行更新。但是,我怎样才能在 Keras 中做到这一点?

【问题讨论】:

    标签: tensorflow keras deep-learning loss-function


    【解决方案1】:

    好的,我想出了一个解决方案。这很丑陋,但它是一个解决方案:

    class UtilityLayer(Layer):
    
        def build(self, input_shape):
            self.kernel = self.add_weight(
                name='kernel',
                shape=(1,),
                initializer='ones',
                trainable=True,
                constraint='nonneg'
            )
            super().build(input_shape)
    
        def call(self, inputs, **kwargs):
            return self.kernel
    
    
    switch = -1
    last_loss = 0
    
    def custom_loss_builder(utility_layer):
        def custom_loss(y_true, y_pred):
            global switch, last_loss
            switch *= -1
    
            if switch == 1:
                last_loss = utility_layer.trainable_weights[0] * MSE(y_true, y_pred) 
                return last_loss # your network loss
            else:
                return last_loss # your lambda loss
    
        return custom_loss
    
    
    dummy_y = np.empty(len(x))
    
    inputs = Input(shape=(1,))
    x = Dense(2, activation='relu')(inputs)
    outputs = Dense(1)(x)
    utility_outputs = UtilityLayer()(inputs)
    
    model = Model(inputs, [outputs, utility_outputs])
    model.compile(optimizer='adam', loss=custom_loss_builder(model.layers[-1]))
    model.fit(x, [y, dummy_y], epochs=100)
    

    还有你的 lambda 的演变:

    【讨论】:

    • 嗨,托马斯,我有一个问题。在这种情况下,我们将模型的输出从 y 更改为 [y, dumy_y]。那么,y_true 和 y_pred 是否也发生了变化?所以我们需要指定 y_true = y_true[0] 和 y_pred = y_pred[0]?
    • 你好,在这种情况下,你的model.predict(x_test) = [y_pred, y_dummy],所以你想访问model.predict(x_test)[0]。我不确定你的y_true 是什么,如果它是你原来的y_train,你不需要访问第一个元素,但你也可以定义y_true = [y_train, y_dummy],这取决于你。
    猜你喜欢
    • 2021-01-21
    • 2021-02-08
    • 1970-01-01
    • 2020-11-26
    • 2020-12-19
    • 2017-12-18
    • 2020-03-27
    • 1970-01-01
    • 2020-05-30
    相关资源
    最近更新 更多