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

修复Keras TypeError:将Sequential转换为Layer嵌入Keras.Model实例

报错根因

触发该TypeError的核心问题不是keras.Sequential不能嵌套在自定义Model中——实际上Sequential本身就是Layer的子类,支持作为子模块嵌套使用。真正的问题是构建Sequential实例时,直接把layers.Input放在了层列表里:这种写法会让Keras立刻生成一个独立的输入占位符张量,这个张量不属于Layer子类实例,在父Model注册子层时就会被识别为非法传入值,抛出类型错误。

修复方法

仅需要调整mlp函数的实现,移除层列表内的layers.Input声明,改用Sequential自带的input_shape参数指定输入维度即可,全程只使用Keras原生API,不需要额外做类型转换。另外原代码中mlp函数未定义hidden参数,补全后可避免后续触发NameError。

修复后的可运行代码如下:

from tensorflow import keras
from tensorflow.keras import layers

def mlp(size_in, size_out, hidden=64, act=layers.ReLU):
    return keras.Sequential(
        [
            layers.Dense(hidden, name='layer1'),
            act(),
            layers.Dense(hidden, name='layer2'),
            act(),
            layers.Dense(hidden, name='layer3'),
            act(),
            layers.Dense(size_out, name='layer4')
        ],
        input_shape=(size_in,)  # 输入形状通过Sequential初始化参数指定
    )


class SumNet(keras.Model):
    def __init__(self):
        super(SumNet, self).__init__()
        self.g = mlp(5, 1)
        self.f = mlp(1, 1)

    def call(self, x):
        y_i = self.g(x)[:, :, 0]
        y = keras.backend.sum(y_i, axis=1, keepdims=True) / y_i.shape[1]
        z = self.f(y)
        return z[:, 0]
实现说明
  • 把输入形状配置移到Sequential的初始化参数后,输入张量的创建逻辑会由Sequential内部托管,只会在模型前向传播构建计算图时生成对应节点,不会提前暴露独立占位符给父Model的层注册流程,从根源上避免类型校验报错。
  • 修复后的实现完全兼容各类Keras后端,不需要引入第三方工具,也不需要重写自定义Layer类,保留了原有代码的结构逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:57:09