【问题标题】:Turning Keras Model layer within model into multiple layers将模型中的Keras模型层变成多层
【发布时间】:2019-08-09 20:55:37
【问题描述】:

我目前有一个使用包含 ResNet50 的功能性 API 的架构,但是在构建我的带有附加层的模型时,它将 ResNet 视为模型层,而不是一系列层。有没有什么方法可以把这个模型层变成一系列层,而不使用 Sequential 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]                   
==================================================================================================

【问题讨论】:

  • 您为什么要这样做? Resnet 不仅仅是一系列层。
  • 好问题。我一直在尝试使用中间层输出的损失函数,并且开始怀疑模型的“嵌套”风格可能是我遇到的问题的罪魁祸首。基本上,我尝试使用 mymodel.layers[-1].layers[-6].output 从模型中的 resnet 访问层,但失败了,我希望通过没有嵌套样式的模型层,例如 mymodel.layers[-6].output 它会运行。是的,resnet 的复杂性是我避免使用顺序方法的原因。

标签: python tensorflow keras


【解决方案1】:

与其说是真正的答案,不如说是一种解决方法,但在这种情况下,我的解决方案是使用功能 api 完全重新实现 resnet50 架构,并根据需要添加层。请参阅this 示例。 通过使用这种方法,没有“模型”嵌套层。

【讨论】:

    【解决方案2】:

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

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

    如果您能想出一种巧妙的循环方式来对所有层执行此操作,那可能没问题,但否则,以这种方式重新创建整个事物将需要大量工作。我同意其他 cmets/answers,并在 Papers with Code 的帮助下从头开始重新创建它。

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

    【讨论】:

      【解决方案3】:

      您可以使用与此类似的函数:

      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  
      

      【讨论】:

        猜你喜欢
        • 2019-03-23
        • 2018-11-27
        • 1970-01-01
        • 2019-05-22
        • 2021-04-03
        • 1970-01-01
        • 2018-03-16
        • 2017-05-25
        • 1970-01-01
        相关资源
        最近更新 更多