我正试图使用Faster-RCNN架构(Faster R-CNN ResNet50 V1 640x640
)加载检查点并填充模型权重,从这里开始。我试图加载这个网络的权重,类似于它是如何在视网膜网络的示例笔记本中完成的,在那里他们做以下事情:
fake_box_predictor = tf.compat.v2.train.Checkpoint(
_base_tower_layers_for_heads=detection_model._box_predictor._base_tower_layers_for_heads,
_box_prediction_head=detection_model._box_predictor._box_prediction_head,
)
fake_model = tf.compat.v2.train.Checkpoint(
_feature_extractor=detection_model._feature_extractor,
_box_predictor=fake_box_predictor
)
ckpt = tf.compat.v2.train.Checkpoint(model=fake_model)
ckpt.restore(checkpoint_path).expect_partial()
我试图得到一个类似的检查点加载机制去更快的rcnn网络,我想使用,但属性像_base_tower_layers_for_heads
,_box_prediction_head
只存在于示例中使用的架构,而不是其他任何东西。
对于我的特定用例,我也找不到关于使用Checkpoint
填充模型的哪些部分的文档。将非常感谢任何帮助如何处理这一点!
就像你说的,你的主要问题是你没有一个层张量到你想要在其上进行迁移学习的层。这是动物园中更快R-CNN ResNet50 V1 640x640副本的原始实现的一部分。他们没有给这些层命名,或者他们给它命名了,但没有公布它们的名字(或代码)。为了解决这个问题,你需要找出你想要保留的层和你想要重新学习的层。你可以使用(ref):
打印出网络中的所有层[n.name for n in tf.get_default_graph().as_graph_def().node]
可以手动添加图层名称,但保留每个节点的默认名称。这个列表可能很长很累,但是你需要找到这个张量来开始你的迁移学习。因此,你需要遵循这个列表,并试图理解你想要冻结哪些层次,以及你想要继续学习过程。冻结一层(ref):
if layer.name == 'layer_name':
layer.trainable = False