我有一个包含大约34000张图片的数据集,分为两个集合:训练集(30000张图片)和验证集(4000张图片)。每张图片是视频中两张图片相减的结果(每对图片之间的时间偏移约为1秒)。视频背景是静态的,因此差分图片中包含了太多的黑色,只有少数一个或两个小的彩色区域。每张差分图片都有一个标签(是否发生了动作,用1或0表示),因此这是一种二分类问题。简而言之,我使用在ImageNet
上预训练的slim
模型来对我的数据集进行微调。我启动了5次独立的训练,使用了5种不同的网络:InceptionV4, InceptionResnetV2, Resnet152, NASNet-mobile, NASNet
。使用前4个网络InceptionV4, InceptionResnetV2, Resnet152, NASNet-mobile
取得了非常好的结果,但使用NASNet
却不是这样。问题是验证集上的ROC曲线下面积
总是等于0.5,并且验证图片的logits大致具有相同的值,这真是奇怪。实际上,使用NASNet-mobile
时,我在前10000个小批量中得到了这种结果,但之后模型确实收敛了。以下是我脚本中超参数的值:
batch_size=10weight_decay = 0.00004 optimizer = rmsproprmsprop_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,现在模型已经收敛,并且我在验证集上获得了良好的精度。但现在的问题是:这个参数是什么意思?它是我们应该根据数据集调整的参数之一(如学习率等)吗?
回答:
你可以做的最简单的健全性检查是针对单个小批量运行微调。任何深度网络都应该能够过拟合到这一点,如果没有大的问题。如果你发现它做不到,那么定义或你使用定义的方式一定有问题。
在你的情况下,我唯一的猜测是可能与drop_path
的实现有关。在移动版本中它是被禁用的,但在训练大型模型时是启用的。它可能会使模型不稳定到无法微调的程度,因此值得尝试在禁用它的情况下进行训练。