使用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
相关产品推荐
相关产品推荐

