如何正确获取嵌套模型内层的输出?

时间:2019-06-25 04:22:22

标签: python keras

我正在尝试在经过预先培训的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这样的复杂情况下,也会出现此错误。

1 个答案:

答案 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)
相关问题