2017-08-28 9 views
2

私はKerasでConvNetをノイズ除去するイメージを作成しようとしています。私自身の損失関数を作成したいと思います。私はそれが入力として騒々しいイメージを取り、出力としてノイズを得ることを望みます。この損失関数はMSEの損失によく似ていますが、私のネットワークは入力ノイズの多い画像から雑音ではなくクリーンな画像を除去することを学びます。私は自分自身が、私でそれを作るしようとしたKerasでカスタムMSE損失関数を書く

The loss function I want to implement

私はYでノイズの多い画像を実装する損失関数は、クリーンなイメージとR(y)の予測画像をxはすべての時間が変わるので、私の騒々しいイメージへの損失アクセスをどのようにするかわからない。

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 

しかし、あなたのアカウントにバッチサイズを取る必要があり、損失関数外にあるこのvarがちょうど1バッチに合わせて、あなたが必要になります1エポックあたり。エポックあたり

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

トレーニング1回分:

originalImages = loadYourImages() #without noises 
Y_training = createRandomNoises() #without images 

X_training = addNoiseToImages(originalImages,Y_training) 

今、あなただけの使用:ちょうど平均がエラー二乗、このようなあなたのデータを整理使用するための

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) 

「mse」、またはその他のビルトイン・ロスが含まれます。

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

ありがとうございました!私は損失関数についてあなたが言ったことに同意しますが、私のnoisy_imgと私のpredict_imgの違いを計算する古典的なMSEを使用している場合、私のモデルはこの違いを最小限に抑えようとします。ノイズを除去するには?したがって、私のモデルの出力でノイズを得るために私のモデルでnoisy_imgからclean_imgを削除したい場合は、上記のような損失関数を使用する必要がありますか? –

+0

いいえ、あなたのモデルは、あなたが 'y_training'として与えるものを正確に達成しようとします。これは、損失関数の中で' y_true'です。あなたが必要とするのは、それにきれいな画像を与えるのではなく、**ノイズ**を期待した結果として与えることだけです。 –

+0

私の答えの更新を見てください。 –

関連する問題