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

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)

关键修正点

  1. 输入形状修正:将input_shape = en_X_train.shape改为input_shape = en_X_train.shape[1],并在Input层传入(input_shape,),确保模型期望输入形状与实际训练数据匹配。
  2. 优化器参数修正:把beta_1=-0.075改为beta_1=0.9(Adam默认值之一,符合参数范围要求)。
  3. 清理冗余导入:删除未使用的PyTorch模块和Keras冗余导入,统一使用tensorflow.keras下的模块,避免命名冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 15:15:41