如何用多组同结构数据集训练同一Keras LSTM模型?
解决多时间序列数据集训练同一LSTM的问题
方案1:合并所有数据集后一次性训练
把所有同规格的输入和标签数据合并成大矩阵,一次性完成训练,适合数据量能放入内存的场景。
import numpy as np # 假设x1~x120均为形状(n_samples, 5, 4)的数组,y1~y120为(n_samples, 1)的数组 # 合并所有输入数据 X_all = np.concatenate([x1, x2, x3, ..., x120], axis=0) # 合并所有标签数据 y_all = np.concatenate([y1, y2, y3, ..., y120], axis=0) # 模型初始化与编译仅执行一次 model_seq = Sequential() model_seq.add(InputLayer((5,4))) model_seq.add(LSTM(64)) model_seq.add(Dense(8,"relu")) model_seq.add(Dense(1,"linear")) opti2=Adam(learning_rate=0.0001) model_seq.compile(loss="mse", optimizer=opti2, metrics="mae") # 用合并后的数据集训练,开启shuffle打乱数据避免模型连续学习单一数据集规律 model_seq.fit(X_all, y_all, epochs=50, batch_size=16, verbose=1, shuffle=True)
方案2:循环遍历数据集逐步累积训练
如果数据量过大无法一次性加载,可循环遍历每个数据集训练,但必须确保仅编译模型一次,避免重置权重和优化器状态。
# 初始化并编译模型(仅执行一次) model_seq = Sequential() model_seq.add(InputLayer((5,4))) model_seq.add(LSTM(64)) model_seq.add(Dense(8,"relu")) model_seq.add(Dense(1,"linear")) opti2=Adam(learning_rate=0.0001) model_seq.compile(loss="mse", optimizer=opti2, metrics="mae") # 将所有数据集存入列表 datasets = [(x1,y1), (x2,y2), ..., (x120,y120)] # 循环训练每个数据集 for idx, (x, y) in enumerate(datasets): print(f"训练第{idx+1}组数据集") # 每组数据训练的轮数可按需调整,shuffle=True打乱当前数据集 model_seq.fit(x, y, epochs=2, batch_size=16, verbose=1, shuffle=True)
方案3:用tf.data.Dataset构建流式数据集(超大数据场景)
若总数据量远超内存容量,可借助TensorFlow的流式数据集实现分批加载训练。
import tensorflow as tf # 将每个数据集转为tf.data.Dataset格式 dataset_list = [tf.data.Dataset.from_tensor_slices((x, y)) for x, y in datasets] # 合并所有数据集,打乱后分批 combined_dataset = tf.data.Dataset.concatenate(*dataset_list) combined_dataset = combined_dataset.shuffle(buffer_size=10000).batch(16) # 模型初始化与编译(仅执行一次) model_seq = Sequential() model_seq.add(InputLayer((5,4))) model_seq.add(LSTM(64)) model_seq.add(Dense(8,"relu")) model_seq.add(Dense(1,"linear")) opti2=Adam(learning_rate=0.0001) model_seq.compile(loss="mse", optimizer=opti2, metrics="mae") # 训练流式数据集 model_seq.fit(combined_dataset, epochs=50, verbose=1)
额外注意:数据归一化
由于各时间序列终点值差异大,数据分布不均可能导致模型训练不稳定,建议:
- 对每个时间序列单独做归一化(如缩放到[0,1]区间),预测时再反归一化还原真实值;
- 若数据集整体分布差异不大,可计算全局均值和标准差做统一归一化。
内容的提问来源于stack exchange,提问作者omer_tb
相关产品推荐
相关产品推荐

