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

构建MLP二分类模型时遇输入形状不匹配错误求助

MLP训练时输入维度不兼容错误排查

错误日志

ValueError: in user code: File "/usr/local/lib/python3.10/dist-packages/keras/engine/training.py", line 1284, in train_function * return step_function(self, iterator) File "/usr/local/lib/python3.10/dist-packages/keras/engine/training.py", line 1268, in step_function ** outputs = model.distribute_strategy.run(run_step, args=(data,)) File "/usr/local/lib/python3.10/dist-packages/keras/engine/training.py", line 1249, in run_step ** outputs = model.train_step(data) File "/usr/local/lib/python3.10/dist-packages/keras/engine/training.py", line 1050, in train_step y_pred = self(x, training=True) File "/usr/local/lib/python3.10/dist-packages/keras/utils/traceback_utils.py", line 70, in error_handler raise e.with_traceback(filtered_tb) from None File "/usr/local/lib/python3.10/dist-packages/keras/engine/input_spec.py", line 253, in assert_input_compatibility raise ValueError(

ValueError: Exception encountered when calling layer 'sequential_1' (type Sequential).

Input 0 of layer "dense_3" is incompatible with the layer: expected min_ndim=2, found ndim=1.

Full shape received: (13,)

Call arguments received by layer 'sequential_1' (type Sequential):

• inputs=tf.Tensor(shape=(13,), dtype=float64)

• training=True

• mask=None

输入数据形状

X_train: (227, 13)、y_train: (227,)、X_test: (76, 13)、y_test: (76,)

问题代码

df=pd.read_csv(csv_file_path)

X=df.drop(columns=['output'])

y=df['output']

df=pd.read_csv(csv_file_path)

X=df.drop(columns=['output'])

y=df['output']
# convert dataframes to tensorflow data sets
train_dataset=tf.data.Dataset.from_tensor_slices((X_train.values[1:], y_train.values[1:]))
test_dataset=tf.data.Dataset.from_tensor_slices((X_test.values[1:], y_test.values[1:]))

model=tf.keras.Sequential([
tf.keras.layers.Dense(64, activation='relu', input_shape=(None, X_train.shape[1],)),
tf.keras.layers.Dense(32, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])

model.compile(
optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy']
)

model.compile(
optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy']
)

history=model.fit(
train_dataset,
epochs=10,
validation_data=test_dataset
)

错误原因及修复方案

核心原因

  1. 数据集未设置batch维度:tf.data.Dataset.from_tensor_slices会把(227,13)的X_train拆成227个形状为(13,)的单样本,而MLP的Dense层要求输入是2维张量(格式为(batch_size, 特征数)),单样本的1维张量不符合要求。
  2. 模型输入形状定义错误:input_shape=(None, X_train.shape[1],) 多了一个不必要的None,正确的输入形状应该是单个样本的特征数,即(13,),Keras会自动处理batch维度。

修正后的代码

import pandas as pd
import tensorflow as tf
from sklearn.model_selection import train_test_split

df = pd.read_csv(csv_file_path)
X = df.drop(columns=['output'])
y = df['output']

# 划分训练测试集(原代码缺失步骤,补充完整)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)

# 给数据集添加batch维度,设置合理的batch_size
train_dataset = tf.data.Dataset.from_tensor_slices((X_train.values, y_train.values)).batch(32)
test_dataset = tf.data.Dataset.from_tensor_slices((X_test.values, y_test.values)).batch(32)

# 正确定义模型输入形状
model = tf.keras.Sequential([
    tf.keras.layers.Dense(64, activation='relu', input_shape=(X_train.shape[1],)),
    tf.keras.layers.Dense(32, activation='relu'),
    tf.keras.layers.Dense(1, activation='sigmoid')
])

model.compile(
    optimizer='adam',
    loss='binary_crossentropy',
    metrics=['accuracy']
)

# 删除重复compile的冗余代码
history = model.fit(
    train_dataset,
    epochs=10,
    validation_data=test_dataset
)

额外注意事项

  • 原代码重复读取CSV、定义X/y,属于冗余代码,直接删除即可
  • 原代码中X_train.values[1:]会丢弃第一个样本,若不是故意操作建议去掉[1:]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 14:21:31