2017-08-28 163 views
2

我想在Keras中创建一个图像去噪ConvNet,我想创建自己的丢失函数。我希望它将噪声图像作为输入,并将噪声作为输出。这种丢失功能与MSE丢失非常相似,但这会使我的网络学会去除干净的图像,而不是来自输入噪声图像的噪声。在Keras写一个自定义的MSE丢失函数

损失函数我想和y以实现嘈杂的图像,X干净的形象和R(Y)的预测图像:

The loss function I want to implement

我试着通过我自己,但我要使它不知道如何让损失访问我嘈杂的图像,因为它一直在变化。

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 

我能做些什么?

回答

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 

但你必须采取批量大小考虑,这变种是丧失功能外需要你适合刚刚一批每个时代

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,....) 
+0

谢谢您的回应!我同意你对丢失函数的说法,但是说如果我使用计算我的noisy_img和我的predict_img之间的差异的经典MSE,我的模型会尽量减少这种差异,所以会尝试去除噪音?因此,如果我希望我的模型从noisy_img中删除clean_img以获得模型输出处的噪声,那么我必须使用类似上面那样的损失函数? –

+0

不,您的模型会试图完全实现您将其作为'y_training',它是在损失函数内的'y_true'。所有你需要的就是给它**噪音**作为预期的结果,而不是给它一个干净的图像。 –

+0

在我的答案中查看更新。 –