这是一个非常奇怪的错误,部分是对上一个问题(反卷积层 FCN 初始化 - 损失下降太快)的后续。
但是我初始化 Deconv 层(双线性或高斯),我得到了同样的情况:
1)权重已更新,我检查了多次迭代。反卷积/上采样层的大小是相同的:(2,2,8,8)
首先,net_mcn.layers[idx].blobs[0].diff
返回带有浮点数的矩阵,最后一个 Deconv 层 ( upscore5
) 产生两个具有相同数字但符号相反的数组,即权重应该在不同方向上以相同的速率移动,但结果权重实际上几乎相同!
相当令人惊讶的是,剩下的四个 deconv 层没有这个错误。因此,当我比较模型时,例如,foriter=5000
和iter=55000
deconv 层的权重是非常不同的。
更令人惊讶的是,其他层(卷积)的变化要小得多!
这是 init 的打印输出部分,用于确认 deconv 层已更新:
I0724 03:10:30.451787 32249 net.cpp:198] loss needs backward computation.
I0724 03:10:30.451792 32249 net.cpp:198] score_final needs backward computation.
I0724 03:10:30.451797 32249 net.cpp:198] upscore5 needs backward computation.
I0724 03:10:30.451802 32249 net.cpp:198] upscore4 needs backward computation.
I0724 03:10:30.451804 32249 net.cpp:198] upscore3 needs backward computation.
I0724 03:10:30.451807 32249 net.cpp:198] upscore2 needs backward computation.
I0724 03:10:30.451810 32249 net.cpp:198] upscore needs backward computation.
I0724 03:10:30.451814 32249 net.cpp:198] score_fr3 needs backward computation.
I0724 03:10:30.451818 32249 net.cpp:198] score_fr2 needs backward computation.
I0724 03:10:30.451822 32249 net.cpp:198] score_fr needs backward computation.
2) Blobs diffs 对于反卷积层都是零
几乎所有反卷积层的数据流(查找关于输入的 Caffe 卷积过滤器的梯度)的差异在算法的整个持续时间内都是零,除了少数例外(也接近 0,例如)。-2.28945263e-09
卷积层差异看起来不错。
我认为这是一个悖论 - deconv 层中的权重已更新,但与神经元的差异都是 0(常数?)
3) Deconv 特征快速增长
远大于 FCN 和 CRFasRNN,高达 5.4e+03,同时附近的像素对于同一类可能具有非常不同的值(例如 5e+02 和 -300)。
4)训练和验证错误下降,通常很快
正如我在提到的问题中指出的那样。
所以把它们放在一起——我不明白该怎么做。如果是过拟合,那为什么验证错误也会减少呢?
网络的架构是
fc7->relu1->dropout->conv2048->conv1024->conv512->deconv1->deconv2->deconv3->deconv4->deconv5->crop->softmax_with_loss
编辑:我错了,并非所有 net.blobs[...].diffs 中的所有条目都是 0,但主要是随着层变大。这取决于数据大小。