Keras Sequential实现序列预测时触发数据基数不匹配报错求助
报错核心原因
Keras训练时强制校验输入特征
X、标签y的第一个维度(即样本数)必须完全一致。你当前代码构造的X经过reshape([1,-1])后第一个维度为1,而y的长度为k,两个维度值不对等,直接触发校验错误,与你收到的x sizes:1, y sizes:2报错完全对应。
代码内的其他逻辑问题
- 时序样本构造逻辑错误:你将整段2/3长度的序列作为单一样本的输入特征,取k个后续值作为单一样本的标签,模型无法学习到“哪段输入对应哪段输出”的映射关系,完全达不到序列预测的训练效果
- 模型配置缺失:单神经元
Dense层没有指定输入维度,模型初始化时无法匹配输入数据的形状 - 指标计算错误:回归任务下
model.evaluate仅返回损失值,不存在第二个索引对应的准确率指标,原有print语句还存在格式化语法错误、索引越界的问题 - 数据划分逻辑错误:训练、测试集的X和y长度完全不对等,不符合模型训练的样本配对规则
修正方案
单变量序列预测的标准样本构造逻辑为滑动窗口切片:取连续窗口长度的序列值作为输入X,窗口后紧随的目标长度值作为标签y,逐位滑动窗口生成全量配对样本,保证X和y的样本数完全一致。
修正后的可运行代码如下:
import numpy as np import tensorflow as tf from tensorflow.keras import layers, Sequential # 通用滑动窗口切片函数,任意序列可直接调用 def create_windows(series, window_size, target_size): X, y = [], [] for i in range(len(series) - window_size - target_size + 1): # 取窗口段作为输入 X.append(series[i:i+window_size]) # 取窗口后紧随的target_size长度值作为标签 y.append(series[i+window_size:i+window_size+target_size]) return np.array(X), np.array(y) # 取模15的斐波那契序列构造(通用适配) def build_fib_mod15(length): fib = [0, 1] for i in range(2, length): fib.append((fib[-1] + fib[-2]) % 15) return np.array(fib) df_fib = build_fib_mod15(100) # 按需求调整序列长度 predicted_values = [1,2,3,4,5] models = {} for k in predicted_values: # 固定滑动窗口长度,可根据需求调整 window_size = 10 # 生成全量配对样本 X_all, y_all = create_windows(df_fib, window_size, k) # 按2:1比例拆分训练测试集,保证X和y的样本数同步 split_idx = int(len(X_all) * 2/3) X_train, y_train = X_all[:split_idx], y_all[:split_idx] X_test, y_test = X_all[split_idx:], y_all[split_idx:] # 配置明确输入维度的模型 model = Sequential() model.add(layers.Dense(16, activation='relu', input_shape=(window_size,))) model.add(layers.Dense(k)) # 输出维度匹配k个预测值 model.compile(loss='mean_squared_error', optimizer='adam') model.fit(X_train, y_train, epochs=20, verbose=0) # verbose控制日志输出量 test_loss = model.evaluate(X_test, y_test, verbose=0) print(f'预测后续{k}个值的测试集MSE损失: {test_loss:.4f}') models[k] = model
注:如果需要用到RNN/LSTM做时序建模,仅需替换Sequential内的层结构即可,样本构造逻辑保持不变。
内容的提问来源于stack exchange,提问作者Liliac
相关产品推荐
相关产品推荐

