我正在训练一个通过面部运动检测情绪的情绪识别系统,我正在尝试训练一个4维矩阵。然而,sklearn不允许我训练矩阵。我正在做的是,我试图通过创建一组视频来对每种情绪进行分类
组成4D矩阵的功能:
视频数量(每个视频将被分配情感标签)
每个视频的帧数
每帧面部标志的方向
每帧的面部标志的速度
我正在尝试训练的实际功能矩阵:
左侧是速度(每帧相同面部标志之间的斜边)
右侧是方向(每帧同一面部标志的x和y值的弧度)
>> main.shape
(2, 17, 68, 2)
# 2 videos, 17 frames per video, 68 facial landmarks, 2 features (direction and speed)
>> main
array([[[[ 0. , 0. ],
[ 0. , 0. ],
[ 0. , 0. ],
...,
[ 0. , 0. ],
[ 0. , 0. ],
[ 0. , 0. ]],
[[-1. , -0. ],
[-1. , -0. ],
[-1. , -0. ],
...,
[ 0. , 0. ],
[ 1.41421356, 0.78539816],
[ 1. , 0. ]],
[[ 3.16227766, -1.24904577],
[ 2.23606798, -1.10714872],
[ 2.23606798, -1.10714872],
...,
[ 1.41421356, -0.78539816],
[-1.41421356, 0.78539816],
[-2. , -0. ]],
...,
[[-3.60555128, -0.5880026 ],
[-2.23606798, -0.46364761],
[-2.23606798, -0.46364761],
...,
[ 3. , 0. ],
[ 2.23606798, 0.46364761],
[ 0. , 0. ]],
[[ 2.82842712, -0.78539816],
[ 2.23606798, -1.10714872],
[ 2.23606798, -1.10714872],
...,
[ 1.41421356, 0.78539816],
[ 1. , 1. ],
[ 1. , 1. ]],
[[-1.41421356, 0.78539816],
[ 0. , 0. ],
[ 0. , 0. ],
...,
[-2.23606798, 1.10714872],
[-2.23606798, 1.10714872],
[ 2. , 1. ]]],
[[[ 0. , 0. ],
[ 0. , 0. ],
[ 0. , 0. ],
...,
[ 0. , 0. ],
[ 0. , 0. ],
[ 0. , 0. ]],
[[-1. , -0. ],
[-1. , -0. ],
[-1. , -0. ],
...,
[ 0. , 0. ],
[ 1.41421356, 0.78539816],
[ 1. , 0. ]],
[[ 3.16227766, -1.24904577],
[ 2.23606798, -1.10714872],
[ 2.23606798, -1.10714872],
...,
[ 1.41421356, -0.78539816],
[-1.41421356, 0.78539816],
[-2. , -0. ]],
...,
[[-3.60555128, -0.5880026 ],
[-2.23606798, -0.46364761],
[-2.23606798, -0.46364761],
...,
[ 3. , 0. ],
[ 2.23606798, 0.46364761],
[ 0. , 0. ]],
[[ 2.82842712, -0.78539816],
[ 2.23606798, -1.10714872],
[ 2.23606798, -1.10714872],
...,
[ 1.41421356, 0.78539816],
[ 1. , 1. ],
[ 1. , 1. ]],
[[-1.41421356, 0.78539816],
[ 0. , 0. ],
[ 0. , 0. ],
...,
[-2.23606798, 1.10714872],
[-2.23606798, 1.10714872],
[ 2. , 1. ]]]])
我从sklearn SVM得到的错误:
ValueError: Buffer has wrong number of dimensions (expected 2, got 4)
然后我试着玩一个更简单的3D矩阵,看看我是否能找到绕过它的方法,但它给了我同样的错误:
>>> from sklearn.svm import SVC
>>> model = SVC()
>>> features = np.array([[[1,2],[3,4]],[[8,9],[10,11]]])
>>> features.shape
(2, 2, 2)
>>> labels = [1,2]
>>> model.fit(features,labels)
ValueError: Buffer has wrong number of dimensions (expected 2, got 3)
其他sklearn算法(比如Naive Bayes)也给了我类似的错误,说它们只接受2D矩阵。
我认为问题不在于我的实现,而是SVM、Naive Bayes和其他ml算法通常无法处理超过2个维度的数据。
我试着在pybrain中使用神经网络,但我无法找到将矩阵输入pybrain神经网络的方法。
我想到了使用PCA或重建矩阵设计的可能性,但我更愿意保持这些特征和相同的维度,不要把它们搞砸。
有没有什么方法,机器学习算法或神经网络可以用来训练4D矩阵?
从您的示例中不清楚哪个是采样轴。但是sklearn中的训练可以这样做(如果第一个轴是你的样本轴):
model.fit(features.reshape(len(features), -1), labels)
知道任何sklearn分类器的4D结构都没有好处。为了确保简洁明了,整个软件包采用的标准是第一个矩阵维度列举示例,第二个矩阵维度列出特征。因此,在您的情况下,您需要将剩下的3个特征维度分解为一个长向量。