使用相同的预训练模型初始化同一Slim ResNet-v1-101的两个副本

时间:2019-04-14 20:15:26

标签: tensorflow tf-slim

我正在尝试使用TF Slim ResNet-v1-101预训练模型来初始化模型的两个输入分支,并使用不同的输入(分别为RGB features[0]和深度图features[1])进一步合并它们,并将它们的联合结果馈送到一些空间卷积层。为了实现这一点,我为每个分支创建了单独的作用域,并使用预训练的检查点初始化了模型,但不包括最后一个完全连接的层(此处称为logits):

with tf.variable_scope("rgb_branch"):
    with tf.contrib.slim.arg_scope(resnet_v1.resnet_arg_scope()):
        rgb_logits, end_points = resnet_v1.resnet_v1_101(features[0], self.num_classes, is_training=is_training)        
        rgb_variables_to_restore = tf.contrib.slim.get_variables_to_restore(exclude=['rgb_branch/resnet_v1_101/logits'])

        # strip scope name
        rgb_assignment_map = { rgb_variables_to_restore[0].name.split(':')[0] : rgb_variables_to_restore[0]}
        rgb_assignment_map.update({ v.name.split(':')[0].split('/', 1)[1] : v for v in rgb_variables_to_restore[1:] })

        tf.train.init_from_checkpoint(self.pre_trained_model_path, assignment_map)


with tf.variable_scope("depth_branch"):
    with tf.contrib.slim.arg_scope(resnet_v1.resnet_arg_scope()):     
        depth_logits, end_points = resnet_v1.resnet_v1_101(features[1], self.num_classes, is_training=is_training)
        depth_variables_to_restore = tf.contrib.slim.get_variables_to_restore(exclude=['depth_branch/resnet_v1_101/logits'])

        depth_assignment_map = { depth_variables_to_restore[0].name.split(':')[0] : depth_variables_to_restore[0]}
        depth_assignment_map.update({ v.name.split(':')[0].split('/', 1)[1] : v for v in depth_variables_to_restore[1:] })

        tf.train.init_from_checkpoint(self.pre_trained_model_path, assignment_map)

问题是,在第二次初始化(depth分支)期间,TF抱怨logits层的形状好像从未被移除:

ValueError: Shape of variable rgb_branch/resnet_v1_101/logits/biases:0 ((3,)) doesn't match with shape of tensor resnet_v1_101/logits/biases ([1000]) from checkpoint reader.

当我仅初始化一个分支时,不会发生任何问题,并且仅与定义的第一个分支相关联-如果更改分支的顺序,则上述错误将变为depth_branch/resnet_v1_101/logits/biases:0

我做错什么了吗?分配图似乎将相同的名称从检查点映射到来自单独图的var。

还有其他方法可以通过TF Slim实现吗?

谢谢!

0 个答案:

没有答案