TensorFlow用多特征CSV训练模型时报sequential层输入数量错误如何解决
问题根因
tf.data.experimental.make_csv_dataset默认返回的数据集格式为(特征字典, 标签),字典中每个键对应CSV的一列特征,每列都是独立的张量,你有8个特征就会输出8个独立张量,但你的Sequential模型仅支持接收1个合并后的特征张量,因此触发维度错误。- 模型输入配置错误:你的数据有8个特征,但输入层
input_shape写为(1,7),维度完全不匹配;同时非时序全连接网络不需要额外添加维度1,正确的输入形状应为(8,);且Sequential模型仅需在第一层定义输入形状,后续层会自动推导输入维度,无需每层都配置input_shape。
解决步骤
- 给数据集添加预处理逻辑,将8个独立的特征张量合并为单个二维张量,代码如下:
def preprocess_fn(features, label): # 遍历所有特征列,扩展维度后沿最后一维拼接,得到形状为(batch_size, 8)的特征张量 feature_tensor = tf.concat([tf.expand_dims(features[col], axis=-1) for col in features.keys()], axis=-1) return feature_tensor, label # 给三个数据集都应用预处理函数 train_dataset = train_dataset.map(preprocess_fn) validation_dataset = validation_dataset.map(preprocess_fn) test_dataset = test_dataset.map(preprocess_fn)
注意:如果你的CSV包含标签列,需要在调用make_csv_dataset时通过label_name参数指定标签列的名称,否则所有列都会被识别为特征,不会返回单独的标签值。
- 修正模型的输入配置,调整后的模型代码如下:
model = tf.keras.Sequential() # 仅第一层需要指定输入形状,对应8个特征 model.add(layers.Dense(8, activation="relu", input_shape=(8, ))) model.add(layers.Dense(8, activation="relu")) # 若你做的是回归任务,中间层不要用softmax激活;如果是分类任务,输出层维度要对应分类数,根据实际场景调整激活函数 model.add(layers.Dense(8, activation="relu")) model.add(layers.Dense(1)) model.summary()
- 调整完成后重新运行
model.fit即可正常训练。
内容的提问来源于stack exchange,提问作者Orçun Şimşek
相关产品推荐
相关产品推荐

