Форма ввода LSTM для данных спектрограммы

#tensorflow #machine-learning #keras #lstm #spectrogram

#tensorflow #машинное обучение #keras #lstm #спектрограмма

Вопрос:

У меня есть массив numpy в форме, n x t x f где n — количество спектрограмм, t — временные выборки и f — частотные выборки.

Это код:

 print(train.shape) # this would print (4431,399,101)

inputs = Input(shape=(399, 101))

encoded = LSTM(50, 
               activation="relu", 
               return_sequences=True)(inputs)
encoded = LSTM(25, 
               activation="relu", 
               return_sequences=False)(encoded)

decoded = RepeatVector(399)(encoded)
decoded = LSTM(50, 
               activation="relu", 
               return_sequences=True)(decoded)
decoded = LSTM(25, 
               return_sequences=True)(decoded)

autoencoder = Model(inputs, decoded)
encoder = Model(inputs, encoded)

autoencoder.compile(optimizer='adam', 
                    loss='mse',  
                    metrics=['acc'])

autoencoder.fit(train, train_labels, epochs=20, batch_size=32)
 

Это вызывает:

Ошибка InvalidArgumentError: несовместимые формы: [32,399,101] против [32,1]
[[node gradient_tape/mean_squared_error/BroadcastGradientArgs (определено в :1) ]] [Op:__вывод_поезд_функция_7304]

Я полагаю, что ошибка во входной форме, но я не понимаю причины.

Ответ №1:

Ваш ввод модели предполагает двумерный массив, а ваш входной массив отражает три измерения. Я думаю.

Комментарии:

1. Модели LSTM нуждаются в 3D-вводе (batch_size, time_samples, features). Размер пакета задается подходящей моделью, которая в основном представляет собой количество спектрограмм (обучающих выборок), используемых на одной итерации обучения, временные выборки составляют 399, а затем частоту следует рассматривать как характеристики. Так что я действительно не понимаю, что происходит не так

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

3. Я загрузил уменьшенную версию набора данных (первые десять образцов) на диске: ссылка . Он может быть загружен как поезд, чтобы иметь тот же эффект. Что касается меток, вы можете просто выполнить train_labels=np.array(диапазон (10))