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

Keras序列模型训练报错:数据基数不明确,求解决方案

Keras模型训练数据不匹配问题解决

核心错误原因

你遇到的ValueError本质是输入样本数与输出样本数不匹配:Keras的model.fit(x, y)要求x和y的第一维度(样本数)必须完全一致,每个输入样本必须对应一个输出样本。

你的代码中错误地将特征维度的数量当作了样本数量:

  • feature_sample.shape = (14768,1):这是第一个个体的14768个输入特征,而非14768个样本
  • train_sample.shape = (5997,1):这是第一个个体的5997个输出特征,而非5997个样本

根据你的注释,149列代表149个个体(样本),14768和5997是对应每个样本的输入/输出特征数。因此正确的样本数是149,输入特征数14768,输出特征数5997。

解决步骤

1. 修正数据维度

将输入和输出数据转置,把特征维度和样本维度调换:

# 原feature_train形状(14768,149),转置后为(149,14768):149个样本,每个样本14768个输入特征
feature_sample = feature_train.T
# 原train形状(5997,149),转置后为(149,5997):149个样本,每个样本5997个输出特征
train_sample = train.T

2. 调整模型输入输出维度

根据修正后的数据维度,修改模型的输入层和输出层参数:

Nodes = [250, 250]
model = Sequential()
# 输入维度设为输入特征数14768
model.add(Dense(units=Nodes[0], activation='elu', input_dim=feature_sample.shape[1]))

if len(Nodes) > 1:
    for i in range(len(Nodes) - 1):
        model.add(Dense(units=Nodes[i + 1], activation='elu'))

# 输出层units设为输出特征数5997
model.add(Dense(units=train_sample.shape[1], activation='elu'))

# 编译和训练代码保持不变
adam = keras.optimizers.Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.01)
model.compile(loss=losses.mean_squared_error,
              optimizer=adam,
              metrics=['accuracy'])

for i in range(5):  
    seqModel = model.fit(feature_sample, train_sample, epochs=100, batch_size=50, validation_split=0.1, verbose=0)

3. 验证效果

修正后,feature_sample和train_sample的样本数都是149,使用validation_split=0.1时,训练集样本数为134,验证集为15,数据基数完全匹配,不会再出现报错。

特殊情况处理(序列到序列任务)

如果你实际需求是处理序列到序列映射(比如输入长度14768的序列,输出长度5997的序列),则需要改用循环神经网络或Transformer的编码器-解码器结构,示例代码如下:

from keras.models import Model
from keras.layers import Input, LSTM, Dense
from keras.optimizers import Adam

# 输入序列长度14768,单特征
encoder_inputs = Input(shape=(14768, 1))
encoder = LSTM(250, return_state=True)
encoder_outputs, state_h, state_c = encoder(encoder_inputs)
encoder_states = [state_h, state_c]

# 解码器输入序列长度5997,单特征
decoder_inputs = Input(shape=(5997, 1))
decoder_lstm = LSTM(250, return_sequences=True, return_state=True)
decoder_outputs, _, _ = decoder_lstm(decoder_inputs, initial_state=encoder_states)
decoder_dense = Dense(1, activation='elu')
decoder_outputs = decoder_dense(decoder_outputs)

# 构建模型
model = Model([encoder_inputs, decoder_inputs], decoder_outputs)
model.compile(optimizer=Adam(learning_rate=0.001), loss='mean_squared_error')

# 训练时需确保输入输出的样本数一致,比如N个样本,每个样本对应输入序列和输出序列
# model.fit([encoder_input_data, decoder_input_data], decoder_target_data, ...)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 03:10:33