ValueError: не удалось передать входной массив из формы (20,590) в форму (20)

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

Я просмотрел 2 других сообщения stackoverflow, однако они не решают мою проблему, потому что они слишком специфичны для определенной задачи.

ValueError: не удалось транслировать входной массив из формы (128,128,3) в форму (128,128)

Ошибка значения: могла не транслировать входной массив из формы (857,3) в форму (857)

Полное сообщение об ошибке:

Traceback (последний вызов последним): файл "/..../.../...../Batch_MFCC_Data.py", строка 68, в X = np.array (MFCCs) ValueError: не удалось передать входной массив из формы (20,590) в форму (20)

Пример кода:

all_wav_paths = glob.glob('directory_of_wav_files/**/*.wav', recursive=True)
np.random.shuffle(all_wav_paths)

MFCCs = [] #array to hold all MFCC's
labels = [] #array to hold all labels

for i, wav_path in enumerate(all_wav_paths):

    individual_MFCC = MFCC_from_wav(wav_path)
    #MFCC_from_wav() -> returns the MFCC coefficients 

    label = get_class(wav_path)
    #get_class() -> returns the label of the wav file either 0 or 1

    #add features and label to the array
    MFCCs.append(individual_MFCC)
    labels.append(label)

#Must convert the training data to a Numpy Array for 
#train_test_split and saving to local drive

X = np.array(MFCCs) #THIS LINE CRASHES WITH ABOVE ERROR

# binary encode labels
onehot_encoder = OneHotEncoder(sparse=False)
Y = onehot_encoder.fit_transform(labels)

#create train/test data
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(MFCCs, Y, test_size=0.25, random_state=0)

#saving data to local drive
np.save("LABEL_SAVE_PATH", Y)
np.save("TRAINING_DATA_SAVE_PATH", X)

Вот снимок формы MFCC (из файлов .wav) в массиве MFCC.

Массив MFCCs содержит следующие формы:

...More above...
(20, 423) #shape of returned MFCC from one of the .wav files
(20, 457)
(20, 1757)
(20, 345)
(20, 835)
(20, 345)
(20, 687)
(20, 774)
(20, 597)
(20, 719)
(20, 1195)
(20, 433)
(20, 728)
(20, 939)
(20, 345)
(20, 1112)
(20, 345)
(20, 591)
(20, 936)
(20, 1161)
....More below....

Как вы можете видеть, не все MFCC в массиве MFCC имеют одинаковую форму, и это связано с тем, что записи не имеют одинаковой продолжительности времени. Это причина, по которой я не могу преобразовать массив в массив numpy? Если это проблема, как мне исправить эту проблему, чтобы она имела одинаковую форму во всем массиве MFCC?

Мы будем очень благодарны за любые фрагменты кода для выполнения этого и советы!

Спасибо!


person Sreehari R    schedule 28.12.2017    source источник
comment
Итак, этот MFCCs = [] содержит только форму или сами массивы? Я имею в виду, что такое type(individual_MFCC), это массив или просто информация о форме?   -  person kmario23    schedule 28.12.2017
comment
Извините за путаницу, тип (Individual_MFCC) = ‹class 'numpy.ndarray'›   -  person Sreehari R    schedule 28.12.2017
comment
Да, проблема связана с несоответствием форм между различными массивами, как вы упомянули. У меня два вопроса: 1) всегда ли первое измерение имеет форму (20, ...), 2) вы знаете максимальный размер вашего массива?   -  person kmario23    schedule 28.12.2017
comment
@SreehariR Давайте будем немного минимальным, полным и проверяемым. Ваш список MFCCs (не массив!) Содержит элементы с именем individual_MFCC, и они np.array разной формы. Верный? Допустим, ваши два individual_MFCC - это np.array формы (20,424) и (20,457). Какую форму вы хотите получить, когда вы объедините их в список MFCCs и преобразуете в np.array?   -  person FatihAkici    schedule 28.12.2017
comment
@ kmario23 Хорошо, поэтому для (1) да, первое измерение всегда имеет форму (20, ....), и 2) я не знаю максимального размера моего массива.   -  person Sreehari R    schedule 28.12.2017
comment
@ kmario23, стоит ли мне определить для вас максимальный размер массива?   -  person Sreehari R    schedule 28.12.2017
comment
@SreehariR Понятно. Кроме того, изменится ли ваш алгоритм обучения, если мы изменим размер всех ваших массивов до фиксированного размера (потому что нам нужна фиксированная форма для создания массива) и заполним отсутствующие значения zeros. Кроме того, да, определение максимального размера должно быть очень полезным   -  person kmario23    schedule 28.12.2017
comment
@ kmario23 Да, я думал об этом, но не знал, как это повлияет на мой тренировочный алгоритм. Я планирую для начала использовать SVM, KNN и логистическую регрессию.   -  person Sreehari R    schedule 28.12.2017
comment
@ kmario23 Хорошо, сейчас я просматриваю данные и нахожу максимальный размер   -  person Sreehari R    schedule 28.12.2017
comment
Хорошо, есть две возможности: 1) принять наименьшую возможную форму, например. (20, 345) из вашего примера, а затем сделайте все массивы такой формы (т.е. отбросьте оставшиеся столбцы). 2) Измените форму массивов до максимальной формы, т.е. заполните необходимые столбцы значениями zeros или nan. однако я думаю, что первый подход должен быть хорош. Тогда можно складывать массивы   -  person kmario23    schedule 28.12.2017
comment
@ kmario23 В любом случае смогу ли я использовать list.reshape (20, 345) или list.reshape (20, MAX_Value)? Заполнит ли команда reshape дополнительные значения 0?   -  person Sreehari R    schedule 28.12.2017
comment
@SreehariR добавил образец ответа. Посмотри!   -  person kmario23    schedule 28.12.2017
comment
@ kmario23 Спасибо за пример! Небольшой вопрос. Я собираюсь сравнить эффективность использования max_shape и min_shape. Итак, чтобы добавить все нули к каждому индексу, могу ли я использовать следующую логику: MFCCs [idx] = arr [:,: max_shape [1]]?   -  person Sreehari R    schedule 28.12.2017


Ответы (1)


Используйте следующую логику, чтобы уменьшить размер массивов до min_shape, т.е. уменьшить массивы большего размера до min_shape

min_shape = (20, 345)
MFCCs = [arr1, arr2, arr3, ...]    

for idx, arr in enumerate(MFCCs):
    MFCCs[idx] = arr[:, :min_shape[1]]

batch_arr = np.array(MFCCs)

И затем вы можете складывать эти массивы в пакетный массив, как в приведенном ниже минимальном примере:

In [33]: a1 = np.random.randn(2, 3)    
In [34]: a2 = np.random.randn(2, 5)    
In [35]: a3 = np.random.randn(2, 10)

In [36]: MFCCs = [a1, a2, a3]

In [37]: min_shape = (2, 2)

In [38]: for idx, arr in enumerate(MFCCs):
    ...:     MFCCs[idx] = arr[:, :min_shape[1]]
    ...:     

In [42]: batch_arr = np.array(MFCCs)

In [43]: batch_arr.shape
Out[43]: (3, 2, 2)

Теперь для второй стратегии, чтобы увеличить массивы меньших массивов до max_shape, следуйте аналогичной логике, но заполните отсутствующие значения либо нулями, либо значениями nan по своему усмотрению.

И опять же, вы можете складывать массивы как пакетный массив формы (num_arrays, dim1, dim2); Итак, для вашего случая форма должна быть (num_wav_files, 20, max_column)

person kmario23    schedule 28.12.2017