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

使用Scikeras包装Keras Sequential模型时出现NoneType无len()错误求助

解决Scikeras KerasRegressor的TypeError问题

问题原因

你遇到的TypeError: object of type 'NoneType' has no len()错误,是因为Scikeras的KerasRegressor需要明确模型的输入特征维度,但你的build_net函数中第一个Dense层未指定输入形状,导致模型无法自动推断输入维度,进而触发错误。

解决方案

修改build_net函数,使其接收Scikeras自动传入的input_shape参数,并在第一个Dense层中指定该参数。这样既不用手动固定输入尺寸,又能适配独热编码后特征维度的变化:

修改后的完整代码

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
import numpy as np
from scikeras.wrappers import KerasRegressor

def build_net(net_loss='mean_squared_error', net_optimizer='adam', input_shape=None):
    model = Sequential()
    # 第一个Dense层通过input_shape参数接收自动推断的输入维度
    model.add(Dense(25, activation='relu', input_shape=input_shape))
    model.add(Dense(9, activation='relu'))
    model.add(Dense(4, activation='relu'))
    model.add(Dense(1, activation='linear'))
    model.compile(loss=net_loss, optimizer=net_optimizer, metrics=['root_mean_squared_error','mean_absolute_error'])
    return model

net = KerasRegressor(model=build_net, epochs=5, verbose=0)
# 测试训练
net.fit(np.random.randint(50, size=(2000, 4)), np.random.randint(1, size=2000))

关键细节

  • Scikeras在调用build_net时,会自动从训练数据中提取输入形状(例如测试数据(2000,4)对应的input_shape为(4,)),并将其作为参数传入函数。
  • 这种方式无需手动指定输入维度,后续独热编码流水线修改特征数量时,代码会自动适配新的输入形状。
  • 原代码遗漏了Dense层的导入,这是潜在的运行错误,已在修改后的代码中补充。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:50:22