MobileNetV2预训练模型变量缺失,求合适替代变量方案
嘿,我来帮你捋捋这个问题!你遇到的这些缺失变量全是MobileNetV2最后两个扩展卷积块(expanded_conv_15、expanded_conv_16)里的参数对吧?大概率是因为你手里的预训练模型是针对ImageNet分类任务训练的基础版MobileNetV2,而Faster R-CNN用到的MobileNetV2 backbone在基础版的基础上多了几个顶层卷积层,或者对结构做了微调,所以才会出现参数不匹配的情况。
至于处理方案,其实找“替代变量”不是最优解,更合理的是用下面两种方式应对:
直接随机初始化缺失参数:这是最常用也最稳妥的办法。毕竟这些是网络的顶层卷积层,在你的检测任务微调过程中,任务数据会快速把这些参数调整到适配检测任务的状态。你只需要在加载checkpoint的时候,指定只加载存在的变量,剩下的让TensorFlow自动随机初始化就行。给你个简单的代码示例:
# 获取模型中所有可训练变量 all_trainable_vars = tf.trainable_variables() # 筛选出checkpoint里存在的变量(排除缺失的那几个顶层块) vars_to_restore = [var for var in all_trainable_vars if 'MobilenetV2/expanded_conv_15' not in var.name and 'MobilenetV2/expanded_conv_16' not in var.name] # 加载预训练参数 saver = tf.train.Saver(var_list=vars_to_restore) saver.restore(sess, "你的预训练模型路径") # 剩下的缺失变量会自动完成随机初始化用相邻相似层的参数初始化:如果不想完全随机,你可以拿结构最接近的
expanded_conv_14层的对应参数来初始化缺失的变量。比如用MobilenetV2/expanded_conv_14/depthwise/biases的值来初始化expanded_conv_15/depthwise/biases,其他参数以此类推。这种方式能给顶层一个更合理的初始值,可能稍微加快一点微调的收敛速度,但说实话提升不会特别大——毕竟检测任务和分类任务需要的特征还是有差异的。
另外提一句:如果你是用TensorFlow Object Detection API搭建的模型,官方其实有完整的MobileNetV2 Faster R-CNN预训练检测模型,直接用那个微调就不会有参数缺失的问题了。不过既然你已经有自己的预训练模型,上面两种方法完全能解决你的问题。
内容的提问来源于stack exchange,提问作者batuman

