我目前有一个使用带有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]
==================================================================================================
答案 0 :(得分:0)
更多的是解决方法,而不是真正的答案,但是在这种情况下,我的解决方案是使用功能性api完全重新实现resnet50结构,并在必要时添加我的图层。请参见this示例。 通过使用这种方法,没有“模型”嵌套层。
答案 1 :(得分:0)
您可以欺骗这个,是的。但是其他评论/答案并不是在开玩笑,要看的东西很多,特别是因为它以线性方式打印出来,而以这种方式可视化数据流并不容易。以下是一些可能对您有帮助的细节。
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