神经网络代码运行报错:输入形状不兼容问题排查
问题分析:神经网络输入形状不兼容错误
问题场景
运行以下代码训练二分类神经网络时,Epoch 1阶段触发ValueError,提示输入形状不兼容:期望形状为(None, 455, 30),实际输入形状为(None, 30)。
原始代码
import pandas as pd import tensorflow as tf from sklearn.model_selection import train_test_split dataset = pd.read_csv ("/content/dataset/cancer.csv") x = dataset.drop(columns = ["diagnosis(1=m, 0=b)"]) y = dataset["diagnosis(1=m, 0=b)"] 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-45-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 1377, in train_function * return step_function(self, iterator) File "/usr/local/lib/python3.10/dist-packages/keras/src/engine/training.py", line 1360, 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 1349, in run_step ** outputs = model.train_step(data) File "/usr/local/lib/python3.10/dist-packages/keras/src/engine/training.py", line 1126, 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_10" is incompatible with the layer: expected shape=(None, 455, 30), found shape=(None, 30)
原因分析
错误出在model.add(tf.keras.layers.Dense(256, input_shape = x_train.shape, activation="sigmoid"))这一行:
x_train.shape返回的是整个训练集的维度,即(455, 30),其中455是训练样本数量,30是单样本的特征数。- Keras的
input_shape参数要求的是单个样本的特征维度,不需要包含样本数量。当你把整个训练集的shape传入后,模型错误地认为每个样本的形状是(455, 30),但实际训练时输入的每个样本是一维的30个特征,形状为(30,),导致输入形状不匹配。
修正方案
将input_shape = x_train.shape修改为input_shape = x_train.shape[1:](自动获取单样本特征维度),或者直接写input_shape=(30,)。
修正后代码
import pandas as pd import tensorflow as tf from sklearn.model_selection import train_test_split dataset = pd.read_csv ("/content/dataset/cancer.csv") x = dataset.drop(columns = ["diagnosis(1=m, 0=b)"]) y = dataset["diagnosis(1=m, 0=b)"] x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2) model = tf.keras.models.Sequential() # 修改input_shape为单样本特征维度 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,提问作者Adeep Sudarsan
相关产品推荐
相关产品推荐

