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

如何用Deeplearning4J(DL4J)构建LSTM-RNN回归模型预测车辆速度?

使用DL4J构建LSTM预测车辆速度的完整方案

一、先解决3D数组数据格式问题

DL4J中RNN(包括LSTM)要求输入是**[样本数, 时间步长, 特征数]**的3D张量,这是你之前修改CSV示例失败的核心原因。针对你的场景(输入为时间索引单特征,输出为速度),我们用滑动窗口构造时序训练数据:

设定look_back=5(用前5个时间步的时间索引预测下一个时间步的速度),处理步骤如下:

  1. 加载CSV数据,提取时间索引和速度列
  2. 对数据做归一化(LSTM对数据尺度敏感,建议归一化到[0,1]区间)
  3. 滑动窗口生成训练集:
    • 输入X:每一行是连续look_back个时间索引,形状为(样本数, look_back, 1)
    • 输出y:对应每个窗口后的下一个速度值,形状为(样本数, 1)

数据预处理代码示例(手动构造时序数据)

// 假设已将CSV中的时间索引、速度分别存入double数组timeIdxArray、speedArray
List<INDArray> inputList = new ArrayList<>();
List<INDArray> labelList = new ArrayList<>();
int lookBack = 5;

for (int i = 0; i < timeIdxArray.length - lookBack; i++) {
    // 构造单样本输入:shape为[1, lookBack, 1]
    INDArray input = Nd4j.create(new double[][][]{Arrays.copyOfRange(timeIdxArray, i, i+lookBack)}, new int[]{1, lookBack, 1});
    inputList.add(input);
    // 构造对应标签:shape为[1,1]
    INDArray label = Nd4j.create(new double[]{speedArray[i+lookBack]}, new int[]{1,1});
    labelList.add(label);
}

// 合并为训练数据集
INDArray features = Nd4j.concat(0, inputList.toArray(new INDArray[0]));
INDArray labels = Nd4j.concat(0, labelList.toArray(new INDArray[0]));
DataSet dataSet = new DataSet(features, labels);

// 拆分训练/测试集
SplitTestAndTrain split = dataSet.splitTestAndTrain(0.8);
DataSet trainData = split.getTrain();
DataSet testData = split.getTest();

// 归一化处理
DataNormalization scaler = new MinMaxScaler();
scaler.fit(trainData);
trainData.setPreProcessor(scaler);
testData.setPreProcessor(scaler);

二、LSTM模型构建

针对车辆速度预测的回归任务,给出基础且易调整的模型结构:

MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
        .seed(123) // 固定随机种子保证结果可复现
        .updater(new Adam(0.001)) // Adam优化器适配多数时序任务
        .list()
        // 第一层LSTM:输入特征数1,隐藏节点数64
        .layer(0, new LSTM.Builder().nIn(1).nOut(64)
                .activation(Activation.TANH) // LSTM标准激活函数
                .build())
        // Dropout层:抑制过拟合,可选
        .layer(1, new Dropout.Builder(0.2).build())
        // 输出层:回归任务用线性激活,输出1个速度值
        .layer(2, new DenseLayer.Builder().nIn(64).nOut(1)
                .activation(Activation.IDENTITY)
                .build())
        .setInputType(InputType.recurrent(1)) // 指定输入为时序数据,特征数1
        .build();

MultiLayerNetwork model = new MultiLayerNetwork(conf);
model.init();

三、模型训练与预测

// 训练模型
model.fit(trainData);

// 测试集预测
INDArray testInput = testData.getFeatures();
INDArray predictions = model.output(testInput);

// 反归一化还原真实速度值
scaler.revertLabels(predictions);
scaler.revertLabels(testData.getLabels());

// 打印部分预测结果
for (int i = 0; i < 10; i++) {
    System.out.printf("预测速度: %.2f, 真实速度: %.2f%n", predictions.getDouble(i), testData.getLabels().getDouble(i));
}

四、参数调整建议

  • 隐藏层数量:单特征时序预测用1-2层LSTM足够,层数过多易过拟合
  • LSTM节点数:从32、64、128开始尝试,数据量小选32,数据量大可提升至128
  • 激活函数:LSTM层固定用tanh(DL4J默认),输出层回归任务必须用IDENTITY线性激活
  • 权重设置:DL4J自动用Xavier初始化权重,新手无需手动调整,后续可按需更换初始化器
  • 时间步长look_back:从5、10、20开始尝试,对应使用多少个历史时间点预测未来

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 01:13:15