将模型中的Keras模型层转换为多层

时间:2019-06-05 19:19:53

标签: python tensorflow keras

我目前有一个使用带有ResNet50的Functional API的体系结构,但是在构建带有附加层的模型时,它将ResNet视为模型层,而不是一系列层。是否有任何方法可以在不使用顺序API的情况下将此模型层转换为一系列层?我本质上是想将模型中的这个模型变成一个模型。 (不只是打印出图层或其他内容)这是模型架构,显示带有resnet50“图层”的当前模型。

Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
main_input (InputLayer)         (None, 224, 224, 3)  0                                            
__________________________________________________________________________________________________
aux_input (InputLayer)          (None, 224, 224, 1)  0                                            
__________________________________________________________________________________________________
lambda_4 (Lambda)               (None, 224, 224, 3)  0           main_input[0][0]                 
                                                                 aux_input[0][0]                  
__________________________________________________________________________________________________
resnet50 (Model)                (None, 2)            23591810    lambda_4[0][0]                   
==================================================================================================

3 个答案:

答案 0 :(得分:0)

更多的是解决方法,而不是真正的答案,但是在这种情况下,我的解决方案是使用功能性api完全重新实现resnet50结构,并在必要时添加我的图层。请参见this示例。 通过使用这种方法,没有“模型”嵌套层。

答案 1 :(得分:0)

您可以欺骗这个,是的。但是其他评论/答案并不是在开玩笑,要看的东西很多,特别是因为它以线性方式打印出来,而以这种方式可视化数据流并不容易。以下是一些可能对您有帮助的细节。

  • 您可以从model.layers中获取图层,其中将包括您添加到其中的所有内容。
  • 您可以引用这些图层,例如layer_001 = model.layers[0]
    • 如果要将它们保留在现有模型管道中,则可以在模型中更改它们的属性(例如,添加正则化:model.layers[-7].bias_regularizer=l2(0.001)
    • 如果您像示例layer_001一样明确引用它们,则需要先重建并重新编译新的模型管道,然后再进行拟合。

如果您可以想到一种对所有层执行此操作的简洁循环方法,那可能很好,但是否则将需要大量工作来重新创建整个过程。我同意其他评论/答案,只是在Papers with Code的帮助下从头开始重新创建它。

如果您只想在几层上修改几个属性,我将在模型内部引用它们(如上)并重新编译。

答案 2 :(得分:0)

您可以对此使用更简单的功能:

def DeCapsule(model,LayerName):
    GotInnerModel = False
    for layer in model.layers[1:]:
        if not GotInnerModel:
            if layer.name ==LayerName:
                MiddleModel = layer
                Out = layer.layers[-1].output
                GotInnerModel = True
        else:
            Out = layer(Out)

    Out = Model(inputs=MiddleModel.layers[0].input, outputs=Out)        
    return Out