【问题标题】:Write a custom MSE loss function in Keras在 Keras 中编写自定义 MSE 损失函数
【发布时间】:2017-08-28 09:00:14
【问题描述】:

我正在尝试在 Keras 中创建图像去噪 ConvNet,并且我想创建自己的损失函数。我希望它将噪声图像作为输入并将噪声作为输出。这个损失函数很像 MSE 损失,但它会让我的网络学会从输入噪声图像中移除干净的图像而不是噪声。

我想用 y 噪声图像、x 干净图像和 R(y) 预测图像来实现的损失函数:

我尝试自己制作,但我不知道如何让丢失访问我的嘈杂图像,因为它一直在变化。

def residual_loss(noisy_img):
  def loss(y_true, y_pred):
    return np.mean(np.square(y_pred - (noisy_img - y_true), axis=-1)
return loss

基本上,我需要做的是这样的:

input_img = Input(shape=(None,None,3))

c1 = Convolution2D(64, (3, 3))(input_img)
a1 = Activation('relu')(c1)

c2 = Convolution2D(64, (3, 3))(a1)
a2 = Activation('relu')(c2)

c3 = Convolution2D(64, (3, 3))(a2)
a3 = Activation('relu')(c3)

c4 = Convolution2D(64, (3, 3))(a3)
a4 = Activation('relu')(c4)

c5 = Convolution2D(3, (3, 3))(a4)
out = Activation('relu')(c5)

model = Model(input_img, out)
model.compile(optimizer='adam', loss=residual_loss(input_img))

但是如果我尝试这个,我会得到:

 IndexError: tuple index out of range

我能做什么?

【问题讨论】:

    标签: python python-2.7 keras loss mse


    【解决方案1】:

    由于在损失函数中使用“输入”是很不寻常的(不是为了那个),我认为值得一说:

    分离噪声不是损失函数的作用。 损失函数只是衡量“你离正确有多远”的量度。

    将事物分开的是您的模型,您期望从模型中得到的结果是y_true

    您应该使用X_training = noisy imagesY_training = noises 的常规损失。


    也就是说……

    您可以在损失函数之外为noisy_img 创建一个张量并保存它。损失函数中的所有操作都必须是张量函数,因此请使用keras backend

    import keras.backend as K
    
    noisy_img = K.variable(X_training) #you must do this for each bach
    

    但您必须考虑批量大小,这个 var 在损失函数之外将需要您每个时期只适合一个批次

    def loss(y_true,y_pred):
        return K.mean(K.square(y_pred-y_true) - K.square(y_true-noisy_img))
    

    每个 epoch 训练一批:

    for batch in range(0,totalSamples,size):
        noisy_img = K.variable(X_training[batch:size])
        model.fit(X_training[batch:size],Y_training[batch:size], batch_size=size)
    

    如果只使用均方误差,请按如下方式组织数据:

    originalImages = loadYourImages() #without noises
    Y_training = createRandomNoises() #without images
    
    X_training = addNoiseToImages(originalImages,Y_training)
    

    现在您只需使用“mse”或任何其他内置损失。

    model.fit(X_training,Y_training,....)
    

    【讨论】:

    • 感谢您的回复!我同意你所说的关于损失函数的说法,但如果我使用经典的 MSE 来计算我的noisy_img 和我的predicted_img 之间的差异,我的模型将尝试最小化这种差异,所以会尝试消除噪音?因此,如果我希望我的模型从噪声img 中删除 clean_img 以便在模型的输出中获得噪声,我必须使用上面的损失函数?
    • 不,您的模型将尝试完全实现您给它的y_training,即损失函数中的y_true。您所需要的只是给它 noise 作为预期的结果,而不是给它一个干净的图像。
    猜你喜欢
    • 2018-02-24
    • 2019-06-25
    • 2021-09-21
    • 2020-06-27
    • 1970-01-01
    • 2020-12-19
    • 2017-12-18
    • 2020-03-27
    • 1970-01-01
    相关资源
    最近更新 更多