解释张量板图

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

我仍然是tensorflow的新手,我正在努力了解在我的模特训练继续进行时细节上发生了什么。简而言之,我正在使用slim预训练的ImageNet模型在我的数据集上做finetuning。以下是从张量板中提取的2个独立模型的一些图:

Model_1 (InceptionResnet_V2)

Inception resnet V2

Model_2 (InceptionV4)

InceptionV4

到目前为止,两种模型在验证集上的结果都很差(平均Az(ROC曲线下面积)= Model_1为0.7,Model_2为0.79)。我对这些图的解释是,重量不会随着小批量而变化。它只是改变迷你批次的偏见,这可能是问题所在。但我不知道在哪里验证这一点。这是我能想到的唯一解释,但考虑到我还是新手,这可能是错误的。你能和我分享一下你的想法吗?如有需要,请不要犹豫,要求更多地块。

编辑:正如您在下面的图表中看到的那样,权重似乎随着时间的推移几乎没有变化。这适用于两个网络的所有其他权重。这让我认为某处存在问题,但不知道如何解释它。

InceptionV4 weights

InceptionV4 weights

InceptionResnetV2 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 %

超行的价值观:

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) 

enter image description here

sparsity (InceptionV4)

enter image description here

EDITED3:以下是两种型号的损失情节:

Losses and regularization loss (InceptionResnet_V2) 

enter image description here

Losses and regularization loss (InceptionV4) 

enter image description here

python tensorflow tensorboard tensorflow-slim
1个回答
6
投票

我同意你的评估 - 小型车的重量没有太大变化。它看起来确实有所改变。

我相信你知道,你正在用非常大的模型进行微调。因此,backprop有时需要一段时间。但是,你正在进行许多训练迭代。我真的不认为这是问题所在。

如果我没弄错的话,这两个都是最初在ImageNet上训练过的。如果您的图像与ImageNet中的图像完全不同,则可以解释该问题。

backprop equations确实使偏差更容易在某些激活范围内变化。如果模型是高度稀疏的,则ReLU可以是一个(即,如果许多层具有0的激活值,则权重将难以调整但是偏差将不会)。此外,如果激活在[0, 1]范围内,则相对于权重的梯度将高于相对于偏差的梯度。 (这就是为什么sigmoid是一个糟糕的激活函数)。

它也可能与您的读出层有关 - 特别是激活功能。你是如何计算错误的?这是分类还是回归问题?如果可能的话,我建议使用除sigmoid之外的其他东西作为最终的激活功能。 tanh可能稍微好一些。线性读数有时也会加速训练(所有渐变都必须“通过”读出层。如果读出层的导数总是1 - 线性 - 你“让更多的渐变通过”来进一步调整权重该模型)。

最后,我注意到你的权重直方图正在推向负权重。有时,特别是对于具有大量ReLU激活的模型,这可以作为模型学习稀疏性的指标。或死亡神经元问题的指标。或两者兼而有之 - 两者有些联系。

最终,我认为你的模型只是在努力学习。我遇到了非常类似的直方图重新训练开始。我正在使用大约2000个图像的数据集,而我正在努力将其推高80%以上(因为发生这种情况,数据集严重偏差 - 准确性大致与随机猜测一样好)。当我使卷积变量保持不变并且仅对完全连接的层进行更改时,它有所帮助。


实际上这是一个分类问题,而S形交叉熵是适当的激活函数。而且你确实有一个相当大的数据集 - 当然大到足以微调这些模型。

有了这些新信息,我建议降低初始学习率。我有一个双重推理:

(1)是我自己的经历。正如我所提到的,我对RMSprop并不是特别熟悉。我只在DNC的背景下使用它(尽管,带有卷积控制器的DNC),但我在那里的经验支持了我将要说的内容。我认为.01从头开始训练模型很高,更不用说微调了。这对亚当来说肯定很高。从某种意义上说,从较小的学习率开始是微调的“精细”部分。不要强迫重物移动太多。特别是如果你要调整整个模型而不是最后(几个)层。

(2)增加的稀疏性和向负权重的转变。根据你的稀疏图(好主意btw),它看起来像一些权重可能会因为过度修正而陷入稀疏配置。即,由于高初始速率,权重“超过”它们的最佳位置并且卡在某处使得它们难以恢复并且对模型做出贡献。也就是说,在ReLU网络中略微为负且接近于零并不好。

正如我已经提到过的(反复),我对RMSprop并不是很熟悉。但是,由于您已经进行了大量的训练迭代,因此可以提供低,低,低初始速率并逐步提升。我的意思是,看看1e-8是如何工作的。模型可能不会以低的速率响应训练,而是使用学习速率进行非正式的超参数搜索。根据我使用亚当的初始经验,1e-41e-8运作良好。

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