与keras怪异的培训问题 - 亏损突然大幅下降,在FC层零

问题描述 投票:3回答:1

我越来越具备培养连体式CNN与Keras(张量流量的,Ubuntu 14.04,Cuda的8的后端,与cudnn)这个奇怪的问题。总之,CNN具有共享组权重,取入两个图像,合并各自的FC层,然后估计消退。我使用的是亚当优化器(使用默认参数)MSE损失。我与不同类型的问题,做了几次,还从来没见过以下。

从本质上讲是第一时期会发生什么,一切似乎都训练精细,损失正在下降缓慢,如预期(在3.3〜MSE的使用的32批次大小左右结束)。该回归估计9维连续值向量。

然后,一旦第二时期开始时,损失急剧下降(至〜4E-07)。你会想:“哦耶损失是非常小的 - 我赢了”,但是当我检查通过新颖的输入预测的训练的权重(我使用的checkpointer根据损失倾倒了权重的最佳集) ,我得到奇怪的行为。不管是什么输入是(不同的图像,随机噪声作为输入,甚至是零),我总是得到完全相同的输出。进一步的检查显示,在共享权重最后FC层是全零。

如果我看的权重第一的时代后,当一切似乎“正常”,这不会发生 - 我只是没有得到最佳的结果(是有道理的 - 发生仅一个时期)。这仅与第二时期和情况。

有没有人见过这个?有任何想法吗?你认为这是我的一个愚蠢的错误,或者一些奇怪的错误?

在我的网络拓扑结构的更多细节在这里。以下是共享权:

shared_model = Sequential()

shared_model.add(Convolution2D(nb_filter=96, nb_row=9, nb_col=9, activation='relu', subsample=(2,2), input_shape=(3,height,width)))
shared_model.add(MaxPooling2D(pool_size=(2,2)))
shared_model.add(Convolution2D(nb_filter=256, nb_row=3, nb_col=3, activation='relu', subsample=(2,2)))
shared_model.add(MaxPooling2D(pool_size=(2,2)))
shared_model.add(Convolution2D(nb_filter=256, nb_row=3, nb_col=3, activation='relu'))
shared_model.add(MaxPooling2D(pool_size=(2,2)))
shared_model.add(Convolution2D(nb_filter=512, nb_row=3, nb_col=3, activation='relu', subsample=(1,1)))

shared_model.add(Flatten())

shared_model.add(Dense(2048, activation='relu'))
shared_model.add(Dropout(0.5))

然后,我将它们合并为回归如下:

input_1 = Input(shape=(3,height,width))
input_2 = Input(shape=(3,height,width))
encoded_1 = shared_model(input_1)
encoded_2 = shared_model(input_2)
encoded_merged = merge([encoded_1, encoded_2], mode='concat', concat_axis=-1)
fc_H = Dense(9, activation='linear')
h_loss = fc_H(encoded_merged)
model = Model(input=[input_1, input_2], output=h_loss)

最后,在约1,000,000样本每个时代的列车,所以应该有充足的数据来训练的。我只是从来没有见过一个FC层被置为全零。即使在那,我不明白怎么做了一个非常低的损耗当训练数据并不都是零。

keras
1个回答
0
投票

对于那些看似过得去的最后一层到底发生了什么预言零是垂死RELU问题。尝试LeakyReLU,调整透明度。这消除那些我会在第一时间拿到划时代本身零为我工作。

© www.soinside.com 2019 - 2024. All rights reserved.