我正在尝试使用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实现吗?
谢谢!