Keras Sequential模型输入形状不兼容报错求助
输入形状不匹配导致模型训练报错
问题代码
from torch.nn.modules import activation from tensorflow.keras import models from keras.models import Sequential from tensorflow.keras.layers import concatenate from tensorflow.keras.utils import plot_model from tensorflow.keras.layers import add from keras.layers.core import Dense, Dropout, Activation from tensorflow.keras.layers import Input from torch import relu input_shape = en_X_train.shape[1] tf.keras.backend.clear_session() input_shape = en_X_train.shape modeloA = tf.keras.models.Sequential() modeloA.add(keras.layers.Input(shape=input_shape)) modeloA.add(keras.layers.BatchNormalization()) modeloA.add(keras.layers.Dense(256, activation='relu')) modeloA.add(keras.layers.Dense(256, activation='relu')) modeloA.add(keras.layers.Dense(128, activation='linear')) modeloA.add(keras.layers.BatchNormalization()) modeloA.add(keras.layers.Activation('relu')) modeloA.add(keras.layers.Dropout(0.25)) modeloA.add(keras.layers.Dense(1, activation='sigmoid')) modeloA.summary() modeloA.layers[2].trainable = False modeloA.compile(loss=tf.keras.losses.BinaryCrossentropy(), optimizer=keras.optimizers.Adam(learning_rate=0.0001, beta_1=-0.075), metrics=[tf.keras.metrics.Precision(), tf.keras.metrics.Recall()]) HistA = modeloA.fit(en_X_train, en_y_train, batch_size=16, epochs=25, verbose=1)
模型摘要
Model: "sequential" ---------------------------------------------------------------- Layer (type) Output Shape Param # ================================================================ batch_normalization (BatchNormalization) (None, 42040, 512) 2048 dense (Dense) (None, 42040, 256) 131328 dense_1 (Dense) (None, 42040, 256) 65792 dense_2 (Dense) (None, 42040, 128) 32896 batch_normalization_1 (BatchNormalization) (None, 42040, 128) 512 activation (Activation) (None, 42040, 128) 0 dropout (Dropout) (None, 42040, 128) 0 dense_3 (Dense) (None, 42040, 1) 129 ================================================================ Total params: 232,705 Trainable params: 231,425 Non-trainable params: 1,280
报错信息
Epoch 1/25 ValueError Traceback (most recent call last) in 33 optimizer=keras.optimizers.Adam(learning_rate=0.0001, beta_1=-0.075), 34 metrics=[tf.keras.metrics.Precision(), tf.keras.metrics.Recall()]) ---> 35 HistA = modeloA.fit(en_X_train, en_y_train, batch_size=16, epochs=25, verbose=1) 1 frames /usr/local/lib/python3.8/dist-packages/keras/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.8/dist-packages/keras/engine/training.py", line 1051, in train_function * return step_function(self, iterator) File "/usr/local/lib/python3.8/dist-packages/keras/engine/training.py", line 1040, in step_function ** outputs = model.distribute_strategy.run(run_step, args=(data,)) File "/usr/local/lib/python3.8/dist-packages/keras/engine/training.py", line 1030, in run_step ** outputs = model.train_step(data) File "/usr/local/lib/python3.8/dist-packages/keras/engine/training.py", line 889, in train_step y_pred = self(x, training=True) File "/usr/local/lib/python3.8/dist-packages/keras/utils/traceback_utils.py", line 67, in error_handler raise e.with_traceback(filtered_tb) from None File "/usr/local/lib/python3.8/dist-packages/keras/engine/input_spec.py", line 264, in assert_input_compatibility raise ValueError(f'Input {input_index} of layer "{layer_name}" is ' ValueError: Input 0 of layer "sequential" is incompatible with the layer: expected shape=(None, 42040, 512), found shape=(None, 512)
解决方法
核心问题分析
报错直接原因是输入形状不匹配:模型期望输入形状为(None, 42040, 512),但实际输入是(None, 512)。这是因为代码错误地将包含样本数的完整数据集形状传给了Input层,而Keras的Input层仅需指定特征维度,样本维度由框架自动用None表示。
另外存在两个次要问题:
- Adam优化器的
beta_1参数设为负数,该参数必须在0-1范围内,否则会导致优化器异常。 - 导入了未使用的PyTorch模块,属于冗余导入,易造成混淆。
修正后的代码
from tensorflow.keras import models from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Dropout, Activation, BatchNormalization, Input from tensorflow.keras.losses import BinaryCrossentropy from tensorflow.keras.optimizers import Adam from tensorflow.keras.metrics import Precision, Recall # 仅保留特征维度作为输入形状 input_shape = en_X_train.shape[1] tf.keras.backend.clear_session() modeloA = Sequential() # Input层仅传入特征维度,样本维度由Keras自动处理 modeloA.add(Input(shape=(input_shape,))) modeloA.add(BatchNormalization()) modeloA.add(Dense(256, activation='relu')) modeloA.add(Dense(256, activation='relu')) modeloA.add(Dense(128, activation='linear')) modeloA.add(BatchNormalization()) modeloA.add(Activation('relu')) modeloA.add(Dropout(0.25)) modeloA.add(Dense(1, activation='sigmoid')) modeloA.summary() modeloA.layers[2].trainable = False # 修正beta_1为合理值0.9 modeloA.compile(loss=BinaryCrossentropy(), optimizer=Adam(learning_rate=0.0001, beta_1=0.9), metrics=[Precision(), Recall()]) HistA = modeloA.fit(en_X_train, en_y_train, batch_size=16, epochs=25, verbose=1)
关键修正点
- 输入形状修正:将
input_shape = en_X_train.shape改为input_shape = en_X_train.shape[1],并在Input层传入(input_shape,),确保模型期望输入形状与实际训练数据匹配。 - 优化器参数修正:把
beta_1=-0.075改为beta_1=0.9(Adam默认值之一,符合参数范围要求)。 - 清理冗余导入:删除未使用的PyTorch模块和Keras冗余导入,统一使用
tensorflow.keras下的模块,避免命名冲突。
内容的提问来源于stack exchange,提问作者Carlos Eduardo
相关产品推荐
相关产品推荐

