LSTM时间序列预处理时X_test为嵌套数组转张量报错如何解决?
问题原因
- 核心原因是循环遍历范围错误导致部分时间窗口切片长度不足:你当前for循环遍历了全部
n_records个索引,当索引i满足i + stepsBack > len(X)时,切片X[i : i + stepsBack]的长度会小于你设定的stepsBack=7,出现长短不一的窗口。 - 训练集取的是序列前半部分的窗口,索引都比较小,所有窗口长度都能达到7,所以
np.asarray可以直接转成正常的三维数值数组;而测试集取的是序列后半部分的窗口,很多索引对应的切片长度不足7,numpy无法合并成统一维度的数值数组,只能退而求其次生成嵌套的object类型数组,转tensor的时候自然报错。 - 额外的错误点:你当前的测试集切片逻辑
x[split + stepsForward : n_records - stepsForward]也存在边界计算错误,进一步放大了窗口长度不一致的问题。
修复方案
直接修改walk_forward函数的逻辑,确保所有生成的时间窗口长度完全一致:
def walk_forward(X, stepsBack, stepsForward, trainTestSplit): # 调整遍历范围:确保每个窗口的x长度为stepsBack、y长度为stepsForward,不会越界 max_i = len(X) - stepsBack - stepsForward + 1 x = [] y = [] for i in range(max_i): x.append(X[i : i + stepsBack]) y.append(X[i + stepsBack : i + stepsBack + stepsForward]) # 直接按比例划分即可,所有窗口长度都是统一的 split = int(len(x) * trainTestSplit) xtrain = x[:split] xtest = x[split:] ytrain = y[:split] ytest = y[split:] print('train=%d, test=%d' % (len(xtrain), len(xtest))) return np.asarray(xtrain), np.asarray(ytrain), np.asarray(xtest), np.asarray(ytest)
修改后所有x窗口的长度都是固定的7,np.asarray会直接生成正常的三维数值数组,转tensor的报错会自动消失。
内容的提问来源于stack exchange,提问作者Crayfi
相关产品推荐
相关产品推荐

