SEED-IV数据集转Tensor遇形状不匹配,求MLP情感识别解决方案
解决SEED-IV数据集转张量时形状不匹配的问题
先排查核心问题:明确各数组的真实形状
首先得搞清楚加载后每个数组的具体形状,这是解决形状不匹配的前提。运行下面的代码打印所有数组的形状:
import numpy as np for key, arr in loaded_data.items(): print(f"Key: {key}, 形状: {arr.shape}, 维度: {arr.ndim}")
重点确认两个关键点:
- 除
labels外的所有数据数组,样本数量是否和labels的长度一致 - 每个数据数组的特征维度是否统一,比如都是二维
(样本数, 特征数),还是存在三维的时序数据(样本数, 时间步, 特征数)
你现有方法的问题分析
- 第一种方法里的
new_shape属于硬编码,若没搞清楚原数组真实形状就强行reshape,必然出错;且concatenate的轴选择也可能不符合你的数据结构(是按样本轴拼接还是特征轴?) - 第二种方法逻辑错误:
loaded_data里的labels是单独存储的,你却把每个数组的最后一个元素当标签,完全不符合SEED-IV的数据集结构
正确处理步骤(适配MLP输入)
MLP要求输入是二维张量(样本数, 总特征数),针对SEED-IV的EEG数据,我们需要把可能存在的时序维度(三维数组)扁平化,再统一拼接特征,最后对齐标签:
import numpy as np import tensorflow as tf from sklearn.model_selection import train_test_split # 1. 处理所有特征数组,统一转为二维格式 x_features = [] for key in loaded_data.keys(): if key == 'labels': continue arr = loaded_data[key] # 如果是三维时序数据(样本数, 时间步, 特征数),扁平化特征维度 if arr.ndim == 3: flattened = arr.reshape(arr.shape[0], -1) # 合并时间步和特征数为一维 x_features.append(flattened) # 如果已经是二维(样本数, 特征数),直接加入列表 elif arr.ndim == 2: x_features.append(arr) else: raise ValueError(f"未知的数组维度:{key}的维度是{arr.ndim}") # 2. 拼接所有特征数组(注意:不同被试样本用axis=0;同一批样本的不同特征用axis=1) # 这里假设是同一批样本的多通道特征,按特征轴拼接 x = np.concatenate(x_features, axis=1) # 获取标签,确保是一维数组 y = loaded_data['labels'].flatten() # 3. 校验样本数是否匹配 assert x.shape[0] == y.shape[0], f"样本数不匹配:特征有{x.shape[0]}个,标签有{y.shape[0]}个" # 4. 转换为张量(分类任务标签用int32更合适) x_tensor = tf.convert_to_tensor(x, dtype=tf.float32) y_tensor = tf.convert_to_tensor(y, dtype=tf.int32) # 5. 划分训练测试集 x_train, x_test, y_train, y_test = train_test_split(x_tensor, y_tensor, test_size=0.2, random_state=42)
额外注意事项
- 如果
labels是二维数组(比如(样本数,1)),一定要用flatten()转成一维,否则后续训练会报错 - 如果不同数据数组的样本数不一致,说明预处理环节出了问题,得回到预处理步骤检查:是不是每个被试的样本都对应了正确数量的标签
- 若不想扁平化时序数据,也可以对每个时间步提取统计特征(比如均值、方差、最大值),再作为MLP的输入,这样能有效减少特征维度
内容的提问来源于stack exchange,提问作者Hamza Tehseen
相关产品推荐
相关产品推荐

