Вопрос или проблема
Я пытаюсь воспроизвести самую базовую версию этого примера Google LEAF. У меня возникли проблемы с загрузкой набора данных команд речи в Tensorflow. Я загружаю наборы данных как TFRecord:
tfds.load('speech_commands', download='true', shuffle_files="false")
Затем я применяю эту функцию предварительной обработки к наборам данных для обучения, тестирования и оценки:
def preprocess(sample):
audio = sample['audio']
label = sample['label']
audio = tf.cast(audio, tf.float32) / tf.int16.max
return audio, label
После этого я создаю свою модель и пытаюсь обучаться на наборе данных для обучения:
#Модель из leaf_audio/models
model = models.AudioClassifier(num_outputs=12)
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
model.compile(loss=loss_fn, optimizer = tf.keras.optimizers.Adam(1e-4), metrics=['sparse_categorical_accuracy'])
model.fit(train_dataset, batch_size=None, epochs=10)
При обучении я получаю ошибку в слое Audio Classifier:
ValueError: Исключение возникло при вызове слоя “sequential” (тип Sequential). Вход 0 слоя “global_max_pooling2d” несовместим со слоем: ожидалось ndim=4, найден ndim=2. Полная форма: (None, 16000)
Я думаю, что это связано с тем, что я неправильно загружаю данные, однако я следовал примеру до строки в каждом из этапов загрузки.
Для полного кода, пожалуйста, перейдите по ссылке.
Проблема заключалась в том, что входной тензор (‘audio’) не предоставляет достаточно измерений для использования аудиоклассификатором.
Решение заключается в добавлении дополнительных измерений, используя эту строку в конце функции предварительной обработки:
audio = audio[tf.newaxis, tf.newaxis, :]
Ответ или решение
Ошибка загрузки и обучения на датасете "Speech Commands" в TensorFlow
Загрузка и обучение моделей на основе аудиоданных могут представлять определенные сложности, особенно при работе с высокоуровневыми библиотеками, такими как TensorFlow. В этом ответе мы рассмотрим распространенную проблему, связанную с загрузкой и предварительной обработкой датасета "Speech Commands", а также представим решение, которое позволит устранить возникшую ошибку.
Описание проблемы
При попытке обучить модель, основанную на примере из репозитория Google LEAF, вы столкнулись с ошибкой:
ValueError: Exception encountered when calling layer "sequential" (type Sequential).
Input 0 of layer "global_max_pooling2d" is incompatible with the layer: expected ndim=4, found ndim=2. Full shape received: (None, 16000)
Эта ошибка появляется на этапе обучения модели, когда входной тензор (‘audio’) не имеет необходимого количества измерений, необходимых для обработки в слое global_max_pooling2d
. Для корректной работы этот слой ожидает 4D тензор, но получает 2D тензор из-за некорректной обработки аудиоданных.
Решение
Чтобы решить эту проблему, необходимо модифицировать функцию предобработки данных. Ваша исходная функция preprocess
выглядит следующим образом:
def preprocess(sample):
audio = sample['audio']
label = sample['label']
audio = tf.cast(audio, tf.float32) / tf.int16.max
return audio, label
В этом коде аудиоданные имеют форму (None, 16000)
, которая является 2D тензором. Для правильной передачи этих данных в модель, необходимо добавить дополнительные измерения. Конкретно, мы можем сделать это, добавив два новых измерения в конце операции с аудио. Модифицированная версия функции preprocess
должна выглядеть следующим образом:
def preprocess(sample):
audio = sample['audio']
label = sample['label']
audio = tf.cast(audio, tf.float32) / tf.int16.max
audio = audio[tf.newaxis, tf.newaxis, :] # Добавление новых измерений
return audio, label
Теперь после этой модификации функция возвращает аудиоданные в форме 4D тензора, которая подходит для обработки слоем global_max_pooling2d
.
Обучение модели
После внесения изменений в функцию предобработки, вы можете продолжить с созданием и обучением вашей модели, используя следующие строки кода:
model = models.AudioClassifier(num_outputs=12)
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
model.compile(loss=loss_fn, optimizer=tf.keras.optimizers.Adam(1e-4), metrics=['sparse_categorical_accuracy'])
model.fit(train_dataset, batch_size=None, epochs=10)
Эти шаги должны исправить возникшую ошибку, и ваш процесс обучения сможет завершиться успешно.
Заключение
Работа с аудиоданными в TensorFlow требует особого внимания к формату и размерности тензоров. Мы рассмотрели, как конкретная ошибка возникает из-за недостаточного количества измерений в входных данных и предложили решение, которое поможет вам правильно настроить предобработку данных. Подобные проблемы часто встречаются при работе с различными типами данных, и умение быстро их диагностировать и исправлять — ключ к успешному обучению моделей.