【问题标题】:Loss not evolving when using skip connections使用跳跃连​​接时损失没有变化
【发布时间】:2018-02-09 02:20:54
【问题描述】:

我正在尝试在 Keras 中实现这篇论文:https://arxiv.org/pdf/1603.09056.pdf,它使用带有跳过连接的 Conv-Deconv 来创建图像去噪网络。如果我在相应的 Conv-Deconv 层之间建立对称的跳过连接,我的网络工作得很好,但是如果我在输入和输出之间添加一个连接(如论文中所示),我的网络就无法训练。是我看不懂论文吗?

“但是,我们的网络从输入中学习附加损坏,因为在网络的输入和输出之间存在跳跃连接”

这是论文中描述的网络:

这是我的网络:

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

我的网络有什么问题?

【问题讨论】:

  • 但是你的损失很低。为什么说它不学习?
  • 因为损失没有进化?不应该逐步最小化吗?

标签: python-2.7 keras convolution loss deep-residual-networks


【解决方案1】:

激活'relu'从不返回负值

由于您将输入添加到输出 (a14) 并且您需要“去噪”(去除 噪音),因此当然可以预期输出 (a14) 包含两者正负值。 (您想使亮点变暗并减轻暗点)。

因此,a14 中的激活不能是'relu'。它必须是正面和负面的,并且能够达到噪音的范围。可能是'tanh' 或自定义激活。如果您的输入从 0 变为 1,'tanh' 可能是最佳选择。

(不确定前面的层,也许其中一些使用'tanh' 会使过程更容易)


有时那些长的卷积网络确实会卡住,我在这里训练一个 U-net,需要一段时间才能使其收敛。当它被卡住时,有时最好重新构建模型(新的权重初始化)并重试。

在此处查看详细信息:How to build a multi-class convolutional neural network with Keras

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    相关资源
    最近更新 更多