You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Keras中递归展开、解析并扁平化嵌套模型?

把嵌套Keras模型扁平化的方法

嘿,这个嵌套模型扁平化的问题我熟!其实本质就是把所有嵌套的子模型拆解开,把里面的基础层(比如Dense这类)逐个拎出来,重新拼成一个没有任何子模型的新模型。不管是Sequential嵌套还是函数式Model嵌套,都能搞定,甚至深度嵌套也没问题。

基础版:手动拆解单层嵌套

先拿你给出的示例代码来说,我们可以手动把model_1和model_2里的层提取出来,重新构建模型:

首先补全示例代码(方便演示):

from keras.models import Sequential, Model
from keras.layers.core import Input, Dense

# 构建model_1(Sequential子模型)
model_1 = Sequential()
model_1.add(Dense(64, activation='relu', input_shape=(32,)))
model_1.add(Dense(32, activation='relu'))

# 构建model_2(函数式子模型)
input_2 = Input(shape=(32,))
output_2 = Dense(16, activation='sigmoid')(input_2)
model_2 = Model(inputs=input_2, outputs=output_2)

# 嵌套的总模型
model = Sequential()
model.add(model_1)
model.add(model_2)

然后手动拆解扁平化:

# 初始化一个全新的Sequential模型
flattened_model = Sequential()

# 把model_1里的所有层按顺序加进去
for layer in model_1.layers:
    flattened_model.add(layer)

# 把model_2里的层加进去,但要跳过Input层(因为model_1的输出会直接作为输入)
for layer in model_2.layers:
    if not isinstance(layer, Input):
        flattened_model.add(layer)

# 打印模型结构验证一下
flattened_model.summary()

这样得到的flattened_model就完全没有嵌套的子模型了,所有层都是基础的网络层。

进阶版:递归处理深度嵌套

如果你的模型里有更深的嵌套(比如model_1里还嵌套了其他子模型),手动拆解就太麻烦了,这时候写个递归函数自动提取所有层就很方便:

from keras.models import Model, Sequential

def extract_all_layers(target_model):
    """递归提取所有非子模型类型的层"""
    all_layers = []
    for layer in target_model.layers:
        # 如果当前层是子模型(Model或Sequential),递归进去提取它的层
        if isinstance(layer, (Model, Sequential)):
            all_layers.extend(extract_all_layers(layer))
        else:
            # 普通层直接加入列表
            all_layers.append(layer)
    return all_layers

# 用递归函数提取所有层,然后构建扁平化模型
all_layers = extract_all_layers(model)
flattened_model = Sequential(all_layers)

# 查看扁平化后的模型结构
flattened_model.summary()

这个函数会自动遍历所有嵌套层级,把所有子模型都拆解开,只保留基础的网络层,最后按原顺序组装成新模型,完美解决深度嵌套的问题。

注意事项

  • 不用担心输入输出形状不匹配:因为我们完全保留了原模型的层顺序,原模型能正常运行的话,扁平化后的模型也会自动匹配输入输出形状
  • 层的名字会保留:如果原模型里的层有自定义名字,提取后名字不会丢失,除非原模型里有重名的层(这种情况建议提前修改层名)
  • 函数式模型的Input层会被自动跳过:因为最外层的Sequential模型会根据第一个层的input_shape自动生成输入,不需要重复添加Input层

内容的提问来源于stack exchange,提问作者Mofef

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:22:17