TensorFlow Sequential层输入形状不兼容错误求助
肺癌分类模型输入形状不兼容问题排查
问题代码
import pandas as pd import tensorflow as tf from sklearn.model_selection import train_test_split dataset = pd.read_csv('/content/survey lung cancer.csv') x = dataset.drop(columns=["LUNG_CANCER"]) y = dataset["LUNG_CANCER"] y= y.replace("YES", 1) y= y.replace("NO", 0) x= x.replace("M", 1) x= x.replace("F", 0) x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2) model = tf.keras.models.Sequential() model.add(tf.keras.layers.Dense(256, input_shape=x_train.shape, activation='sigmoid')) model.add(tf.keras.layers.Dense(256, activation='sigmoid')) model.add(tf.keras.layers.Dense(1, activation='sigmoid')) model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=1000)
报错信息
Epoch 1/1000 --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-11-a5e6a9bff808> in <cell line: 1>() ----> 1 model.fit(x_train, y_train, epochs=1000) 1 frames /usr/local/lib/python3.10/dist-packages/keras/src/engine/training.py in tf__train_function(iterator) 13 try: 14 do_return = True ---> 15 retval_ = ag__.converted_call(ag__.ld(step_function), (ag__.ld(self), ag__.ld(iterator)), None, fscope) 16 except: 17 do_return = False ValueError: in user code: File "/usr/local/lib/python3.10/dist-packages/keras/src/engine/training.py", line 1401, in train_function * return step_function(self, iterator) File "/usr/local/lib/python3.10/dist-packages/keras/src/engine/training.py", line 1384, in step_function ** outputs = model.distribute_strategy.run(run_step, args=(data,)) File "/usr/local/lib/python3.10/dist-packages/keras/src/engine/training.py", line 1373, in run_step ** outputs = model.train_step(data) File "/usr/local/lib/python3.10/dist-packages/keras/src/engine/training.py", line 1150, in train_step y_pred = self(x, training=True) File "/usr/local/lib/python3.10/dist-packages/keras/src/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/src/engine/input_spec.py", line 298, in assert_input_compatibility raise ValueError( ValueError: Input 0 of layer "sequential" is incompatible with the layer: expected shape=(None, 247, 15), found shape=(None, 15)
问题原因
错误核心是输入形状不匹配:Keras的input_shape参数仅需指定单样本的特征维度,不需要包含样本数量。你用x_train.shape得到的是(247,15)(247为训练样本数,15为特征数),这会让模型错误地期望输入为三维张量(None,247,15),但实际训练时传入的是二维张量(None,15)(None代表批次维度),最终导致形状不兼容。
修复方案
将第一层的input_shape修改为单样本的特征维度,两种写法任选其一:
- 用
x_train.shape[1:]直接提取除样本数外的维度 - 直接写
(x_train.shape[1],)明确指定特征数量
修改后的代码如下:
import pandas as pd import tensorflow as tf from sklearn.model_selection import train_test_split dataset = pd.read_csv('/content/survey lung cancer.csv') x = dataset.drop(columns=["LUNG_CANCER"]) y = dataset["LUNG_CANCER"] y= y.replace("YES", 1) y= y.replace("NO", 0) x= x.replace("M", 1) x= x.replace("F", 0) x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2) model = tf.keras.models.Sequential() # 两种写法二选一即可 model.add(tf.keras.layers.Dense(256, input_shape=x_train.shape[1:], activation='sigmoid')) # 或者 model.add(tf.keras.layers.Dense(256, input_shape=(x_train.shape[1],), activation='sigmoid')) model.add(tf.keras.layers.Dense(256, activation='sigmoid')) model.add(tf.keras.layers.Dense(1, activation='sigmoid')) model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=1000)
内容的提问来源于stack exchange,提问作者christoffer refnov
相关产品推荐
相关产品推荐

