【问题标题】:NASNet-A fine tuning poor validation accuracyNASNet-A 微调验证精度差
【发布时间】:2018-07-01 07:14:19
【问题描述】:

我有一个包含大约 34000 张图像的数据集,分为两组:训练(30000 张图像)和验证(4000 张图像)组。每张图像是从视频中拍摄的两张图像之间差异的结果(每对图像之间的时间偏移量约为 1 秒)。视频具有静态背景,因此差异图像包含太多黑色,只有一两个带颜色的小区域。每个差异图像都有一个标签(有一个动作或没有.. 1 或 0),所以这是一种二进制分类。简而言之,我使用在ImageNet 上预训练的slim 模型对我的数据集进行微调。我已经使用 5 个不同的网络启动了 5 个单独的训练:InceptionV4, InceptionResnetV2, Resnet152, NASNet-mobile, NASNet。我使用前 4 个网络 InceptionV4, InceptionResnetV2, Resnet152, NASNet-mobile 获得了非常好的结果,但使用 NASNet 的情况并非如此。问题是验证集上的Area Under the ROC curve 总是 = 0.5,并且验证图像的 logits 大致具有相同的值,这真的很奇怪。事实上,我在前 10000 个 mini-batch 上使用 NASNet-mobile 得到了这种结果,但之后模型确实收敛了。以下是我的脚本中的超参数值:

batch_size=10
weight_decay = 0.00004 
optimizer = rmsprop
rmsprop_momentum = 0.9 
rmsprop_decay = 0.9 

learning_rate_decay_type =  exponential 
learning_rate =  0.01 
learning_rate_decay_factor = 0.94 
num_epochs_per_decay = 2.0 #'Number of epochs after which learning rate

我还是 tensorflow 的新手,我在其他任何地方都没有找到任何相关的东西。这是一个非常奇怪的行为,因为我使用相同的参数和相同的输入,但使用 NASNet 似乎在某处存在问题。我不仅在寻找解决方案(如果可能的话,因为我知道在没有太多关于模型的细节的情况下很难解决这些问题),而且关于在哪里寻找以及如何解决问题的见解会很棒。以前有人在微调 NASNet 时遇到过这个问题吗?例如,模型没有收敛?最后,我知道很难就这些问题获得答案,但我希望至少能获得一些见解,以便我可以继续我的调查。

编辑: 以下是交叉熵和正则化损失的图:

编辑: 正如答案中所建议的,我确实将 drop_path_keep_prob 参数设置为 1,现在模型收敛了,我在验证集上获得了很好的准确性。但现在的问题是:这个参数是什么意思?它是我们应该适应数据集的参数之一(如学习率等)吗?

【问题讨论】:

    标签: python tensorflow machine-learning deep-learning conv-neural-network


    【解决方案1】:

    您可以做的最简单的健全性检查是在单个小批量上运行微调。如果没有任何大问题,任何深度网络都应该能够过拟合。如果您发现它不能这样做,那么定义或您使用定义的方式一定有问题。

    在您的情况下,我唯一的猜测是它可能与 drop_path 实现有关。它在移动版本中被禁用,但在大型模型训练期间启用。它可能会使模型变得足够不稳定以至于无法进行微调,因此可能值得尝试在禁用它的情况下进行训练。

    【讨论】:

    • 我添加了损失图和正则化图,以便您可以更多地看到正在发生的事情。 drop_path 有什么作用?我应该设置为 1 来禁用它吗?
    • 感谢@Gavin Gray。我确实将 drop_path_keep_prob 设置为 1 并启动了培训。这次我在验证集上得到了非常好的准确性,就像其他网络一样。但现在的问题是:这个参数是什么意思?在接受您的回答之前,我要求您进一步澄清。
    • NASNet 中使用的单元有多个分支,这些分支被求和然后连接在一起(参见the NASNet paper 中的图 4)。 drop_path 是在训练期间保持其中任何一条路径的概率;否则它只会被设置为零。启用此功能后,本文中的网络实际上不会从随机初始化中收敛,他们在训练期间将其从 1.0 线性调度到 0.7。
    • 我不确定我明白了。 drop_path =1.0 意味着网络将在训练期间保留所有这些路径?你的意思是启用 1 或 0?
    • 是的,1.0 表示保留路径。在original config 中,它被称为drop_path_keep_prob,这有点不那么令人困惑,但仍然不是一个好名字。
    猜你喜欢
    • 2020-07-08
    • 2018-01-06
    • 2021-09-26
    • 2017-10-13
    • 1970-01-01
    • 2019-02-16
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多