LSTM训练时得到4D数组怎么办?如何转换为要求的3D输入数组?
问题解决方法
你出现4D数组的核心原因是数据处理时多保留了分组维度(类别子文件夹维度/单类别下CSV的分组维度),没有把所有独立样本合并到第一维,按以下步骤调整即可:
维度定义确认
先明确你现有数据的维度属性:
- 单份CSV共30行,对应LSTM要求的
n_timesteps=30 - 单份CSV去掉
class、timestamp两列后共1662列,对应n_features=1662 - 总样本数
n_sample为所有子文件夹下CSV的总数:假设有N个类别子文件夹,每个子文件夹5份CSV,总样本数就是N*5
处理代码
直接用以下逻辑读取并拼接数据即可得到符合要求的3D数组:
import os import numpy as np import pandas as pd # 配置根目录 data_root = "data" sample_list = [] label_list = [] # 遍历类别子文件夹 for class_name in os.listdir(data_root): class_folder = os.path.join(data_root, class_name) if not os.path.isdir(class_folder): continue # 遍历当前类别下的所有CSV文件 for csv_name in os.listdir(class_folder): if not csv_name.endswith(".csv"): continue # 读取CSV并提取特征列 df = pd.read_csv(os.path.join(class_folder, csv_name)) # 取第3列及之后的所有列为特征,形状为 (30, 1662) feature_arr = df.iloc[:, 2:].values sample_list.append(feature_arr) label_list.append(class_name) # 堆叠所有样本得到最终3D输入 lstm_input = np.array(sample_list) labels = np.array(label_list)
结果验证
打印lstm_input.shape,输出格式为(总样本数, 30, 1662)即为符合LSTM要求的3D数组。
如果你业务中单样本需要对应单个类别下的5份CSV拼接的长序列,只需要把每个类别下的5份CSV的特征按行拼接,得到形状为
(30*5, 1662)的单样本特征再堆叠,最终得到的数组形状为(类别数, 150, 1662),依然是符合要求的3D结构。
内容的提问来源于stack exchange,提问作者Mayama
相关产品推荐
相关产品推荐

