如何在Keras中实现自定义加权MSE损失功能?

时间:2019-11-02 14:29:23

标签: machine-learning keras deep-learning computer-vision autoencoder

我想将自定义MSE用于自动编码器。我有自动编码器的输入(X)和输出(Y)图像,它们实际上是同一幅图像。现在,在计算MSE的过程中,我们将计算真实输出(Y = X)和预测输出图像(Y')之间的MSE。

让我们说,对于每个图像X,我都有一个派生图像X',它是该图像的权重矩阵。 X'的大小与X或Y相同。它的值介于0到1之间。因此,在计算MSE时,我想使用X(也是Y和预期的重构输出),X'和预测的输出'。

如果有人可以建议我如何在Keras中使用它,我将非常感激。

1 个答案:

答案 0 :(得分:2)

您可以像这样制作损失层

class LossLayer(Layer):
    def __init__(self,  **kwargs):
        super(LossLayer, self).__init__(**kwargs)

    def build(self, input_shape):
        super(LossLayer, self).build(input_shape)  # Be sure to call this somewhere!

    def call(self, x):
        input_image, weighted_image, predicted = x
        loss = weightedmse(input_image, weighted_image, predicted)
        return loss

def dummy_loss(y_true, y_pred):
    return tf.sqrt(tf.reduce_sum(y_pred))

在构建模型时像这样使用它。

input_image = Input(...)
weighted_image = Input(...)
x = Conv2D(...)(input_image)
.
.
loss_layer = LossLayer()([input_image, weighted_image, x])  # x here is the last Conv layer

您的数据生成器必须在__getitem___中返回类似的内容

[input_img, weighted], np.zeros((batch_size, 1))

编辑

定义完上述张量后,创建2个这样的模型

train_model = Model([input_image, weighted_image], loss_layer)
pridict_model = Model([input_image, weighted_image], x)
train_model.compile(optimizer='sgd', loss=dummy_loss)