2017-08-31 40 views
1

我想在Keras中實現本文:https://arxiv.org/pdf/1603.09056.pdf使用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