2

我正在尝试在 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

我能做些什么 ?

4

1 回答 1

4

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

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

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

您应该使用常规损失,与X_training = noisy imagesY_training = noises


那就是说...

您可以在损失函数之外创建一个张量并将noisy_img其存储起来。损失函数中的所有操作都必须是张量函数,因此请使用keras 后端

import keras.backend as K

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

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

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

每个时期训练一批:

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,....)
于 2017-08-28T14:23:17.870 回答