我仍然是tensorflow
中的新手,而我正试图了解我的模特'继续训练。简而言之,我使用slim
上预训练的ImageNet
模型在我的数据集上执行finetuning
。以下是从张量板中提取的2个独立模型的一些图:
Model_1 (InceptionResnet_V2)
Model_2 (InceptionV4)
到目前为止,两个模型在验证集上的结果都很差(平均Az(ROC曲线下的面积)= Model_1
为0.7,Model_2
为0.79)。我对这些图的解释是,重量不会随着小批量而变化。它只是改变迷你批次的偏见,这可能是问题所在。但我不知道在哪里要验证这一点。这是我能想到的唯一解释,但考虑到我还是新手,这可能是错误的。你能和我分享一下你的想法吗?如果需要,请不要犹豫要求更多的情节。
修改 正如您在下面的图表中看到的那样,重量似乎随着时间的推移几乎没有变化。这适用于两个网络的所有其他权重。这让我觉得某个地方存在问题,但不知道如何解释它。
InceptionV4 weights
InceptionResnetV2 weights
EDIT2: 这些模型首先在ImageNet上进行了训练,这些图是在我的数据集上微调它们的结果。我使用了19个类的数据集,其中包含大约800000个图像。我正在进行多标签分类问题,并且我使用sigmoid_crossentropy作为丢失函数。这些课程非常不平衡。在下表中,我们将显示2个子集中每个类的存在百分比(训练,验证):
Objects train validation
obj_1 3.9832 % 0.0000 %
obj_2 70.6678 % 33.3253 %
obj_3 89.9084 % 98.5371 %
obj_4 85.6781 % 81.4631 %
obj_5 92.7638 % 71.4327 %
obj_6 99.9690 % 100.0000 %
obj_7 90.5899 % 96.1605 %
obj_8 77.1223 % 91.8368 %
obj_9 94.6200 % 98.8323 %
obj_10 88.2051 % 95.0989 %
obj_11 3.8838 % 9.3670 %
obj_12 50.0131 % 24.8709 %
obj_13 0.0056 % 0.0000 %
obj_14 0.3237 % 0.0000 %
obj_15 61.3438 % 94.1573 %
obj_16 93.8729 % 98.1648 %
obj_17 93.8731 % 97.5094 %
obj_18 59.2404 % 70.1059 %
obj_19 8.5414 % 26.8762 %
hyperparams的值:
batch_size=32
weight_decay = 0.00004 #'The weight decay on the model weights.'
optimizer = rmsprop
rmsprop_momentum = 0.9
rmsprop_decay = 0.9 #'Decay term for RMSProp.'
learning_rate_decay_type = exponential #Specifies how the learning rate is decayed
learning_rate = 0.01 #Initial learning rate.
learning_rate_decay_factor = 0.94 #Learning rate decay factor
num_epochs_per_decay = 2.0 #'Number of epochs after which learning rate
关于层的稀疏性,以下是两个网络层的稀疏性的一些样本:
sparsity (InceptionResnet_V2)
sparsity (InceptionV4)
EDITED3: 以下是两种模型的损失图:
Losses and regularization loss (InceptionResnet_V2)
Losses and regularization loss (InceptionV4)
答案 0 :(得分:6)
我同意你的评估 - 小型电车的重量变化不大。看起来他们正在改变有些。
我相信你知道,你正在用非常大的模型进行微调。因此,backprop有时需要一段时间。但是,你正在进行许多训练迭代。我真的不认为这是问题所在。
如果我没弄错的话,这两个人最初都是在ImageNet上训练的。如果您的图像与ImageNet中的图像完全不同,则可以解释问题。
backprop equations确实可以让偏差更容易在某些激活范围内发生变化。如果模型是高度稀疏的,则ReLU可以是一个(即,如果许多层具有0的激活值,则权重将难以调整但是偏差将不会)。此外,如果激活在[0, 1]
范围内,则相对于权重的梯度将高于相对于偏差的梯度。 (这就是为什么sigmoid是一个糟糕的激活函数)。
它也可能与您的读出层有关 - 特别是激活功能。你是如何计算错误的?这是分类还是回归问题?如果可能的话,我建议使用除sigmoid之外的其他东西作为最终的激活功能。 tanh 可能略微好一点。线性读数有时也会加速训练(所有渐变都必须“通过”读出层。如果读出层的导数总是1 - 线性 - 你“让更多的渐变通过”来进一步调整权重模特)。
最后,我注意到你的权重直方图正在推向负权重。有时,特别是对于具有大量ReLU激活的模型,这可以作为模型学习稀疏性的指标。或死亡神经元问题的指标。或两者兼而有之 - 两者有些联系。
最终,我认为你的模型只是在努力学习。我遇到了非常类似的直方图重新训练开始。我正在使用大约2000个图像的数据集,而我正在努力将其推高80%以上(因为发生这种情况,数据集严重偏差 - 准确性大致与随机猜测一样好)。当我使卷积变量保持不变并且仅对完全连接的层进行更改时,它有所帮助。
实际上这是一个分类问题,而S形交叉熵是适当的激活函数。而且你确实有一个相当大的数据集 - 当然大到足以微调这些模型。
有了这些新信息,我会建议降低初始学习率。我有一个双重推理:
(1)是我自己的经历。正如我所提到的,我对RMSprop并不是特别熟悉。我只在DNC的背景下使用它(尽管,带有卷积控制器的DNC),但我在那里的经验支持了我将要说的内容。我认为.01
对于从头开始训练模型很重要,更不用说微调了。这对亚当来说肯定很高。从某种意义上说,从较小的学习率开始是微调的“精细”部分。不要强迫重物移动太多。特别是如果你要调整整个模型而不是最后(几个)层。
(2)是增加的稀疏性和向负权重的转变。基于你的稀疏图(好主意顺便说一句),它看起来像一些权重可能因为过度修正而陷入稀疏配置。即,由于高初始速率,权重“超过”它们的最佳位置并且卡在某处使得它们难以恢复并且对模型做出贡献。也就是说,在ReLU网络中,略微为负且接近于零是不好的。
正如我已经提到过的(反复),我对RMSprop并不是很熟悉。但是,由于您已经进行了大量的训练迭代,因此请提供低,低,低初始速率,然后逐步提升。我的意思是,看看1e-8
的工作原理。模型可能不会以低的速率响应训练,而是使用学习速率进行非正式的超参数搜索。根据我使用Adam进行Inception的经验,1e-4
到1e-8
效果很好。