我正在尝试在经过预先培训的MobileNetV2的基础上构建SSD。所以我需要从多层MobileNet核心中获取输出,添加一些卷积,先验,重塑,并置...最后,然后尝试建立一个模型:k_bundle
,我遇到了“图形断开”问题。
这是我的伪代码:
model = Model(inputs=img_input, outputs=out)
最后,我有一个错误:
img_input = Input((224,224,3))
conv_model = MobileNetV2(weights='imagenet',
include_top=False,
alpha=0.35,
pooling=None,
input_shape=(224, 224, 3))
block14 = conv_model.get_layer('block_14_project_BN').output
block14_box_conf = Conv2D(...)(block14)
block14_box_loc = Conv2D(...)(block14)
block14_priors = PriorBox(...)(block14_box_loc)
# same for other blocks
# Reshaping, Concatinations... softmax for conf...
model = Model(inputs=img_input, outputs=out)
我可以“通过砖头”构建MobileNet,但是在这种情况下将无法加载权重。而且我需要了解此错误的原因。
此外,如果我尝试使用嵌套模型的某些内部层的输出,即使在诸如SSD这样的复杂情况下,也会出现此错误。
答案 0 :(得分:0)
无论惰性计算和静态图的静态程度如何,调用的层顺序都很重要。 我应该首先使用整个嵌套模型的输出。例如:
model_out = conv_model(img_input)
model_out_box_conf = Conv2D(...)(model_out)
model_out _box_loc = Conv2D(...)(model_out)
model_out_priors = PriorBox(...)(model_out_box_loc)
只有在那之后,我才能调用内层:
block14 = conv_model.get_layer('block_14_project_BN').output
block14_box_conf = Conv2D(...)(block14)
block14_box_loc = Conv2D(...)(block14)
block14_priors = PriorBox(...)(block14_box_loc)