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

运行Keras LSTM模型预测时出现ValueError空batch_outputs报错如何修复

报错定位

这个错误的触发原因是传入model.predict()的输入为空数组,代码存在多处逻辑缺失和配置错误,核心问题如下:

  • 数据集构造逻辑完全缺失:你仅初始化了X_train、testX、y_train为空列表,没有做时间序列滑窗切分,直接将空列表转为numpy数组传入模型,空输入自然返回空batch结果触发报错。
  • LSTM层输入形状配置错误:LSTM要求输入形状为(时间步长, 特征数),你写的input_shape=(X_train.shape[0], 1)是拿空数组的样本维度当时间步,参数逻辑完全错误。
  • 核心流程缺失:代码没有调用model.fit()做训练,也没有定义testY变量,就算输入不为空,后续逆归一化步骤也会直接报错。
  • 参数不匹配:你定义了features=2,但实际仅使用了A单列数据,属于单变量预测,特征数应为1。

报错提示里建议的run_eagerly=True仅为调试手段,开启后只会更清晰地暴露输入为空的问题,无法解决根因。

修复方案
  1. 先补全时间序列滑窗构造数据集的逻辑,将一维序列转为LSTM可接收的3D输入格式(样本数, 时间步长, 特征数)
  2. 修正LSTM层的input_shape参数,和你实际使用的时间步、特征数对齐
  3. 补上模型训练步骤,定义缺失的测试集标签变量

修正后的可运行代码参考:

import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Bidirectional, Dropout, Dense

# 此处替换为你自己的df读取逻辑
# df = pd.read_csv('your_data.csv')
COLUMNS=['A']
dataset=df[COLUMNS]
scaler = MinMaxScaler(feature_range=(0, 1))
dataset = scaler.fit_transform(np.array(dataset).reshape(-1,1))

train_size = int(len(dataset) * 0.60)
test_size = len(dataset) - train_size
train, test = dataset[0:train_size,:], dataset[train_size:len(dataset),:]

# 补全数据集构造函数
def create_dataset(dataset, look_back=1):
    dataX, dataY = [], []
    for i in range(len(dataset)-look_back-1):
        a = dataset[i:(i+look_back), 0]
        dataX.append(a)
        dataY.append(dataset[i + look_back, 0])
    return np.array(dataX), np.array(dataY)

timeSteps=4 # 滑窗大小,和你定义的参数对齐
n_future = 1
# 构造训练、测试集
X_train, y_train = create_dataset(train, look_back=timeSteps)
testX, testY = create_dataset(test, look_back=timeSteps)

# 将输入reshape为LSTM要求的3D格式 [样本数, 时间步, 特征数]
X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
testX = np.reshape(testX, (testX.shape[0], testX.shape[1], 1))

model = Sequential()
# 修正input_shape为(时间步长, 特征数)
model.add(Bidirectional(LSTM(units=50, return_sequences=True, 
                             input_shape=(timeSteps, 1))))
model.add(LSTM(units= 50, return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(units= 50, return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(units= 50))
model.add(Dropout(0.2))
model.add(Dense(units = n_future))

model.compile(optimizer="adam", loss="mean_squared_error")

# 补上模型训练步骤
model.fit(X_train, y_train, epochs=20, batch_size=32, validation_data=(testX, testY), verbose=1)

# 预测
trainPredict = model.predict(X_train)
testPredict = model.predict(testX)

# 逆归一化
trainPredict = scaler.inverse_transform(trainPredict)
y_train = scaler.inverse_transform([y_train])
testPredict = scaler.inverse_transform(testPredict)
testY = scaler.inverse_transform([testY])
注意事项
  • 如果你的数据集本身长度小于timeSteps,构造出来的数据集依然会是空的,需要保证原始数据长度大于滑窗大小。
  • 单变量预测场景下不需要设置features=2,如果后续要做多特征预测,再对应调整特征维度和数据集构造逻辑即可。
  • 原代码编译时配置的metrics=["acc"]是分类任务的准确率指标,回归预测场景下没有参考意义,可以直接去掉。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 23:48:26