解释张量板图

May*_*tro 10 python tensorflow tensorboard tensorflow-slim

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

Model_1 (InceptionResnet_V2)
Run Code Online (Sandbox Code Playgroud)

初始resnet V2

Model_2 (InceptionV4)
Run Code Online (Sandbox Code Playgroud)

InceptionV4

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

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

InceptionV4 weights
Run Code Online (Sandbox Code Playgroud)

InceptionV4重量

InceptionResnetV2 weights
Run Code Online (Sandbox Code Playgroud)

InceptionResnetV2权重

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 %
Run Code Online (Sandbox Code Playgroud)

超行的价值观:

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
Run Code Online (Sandbox Code Playgroud)

关于层的稀疏性,以下是两个网络层的稀疏性的一些样本:

sparsity (InceptionResnet_V2) 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

sparsity (InceptionV4)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

Losses and regularization loss (InceptionResnet_V2) 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Losses and regularization loss (InceptionV4) 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Dyl*_*n F 6

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

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

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

backprop方程做更容易偏向于某些激活范围发生变化.如果模型是高度稀疏的,则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运作良好.