2017-08-31 3 views
1

私はKera:https://arxiv.org/pdf/1603.09056.pdfにこのペーパーを実装しようとしていますが、Skip接続でConv-Deconvを使用して画像ノイズ除去ネットワークを作成しています。私のネットワークは、対応するConv-Deconvレイヤー間の対称スキップ接続を作成するとかなりうまく動作しますが、入力と出力の間に(紙のように)接続を追加すると、ネットワークは訓練することができません。紙を理解していないのは私ですか? 「入力とネットワークの出力との間にスキップ接続があるので、しかし、私たちのネットワークは、入力から添加物の破損のための学習」スキップ接続を使用すると損失が進まない

ここでは、紙に記載されているネットワークです。

enter image description here

そして、ここに私のネットワークです:

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

############################ 
####### CONVOLUTIONS ####### 
############################ 

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(64, (3, 3))(a4) 
a5 = Activation('relu')(c5) 

############################ 
###### DECONVOLUTIONS ###### 
############################ 

d1 = Conv2DTranspose(64, (3, 3))(a5) 
a6 = Activation('relu')(d1) 

m1 = add([a4, a6]) 
a7 = Activation('relu')(m1) 

d2 = Conv2DTranspose(64, (3, 3))(a7) 
a8 = Activation('relu')(d2) 

m2 = add([a3, a8]) 
a9 = Activation('relu')(m2) 

d3 = Conv2DTranspose(64, (3, 3))(a9) 
a10 = Activation('relu')(d3) 

m3 = add([a2, a10]) 
a11 = Activation('relu')(m3) 

d4 = Conv2DTranspose(64, (3, 3))(a11) 
a12 = Activation('relu')(d4) 

m4 = add([a1, a12]) 
a13 = Activation('relu')(m4) 

d5 = Conv2DTranspose(3, (3, 3))(a13) 
a14 = Activation('relu')(d5) 

m5 = add([input_img, a14]) # Everything goes well without this line 
out = Activation('relu')(m5) 

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

私はそれを訓練する場合は、ここで私が得るものです:

Epoch 1/10 
31250/31257 [============================>.] - ETA: 0s - loss: 0.0015 
Current PSNR: 28.1152534485 

31257/31257 [==============================] - 89s - loss: 0.0015 - val_loss: 0.0015 
Epoch 2/10 
31250/31257 [============================>.] - ETA: 0s - loss: 0.0015 
Current PSNR: 28.1152534485 

31257/31257 [==============================] - 89s - loss: 0.0015 - val_loss: 0.0015 
Epoch 3/10 
31250/31257 [============================>.] - ETA: 0s - loss: 0.0015 
Current PSNR: 28.1152534485 

31257/31257 [==============================] - 89s - loss: 0.0015 - val_loss: 0.0015 
Epoch 4/10 
31250/31257 [============================>.] - ETA: 0s - loss: 0.0015 
Current PSNR: 28.1152534485 

31257/31257 [==============================] - 89s - loss: 0.0015 - val_loss: 0.0015 
Epoch 5/10 
31250/31257 [============================>.] - ETA: 0s - loss: 0.0015 
Current PSNR: 28.1152534485 

自分のネットワークが間違っていますか?

+0

しかし、あなたの損失はかなり低いです。なぜあなたはそれが学習ではないと主張していますか? –

+0

損失が進化しないので?それは漸進的に最小化されるべきではないか? –

答えて

0

有効化'relu'は、負の値を返しません。

ノイズを除去)あなたは(a14)入力を出力に追加している、あなたは、「ノイズ除去」する必要があるため、確かに出力(a14)は両方正と負のの値が含まれていることを期待されます。 (あなたは光点を暗くし、暗い点を明るくしたい)。

a14でのアクティブ化は、'relu'にできません。それは正と負の両方のものでなければならず、騒音の範囲に達することができなければならない。おそらく'tanh'またはカスタムアクティベーション。入力が0から1になる場合は、おそらく'tanh'が最適なオプションになります。

は(前の層わからない、おそらく'tanh'を使用してそれらのいくつかは、プロセスが容易になるだろう)


時にはそれらの長い畳み込みネットワークは動けなくない、私はここでU-ネットを訓練していますそれを収束させるにはしばらく時間がかかりました。立ち往生した時には、モデルをもう一度(新しい体重の初期化)してからやり直す方が良い場合もあります。

詳細を参照してください:How to build a multi-class convolutional neural network with Keras

関連する問題