2017-08-28 165 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

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