May*_*tro 10 python tensorflow tensorboard tensorflow-slim
我仍然是新手,tensorflow我正在努力了解在我的模特训练继续进行时细节上发生了什么.简单地说,我使用的是slim预训练的模型ImageNet做finetuning我的数据集.以下是从张量板中提取的2个独立模型的一些图:
Model_1 (InceptionResnet_V2)
Run Code Online (Sandbox Code Playgroud)
Model_2 (InceptionV4)
Run Code Online (Sandbox Code Playgroud)
到目前为止,两种模型在验证集上的结果都很差(平均Az(ROC曲线下的面积)= 0.7,而Model_10.79为Model_2).我对这些图的解释是,重量不会随着小批量而变化.它只是改变迷你批次的偏见,这可能是问题所在.但我不知道在哪里验证这一点.这是我能想到的唯一解释,但考虑到我还是新手,这可能是错误的.你能和我分享一下你的想法吗?如有需要,请不要犹豫,要求更多地块.
编辑: 正如您在下面的图表中看到的那样,权重似乎随着时间的推移几乎没有变化.这适用于两个网络的所有其他权重.这让我认为某处存在问题,但不知道如何解释它.
InceptionV4 weights
Run Code Online (Sandbox Code Playgroud)
InceptionResnetV2 weights
Run Code Online (Sandbox Code Playgroud)
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)
我同意你的评估 - 小型车的重量没有太大变化.它看起来确实有所改变.
我相信你知道,你正在用非常大的模型进行微调.因此,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-4对1e-8运作良好.
| 归档时间: |
|
| 查看次数: |
994 次 |
| 最近记录: |