0

Я тренирую систему распознавания эмоций, которая обнаруживает эмоции посредством движения лица, и у меня есть 4-мерная матрица, которую я пытаюсь тренировать. Тем не менее, sklearn не позволяет мне обучать матрицу. То, что я делаю то, что я пытаюсь классифицировать каждую эмоцию, создавая множество видеоПроблемы с подготовкой многомерных данных (4d numpy matrix) в sklearn и pybrain

Возможности, которые составляют матрицу 4D:
Количество видео (и каждое видео будет присвоен ярлык эмоции)
Количество кадров в видео
направления ориентиров лица в кадр
скорости ориентиров лица в кадр

фактическая матрица особенности, которую я пытаюсь поезд:
левая сторона скорость (гипотенуза между одной вехой лица каждой рамка)
Правая сторона направление (арктангенс из й и у значений одного и тот же ориентира для лица каждого кадра)

>> 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 (как наивные байесовский) дают мне подобные ошибки говоря, что они принимают только 2D-матрицы.

Я понял, что проблема заключается в том, что на самом деле не с моей реализацией, но что SVM, Naive Bayes и другие алгоритмы ml вообще не могут обрабатывать более двух измерений данных.

Я попытался обратиться к нейронным сетям в pybrain, но я не мог понять, как подать матрицу в нейронную сеть с пирамидами.

Я, хотя и имею возможность использовать PCA или реконструировать дизайн матрицы, но я бы предпочел сохранить эти функции и те же размеры, а не вмешиваться в них.

Есть ли способ, алгоритм машинного обучения или нейронная сеть, который я могу использовать для обучения 4D-матрицы?

+0

Как бы вы интерпретировали входной сигнал 4D матрицы? В 2D мы знаем, что строка - это наблюдение/экземпляр, тогда как столбцы - это функции. Как бы вы интерпретировали ваши другие два измерения? –

+0

Общим способом является преобразование 4D матрицы в 2D. Близким примером является подготовка алгоритма для распознавания изображений, где изображение имеет 3D (ширина, высота и цвет RGB-цвета). Чтобы подавать эту входную матрицу в sklearn algo, вы можете изменить ее на (ширина x высота) x 3-RGB-цвет. –

+0

Я рассматривал только объединение трех функций в один вектор, но проблема в том, что если бы я объединил свою матрицу функций (отредактированный пост, чтобы показать матрицу, которую я пытаюсь обучить), это просто испортило бы преимущество каждого отдельного значения функции и алгоритм ml имел бы действительно трудное время для понимания этих значений и не очень хорошо тренировался. – user3377126

ответ

0

Непонятно из вашего примера, который является осью выборки. Но обучение в sklearn можно сделать так (если первая ось вашей оси образца):

model.fit(features.reshape(len(features), -1), labels) 

Там нет никакой выгоды, зная структуру 4D для любых sklearn классификаторов. Принятый стандарт во всем пакете, чтобы обеспечить простоту и ясность, состоит в том, чтобы иметь первый размер матрицы, перечисляя примеры, а второй - функции. Таким образом, в вашем случае вам нужно расколоть 3 оставшихся габаритных размера в один длинный вектор.

+0

Я рассматривал только объединение трех функций в один вектор, но проблема в том, что если бы я объединил свою матрицу признаков (отредактированный пост, чтобы показать матрицу, которую я пытаюсь обучить), это просто испортило бы преимущество каждого отдельного значения функции и алгоритм ml имел бы действительно трудное время для понимания этих значений и не очень хорошо тренировался. – user3377126

+0

Например, я не могу объединить свои функции направления и скорости, потому что это испортит положительные и отрицательные знаки (где оба указывают, указывает ли точка на движущийся северо-восток, северо-запад, юго-восток или юго-запад от предыдущего должность). Любой умный способ объединения этих функций? – user3377126